Hex Artifact Content

Artifact edf097489b918aea8aacd7f2bb3c271a712658ed:


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 23 20 20 20 20 64  time = 0;.#    d
1760: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1770: 55 47 5f 50 52 49 4e 54 54 49 4d 45 20 7b 20 69  UG_PRINTTIME { i
1780: 66 20 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  f (cackey_debug_
1790: 73 74 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29  start_time == 0)
17a0: 20 7b 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f   { cackey_debug_
17b0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17c0: 65 28 4e 55 4c 4c 29 3b 20 7d 3b 20 66 70 72 69  e(NULL); }; fpri
17d0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
17e0: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 22  _fd(), "[%lu]: "
17f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1800: 29 20 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20  ) (time(NULL) - 
1810: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61  cackey_debug_sta
1820: 72 74 5f 74 69 6d 65 29 29 3b 20 7d 0a 23 20 20  rt_time)); }.#  
1830: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65  else.#    define
1840: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1850: 49 4e 54 54 49 4d 45 20 2f 2a 2a 2f 0a 23 20 20  INTTIME /**/.#  
1860: 65 6e 64 69 66 0a 0a 23 20 20 64 65 66 69 6e 65  endif..#  define
1870: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1880: 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20 43 41 43  INTF(x...) { CAC
1890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
18a0: 49 4d 45 3b 20 66 70 72 69 6e 74 66 28 63 61 63  IME; fprintf(cac
18b0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
18c0: 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66  "%s():%i: ", __f
18d0: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
18e0: 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ; fprintf(cackey
18f0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 78 29 3b  _debug_fd(), x);
1900: 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f   fprintf(cackey_
1910: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22  debug_fd(), "\n"
1920: 29 3b 20 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ); fflush(cackey
1930: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a  _debug_fd()); }.
1940: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1950: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
1960: 66 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67  f, x, y) { unsig
1970: 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46  ned char *TMPBUF
1980: 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ; unsigned long 
1990: 69 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75  idx; TMPBUF = (u
19a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
19b0: 28 78 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55  (x); CACKEY_DEBU
19c0: 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72  G_PRINTTIME; fpr
19d0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
19e0: 67 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69  g_fd(), "%s():%i
19f0: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1a00: 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f  {%02x", __func__
1a10: 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23  , __LINE__, f, #
1a20: 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
1a30: 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46 5b 30  g) (y), TMPBUF[0
1a40: 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d 20 31  ]); for (idx = 1
1a50: 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69 64 78  ; idx < (y); idx
1a60: 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28 63 61  ++) { fprintf(ca
1a70: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1a80: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1a90: 46 5b 69 64 78 5d 29 3b 20 7d 3b 20 66 70 72 69  F[idx]); }; fpri
1aa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1ab0: 5f 66 64 28 29 2c 20 22 7d 29 5c 6e 22 29 3b 20  _fd(), "})\n"); 
1ac0: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1ad0: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1ae0: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
1af0: 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b 20  BUG_PERROR(x) { 
1b00: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
1b10: 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29  ebug_fd(), "%s()
1b20: 3a 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f  :%i: ", __func__
1b30: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 43 41 43  , __LINE__); CAC
1b40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
1b50: 49 4d 45 3b 20 70 65 72 72 6f 72 28 78 29 3b 20  IME; perror(x); 
1b60: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1b70: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1b80: 64 65 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b  define free(x) {
1b90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1ba0: 49 4e 54 46 28 22 46 52 45 45 28 25 70 29 20 28  INTF("FREE(%p) (
1bb0: 25 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 78  %s)", (void *) x
1bc0: 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20  , #x); free(x); 
1bd0: 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  }..static FILE *
1be0: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1bf0: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20  void) {..static 
1c00: 46 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b  FILE *fd = NULL;
1c10: 0a 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b  ..char *logfile;
1c20: 0a 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c  ...if (fd != NUL
1c30: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64  L) {...return(fd
1c40: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c  );..}.../*.. * L
1c50: 6f 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69  og to stderr ini
1c60: 74 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e  tially so we can
1c70: 20 75 73 65 20 64 65 62 75 67 67 69 6e 67 20 77   use debugging w
1c80: 69 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66  ithin.. * this f
1c90: 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20  unction without 
1ca0: 67 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20  getting into an 
1cb0: 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20  infinite loop.. 
1cc0: 2a 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b  */..fd = stderr;
1cd0: 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74  ...logfile = get
1ce0: 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55  env("CACKEY_DEBU
1cf0: 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66  G_LOGFILE");..if
1d00: 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c   (logfile != NUL
1d10: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1d20: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1d30: 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
1d40: 72 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67  riable: %s", log
1d50: 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c  file);....logfil
1d60: 65 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69  e = strchr(logfi
1d70: 6c 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28  le, '=');...if (
1d80: 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29  logfile == NULL)
1d90: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20   {....logfile = 
1da0: 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
1db0: 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a  EBUG_LOGFILE");.
1dc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f  ..} else {....lo
1dd0: 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  gfile++;...}..}.
1de0: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d  ..if (logfile !=
1df0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1e00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e10: 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20  Found log file: 
1e20: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1e30: 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67  ..fd = fopen(log
1e40: 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a  file, "a");..}..
1e50: 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29  .if (fd == NULL)
1e60: 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72   {...fd = stderr
1e70: 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d  ;..}...if (fd ==
1e80: 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43   stderr) {...CAC
1e90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ea0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65  ("Returning stde
1eb0: 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  rr");..} else {.
1ec0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ed0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ee0: 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29 20 66   %p", (void *) f
1ef0: 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  d);..}...return(
1f00: 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  fd);.}..static v
1f10: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
1f20: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69  G_FUNC_MALLOC(si
1f30: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74  ze_t size, const
1f40: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74   char *func, int
1f50: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a   line) {..void *
1f60: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
1f70: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b   = malloc(size);
1f80: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f90: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69  PRINTTIME;..fpri
1fa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1fb0: 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a  _fd(), "%s():%i:
1fc0: 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b   ", func, line);
1fd0: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
1fe0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 4d 41  _debug_fd(), "MA
1ff0: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
2000: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
2010: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2020: 29 2c 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73  ), "\n");..fflus
2030: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  h(cackey_debug_f
2040: 64 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  d());...return(r
2050: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
2060: 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44  c void *CACKEY_D
2070: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
2080: 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a  C(void *ptr, siz
2090: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
20a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
20b0: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
20c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
20d0: 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73  = realloc(ptr, s
20e0: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76  ize);...if (retv
20f0: 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 43  al != ptr) {...C
2100: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2110: 54 54 49 4d 45 3b 0a 09 09 66 70 72 69 6e 74 66  TTIME;...fprintf
2120: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
2130: 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  (), "%s():%i: ",
2140: 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 09   func, line);...
2150: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2160: 65 62 75 67 5f 66 64 28 29 2c 20 22 52 45 41 4c  ebug_fd(), "REAL
2170: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70  LOC(%p) = %p", p
2180: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66  tr, retval);...f
2190: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
21a0: 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b  bug_fd(), "\n");
21b0: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
21c0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
21d0: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
21e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
21f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2200: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
2210: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2220: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2230: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2240: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2250: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2260: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
2270: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2280: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
2290: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
22a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
22b0: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
22c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
22d0: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
22e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22f0: 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 6e 74  INTTIME;..fprint
2300: 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  f(cackey_debug_f
2310: 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22  d(), "%s():%i: "
2320: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09  , func, line);..
2330: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2340: 65 62 75 67 5f 66 64 28 29 2c 20 22 53 54 52 44  ebug_fd(), "STRD
2350: 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  UP_MALLOC() = %p
2360: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72  ", retval);..fpr
2370: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
2380: 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b 0a 09  g_fd(), "\n");..
2390: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
23a0: 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74  bug_fd());...ret
23b0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
23c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
23d0: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
23e0: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61  unsigned char ta
2400: 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61  g) {..switch (ta
2410: 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49  g) {...case GSCI
2420: 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09  S_TAG_CARDID:...
2430: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2440: 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63  AG_CARDID");...c
2450: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43  ase GSCIS_TAG_CC
2460: 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  C_VER:....return
2470: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  ("GSCIS_TAG_CCC_
2480: 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  VER");...case GS
2490: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a  CIS_TAG_CCG_VER:
24a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
24b0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b  S_TAG_CCG_VER");
24c0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
24d0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65  G_CARDURL:....re
24e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
24f0: 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73  CARDURL");...cas
2500: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
2510: 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  15:....return("G
2520: 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22  SCIS_TAG_PKCS15"
2530: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2540: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
2550: 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  EL:....return("G
2560: 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54  SCIS_TAG_REG_DAT
2570: 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73  A_MODEL");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
2590: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
25a0: 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  ("GSCIS_TAG_ACR_
25b0: 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  TABLE");...case 
25c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25d0: 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  PDU:....return("
25e0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25f0: 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  PDU");...case GS
2600: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
2610: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
2620: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
2630: 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20  CTION");...case 
2640: 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09  GSCIS_TAG_CT:...
2650: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2660: 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_CT");...case 
2670: 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09  GSCIS_TAG_ST:...
2680: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2690: 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_ST");...case 
26a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
26b0: 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  C:....return("GS
26c0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22  CIS_TAG_NEXTCCC"
26d0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
26e0: 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_FNAME:....re
26f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2700: 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  FNAME");...case 
2710: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a  GSCIS_TAG_MNAME:
2720: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2730: 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09  S_TAG_MNAME");..
2740: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2750: 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e  LNAME:....return
2760: 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  ("GSCIS_TAG_LNAM
2770: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2780: 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09  S_TAG_SUFFIX:...
2790: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
27a0: 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63  AG_SUFFIX");...c
27b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ase GSCIS_TAG_GO
27c0: 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65  VT_AGENCY:....re
27d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
27e0: 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09  GOVT_AGENCY");..
27f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2800: 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72  BUREAU:....retur
2810: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52  n("GSCIS_TAG_BUR
2820: 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  EAU");...case GS
2830: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
2840: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2850: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
2860: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
2870: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
2880: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2890: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
28a0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
28b0: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09  CIS_TAG_TITLE:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28d0: 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63  TAG_TITLE");...c
28e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
28f0: 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72  ILDING:....retur
2900: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49  n("GSCIS_TAG_BUI
2910: 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20  LDING");...case 
2920: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2930: 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72  _ADDR1:....retur
2940: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2950: 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63  ICE_ADDR1");...c
2960: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2970: 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72  FICE_ADDR2:....r
2980: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2990: 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b  _OFFICE_ADDR2");
29a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29b0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09  G_OFFICE_CITY:..
29c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
29d0: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22  TAG_OFFICE_CITY"
29e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
29f0: 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45  TAG_OFFICE_STATE
2a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2a10: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54  IS_TAG_OFFICE_ST
2a20: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
2a30: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a  CIS_TAG_OFFICE_Z
2a40: 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IP:....return("G
2a50: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2a60: 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ZIP");...case GS
2a70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2a80: 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72  OUNTRY:....retur
2a90: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2aa0: 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09  ICE_COUNTRY");..
2ab0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ac0: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09  OFFICE_PHONE:...
2ad0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2ae0: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22  AG_OFFICE_PHONE"
2af0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2b00: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2b10: 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  _EXT:....return(
2b20: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b30: 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09  E_PHONE_EXT");..
2b40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b50: 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72  OFFICE_FAX:....r
2b60: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b70: 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09  _OFFICE_FAX");..
2b80: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b90: 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09  OFFICE_EMAIL:...
2ba0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2bb0: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22  AG_OFFICE_EMAIL"
2bc0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bd0: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a  TAG_OFFICE_ROOM:
2be0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2bf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
2c00: 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  M");...case GSCI
2c10: 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45  S_TAG_NONGOV_AGE
2c20: 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NCY:....return("
2c30: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2c40: 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73  _AGENCY");...cas
2c50: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  e GSCIS_TAG_SSN_
2c60: 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72  DESIGNATOR:....r
2c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2c80: 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22  _SSN_DESIGNATOR"
2c90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ca0: 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75  TAG_SSN:....retu
2cb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53  rn("GSCIS_TAG_SS
2cc0: 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  N");...case GSCI
2cd0: 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65  S_TAG_DOB:....re
2ce0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2cf0: 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DOB");...case GS
2d00: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a  CIS_TAG_GENDER:.
2d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d20: 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09  _TAG_GENDER");..
2d30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d40: 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  USERID:....retur
2d50: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45  n("GSCIS_TAG_USE
2d60: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2d70: 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a  CIS_TAG_DOMAIN:.
2d80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d90: 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09  _TAG_DOMAIN");..
2da0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2db0: 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74  PASSWORD:....ret
2dc0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50  urn("GSCIS_TAG_P
2dd0: 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73  ASSWORD");...cas
2de0: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2df0: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2e00: 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45  "GSCIS_TAG_ISSUE
2e10: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2e20: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09  CIS_TAG_SERNO:..
2e30: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2e40: 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63  TAG_SERNO");...c
2e50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
2e60: 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  SUE_DATE:....ret
2e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2e80: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2e90: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58  ase GSCIS_TAG_EX
2ea0: 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  PIRE_DATE:....re
2eb0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2ec0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
2ed0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ee0: 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65  CARD_TYPE:....re
2ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2f00: 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63  CARD_TYPE");...c
2f10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ase GSCIS_TAG_SE
2f20: 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09  CURITY_CODE:....
2f30: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f40: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22  G_SECURITY_CODE"
2f50: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2f60: 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a  TAG_CARDID_AID:.
2f70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2f80: 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22  _TAG_CARDID_AID"
2f90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2fa0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
2fb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2fc0: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
2fd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2fe0: 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45  S_TAG_CERT_ISSUE
2ff0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
3000: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  ("GSCIS_TAG_CERT
3010: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
3020: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
3030: 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45  CERT_EXPIRE_DATE
3040: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3050: 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49  IS_TAG_CERT_EXPI
3060: 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09  RE_DATE");..}...
3070: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22  return("UNKNOWN"
3080: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  );.}..static con
3090: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f  st char *CACKEY_
30a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
30b0: 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20  ERR_TO_STR(LONG 
30c0: 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74  retcode) {..swit
30d0: 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09  ch (retcode) {..
30e0: 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55  .case SCARD_S_SU
30f0: 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e  CCESS:....return
3100: 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  ("SCARD_S_SUCCES
3110: 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  S");...case SCAR
3120: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09  D_E_CANCELLED:..
3130: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3140: 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09  E_CANCELLED");..
3150: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
3160: 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72  NT_DISPOSE:....r
3170: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3180: 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09  ANT_DISPOSE");..
3190: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
31a0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
31b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
31c0: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45  ARD_E_INSUFFICIE
31d0: 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63  NT_BUFFER");...c
31e0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
31f0: 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75  LID_ATR:....retu
3200: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
3210: 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73  LID_ATR");...cas
3220: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
3230: 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74  D_HANDLE:....ret
3240: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
3250: 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09  ALID_HANDLE");..
3260: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
3270: 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a  VALID_PARAMETER:
3280: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3290: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41  D_E_INVALID_PARA
32a0: 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20  METER");...case 
32b0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
32c0: 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72  TARGET:....retur
32d0: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
32e0: 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63  ID_TARGET");...c
32f0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3300: 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65  LID_VALUE:....re
3310: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3320: 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09  VALID_VALUE");..
3330: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3340: 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75  _MEMORY:....retu
3350: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  rn("SCARD_E_NO_M
3360: 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20  EMORY");...case 
3370: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
3380: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
3390: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
33a0: 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  WN_READER");...c
33b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45  ase SCARD_E_TIME
33c0: 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OUT:....return("
33d0: 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22  SCARD_E_TIMEOUT"
33e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
33f0: 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54  E_SHARING_VIOLAT
3400: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
3410: 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f  SCARD_E_SHARING_
3420: 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63  VIOLATION");...c
3430: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  ase SCARD_E_NO_S
3440: 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74  MARTCARD:....ret
3450: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f  urn("SCARD_E_NO_
3460: 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63  SMARTCARD");...c
3470: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3480: 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  OWN_CARD:....ret
3490: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
34a0: 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63  NOWN_CARD");...c
34b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ase SCARD_E_PROT
34c0: 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72  O_MISMATCH:....r
34d0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50  eturn("SCARD_E_P
34e0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b  ROTO_MISMATCH");
34f0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3500: 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65  NOT_READY:....re
3510: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3520: 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73  T_READY");...cas
3530: 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  e SCARD_E_SYSTEM
3540: 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72  _CANCELLED:....r
3550: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53  eturn("SCARD_E_S
3560: 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22  YSTEM_CANCELLED"
3570: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3580: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44  E_NOT_TRANSACTED
3590: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
35a0: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
35b0: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
35c0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41  ARD_E_READER_UNA
35d0: 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74  VAILABLE:....ret
35e0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
35f0: 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22  DER_UNAVAILABLE"
3600: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3610: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
3620: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3630: 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54  CARD_W_UNSUPPORT
3640: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
3650: 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50  e SCARD_W_UNRESP
3660: 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09  ONSIVE_CARD:....
3670: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3680: 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52  UNRESPONSIVE_CAR
3690: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
36a0: 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41  D_W_UNPOWERED_CA
36b0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
36c0: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
36d0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
36e0: 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41  SCARD_W_RESET_CA
36f0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3700: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
3710: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3720: 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44  D_W_REMOVED_CARD
3730: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3740: 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52  RD_W_REMOVED_CAR
3750: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3760: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
3770: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  L:....return("SC
3780: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
3790: 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ALL");...case SC
37a0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53  ARD_E_READER_UNS
37b0: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
37c0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
37d0: 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  DER_UNSUPPORTED"
37e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
37f0: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
3800: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
3810: 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45  CARD_E_DUPLICATE
3820: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
3830: 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  e SCARD_E_CARD_U
3840: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
3850: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3860: 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  ARD_UNSUPPORTED"
3870: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3880: 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09  E_NO_SERVICE:...
3890: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
38a0: 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09  _NO_SERVICE");..
38b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45  .case SCARD_E_SE
38c0: 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09  RVICE_STOPPED:..
38d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38e0: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
38f0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3900: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_E_UNSUPPORTED_
3910: 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75  FEATURE:....retu
3920: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55  rn("SCARD_E_UNSU
3930: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22  PPORTED_FEATURE"
3940: 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f  );.#ifdef SCARD_
3950: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a  W_INSERTED_CARD.
3960: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49  ..case SCARD_W_I
3970: 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09  NSERTED_CARD:...
3980: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57  .return("SCARD_W
3990: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29  _INSERTED_CARD")
39a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
39b0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45  SCARD_E_NO_READE
39c0: 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63  RS_AVAILABLE...c
39d0: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  ase SCARD_E_NO_R
39e0: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
39f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a00: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f  RD_E_NO_READERS_
3a10: 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e  AVAILABLE");.#en
3a20: 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  dif..}...return(
3a30: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
3a40: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3a50: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3a60: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
3a70: 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29  (uint16_t objid)
3a80: 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69   {..switch (obji
3a90: 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30  d) {...case 0x20
3aa0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3ab0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3ac0: 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09  GENERALINFO");..
3ad0: 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09  .case 0x2100:...
3ae0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3af0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
3b00: 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  SONALINFO");...c
3b10: 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72  ase 0x3000:....r
3b20: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3b30: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
3b40: 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20  NTROL");...case 
3b50: 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x4000:....retur
3b60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3b70: 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63  JID_LOGIN");...c
3b80: 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72  ase 0x5000:....r
3b90: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3ba0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
3bb0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30  ");...case 0x600
3bc0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3bd0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42  CKEY_TLV_OBJID_B
3be0: 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63  IOMETRICS");...c
3bf0: 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72  ase 0x7000:....r
3c00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c10: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53  V_OBJID_DIGITALS
3c20: 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65  IGCERT");...case
3c30: 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75   0x0200:....retu
3c40: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3c50: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22  BJID_CAC_PERSON"
3c60: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 32  );...case 0x0202
3c70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3c80: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3c90: 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  C_BENEFITS");...
3ca0: 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09  case 0x0203:....
3cb0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3cc0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
3cd0: 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  ERBENEFITS");...
3ce0: 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09  case 0x0201:....
3cf0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3d00: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d10: 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65  SONNEL");...case
3d20: 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75   0x02FE:....retu
3d30: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3d40: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
3d50: 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e  ");..}....return
3d60: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a  ("UNKNOWN");.}..
3d70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3d80: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
3d90: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
3da0: 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74  STR(uint8_t appt
3db0: 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28  ype) {..switch (
3dc0: 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73  apptype) {...cas
3dd0: 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72  e 0x00:....retur
3de0: 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73  n("NONE");...cas
3df0: 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72  e 0x01:....retur
3e00: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e10: 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63  P_GENERIC");...c
3e20: 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74  ase 0x02:....ret
3e30: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3e40: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
3e50: 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72  e 0x03:....retur
3e60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e70: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
3e80: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29  EY_TLV_APP_SKI")
3e90: 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09  ;...case 0x04:..
3ea0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3eb0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
3ec0: 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09  ..case 0x05:....
3ed0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3ee0: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3ef0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3f00: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  PKI");...case 0x
3f10: 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  06:....return("C
3f20: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
3f30: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
3f40: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_PKI");...case
3f50: 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e   0x07:....return
3f60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3f70: 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45  _GENERIC | CACKE
3f80: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20  Y_TLV_APP_SKI | 
3f90: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3fa0: 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  KI");..}...retur
3fb0: 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a  n("INVALID");.}.
3fc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3fd0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3fe0: 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f  _FUNC_ATTRIBUTE_
3ff0: 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 42  TO_STR(CK_ATTRIB
4000: 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 20 7b  UTE_TYPE attr) {
4010: 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 29 20  ..switch (attr) 
4020: 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  {...case CKA_CLA
4030: 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SS:....return("C
4040: 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 61  KA_CLASS");...ca
4050: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
4060: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b  .return("CKA_TOK
4070: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
4080: 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 65 74  _PRIVATE:....ret
4090: 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45  urn("CKA_PRIVATE
40a0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c  ");...case CKA_L
40b0: 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABEL:....return(
40c0: 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09  "CKA_LABEL");...
40d0: 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 41  case CKA_APPLICA
40e0: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  TION:....return(
40f0: 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e  "CKA_APPLICATION
4100: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4110: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
4120: 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09  "CKA_VALUE");...
4130: 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f  case CKA_OBJECT_
4140: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ID:....return("C
4150: 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a  KA_OBJECT_ID");.
4160: 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
4170: 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
4180: 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 54  return("CKA_CERT
4190: 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 3b 0a  IFICATE_TYPE");.
41a0: 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
41b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
41c0: 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  A_ISSUER");...ca
41d0: 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  se CKA_SERIAL_NU
41e0: 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  MBER:....return(
41f0: 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42  "CKA_SERIAL_NUMB
4200: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4210: 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 72  _AC_ISSUER:....r
4220: 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53  eturn("CKA_AC_IS
4230: 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  SUER");...case C
4240: 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74  KA_OWNER:....ret
4250: 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29  urn("CKA_OWNER")
4260: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 54 54  ;...case CKA_ATT
4270: 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 74 75  R_TYPES:....retu
4280: 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 50  rn("CKA_ATTR_TYP
4290: 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ES");...case CKA
42a0: 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 65 74  _TRUSTED:....ret
42b0: 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 44  urn("CKA_TRUSTED
42c0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b  ");...case CKA_K
42d0: 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  EY_TYPE:....retu
42e0: 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45  rn("CKA_KEY_TYPE
42f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4300: 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 72  UBJECT:....retur
4310: 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 29  n("CKA_SUBJECT")
4320: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a  ;...case CKA_ID:
4330: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4340: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ID");...case CKA
4350: 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72  _SENSITIVE:....r
4360: 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49  eturn("CKA_SENSI
4370: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
4380: 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 72  KA_ENCRYPT:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59  eturn("CKA_ENCRY
43a0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PT");...case CKA
43b0: 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 65 74  _DECRYPT:....ret
43c0: 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 54  urn("CKA_DECRYPT
43d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 57  ");...case CKA_W
43e0: 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  RAP:....return("
43f0: 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 61  CKA_WRAP");...ca
4400: 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09  se CKA_UNWRAP:..
4410: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e  ..return("CKA_UN
4420: 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43  WRAP");...case C
4430: 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 75  KA_SIGN:....retu
4440: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a  rn("CKA_SIGN");.
4450: 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f  ..case CKA_SIGN_
4460: 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75  RECOVER:....retu
4470: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43  rn("CKA_SIGN_REC
4480: 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  OVER");...case C
4490: 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 65  KA_VERIFY:....re
44a0: 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59  turn("CKA_VERIFY
44b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
44c0: 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09  ERIFY_RECOVER:..
44d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
44e0: 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a  RIFY_RECOVER");.
44f0: 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 49 56  ..case CKA_DERIV
4500: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4510: 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 63 61  A_DERIVE");...ca
4520: 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 54  se CKA_START_DAT
4530: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4540: 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 3b 0a  A_START_DATE");.
4550: 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44  ..case CKA_END_D
4560: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4570: 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a  CKA_END_DATE");.
4580: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
4590: 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  US:....return("C
45a0: 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09  KA_MODULUS");...
45b0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
45c0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
45d0: 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49  ("CKA_MODULUS_BI
45e0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
45f0: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4600: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4610: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4620: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4630: 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a  RIVATE_EXPONENT:
4640: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4650: 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54  PRIVATE_EXPONENT
4660: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4670: 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 72  RIME_1:....retur
4680: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29  n("CKA_PRIME_1")
4690: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
46a0: 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  ME_2:....return(
46b0: 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a  "CKA_PRIME_2");.
46c0: 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e  ..case CKA_EXPON
46d0: 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e  ENT_1:....return
46e0: 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31  ("CKA_EXPONENT_1
46f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4700: 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65  XPONENT_2:....re
4710: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
4720: 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_2");...case C
4730: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a  KA_COEFFICIENT:.
4740: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43  ...return("CKA_C
4750: 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 09  OEFFICIENT");...
4760: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a  case CKA_PRIME:.
4770: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
4780: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
4790: 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 09  KA_SUBPRIME:....
47a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 50  return("CKA_SUBP
47b0: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
47c0: 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 75  KA_BASE:....retu
47d0: 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a  rn("CKA_BASE");.
47e0: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
47f0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4800: 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53  ("CKA_PRIME_BITS
4810: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4820: 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09  UB_PRIME_BITS:..
4830: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
4840: 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a  B_PRIME_BITS");.
4850: 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45  ..case CKA_VALUE
4860: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4870: 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53  ("CKA_VALUE_BITS
4880: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4890: 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74  ALUE_LEN:....ret
48a0: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c  urn("CKA_VALUE_L
48b0: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
48c0: 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09  _EXTRACTABLE:...
48d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 54  .return("CKA_EXT
48e0: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
48f0: 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09  se CKA_LOCAL:...
4900: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43  .return("CKA_LOC
4910: 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  AL");...case CKA
4920: 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42  _NEVER_EXTRACTAB
4930: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  LE:....return("C
4940: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54  KA_NEVER_EXTRACT
4950: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43  ABLE");...case C
4960: 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54  KA_ALWAYS_SENSIT
4970: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
4980: 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49  CKA_ALWAYS_SENSI
4990: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
49a0: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41  KA_KEY_GEN_MECHA
49b0: 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28  NISM:....return(
49c0: 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43  "CKA_KEY_GEN_MEC
49d0: 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 65  HANISM");...case
49e0: 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
49f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4a00: 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 09  MODIFIABLE");...
4a10: 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 5f 50  case CKA_ECDSA_P
4a20: 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e  ARAMS:....return
4a30: 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41  ("CKA_ECDSA_PARA
4a40: 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  MS");...case CKA
4a50: 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65  _EC_POINT:....re
4a60: 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49  turn("CKA_EC_POI
4a70: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4a80: 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a  _SECONDARY_AUTH:
4a90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4aa0: 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 29  SECONDARY_AUTH")
4ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 55 54  ;...case CKA_AUT
4ac0: 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09  H_PIN_FLAGS:....
4ad0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 48  return("CKA_AUTH
4ae0: 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09  _PIN_FLAGS");...
4af0: 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 54  case CKA_HW_FEAT
4b00: 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74  URE_TYPE:....ret
4b10: 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 54  urn("CKA_HW_FEAT
4b20: 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61  URE_TYPE");...ca
4b30: 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f  se CKA_RESET_ON_
4b40: 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  INIT:....return(
4b50: 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e  "CKA_RESET_ON_IN
4b60: 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  IT");...case CKA
4b70: 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 72  _HAS_RESET:....r
4b80: 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52  eturn("CKA_HAS_R
4b90: 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 20 43  ESET");...case C
4ba0: 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45  KA_VENDOR_DEFINE
4bb0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4bc0: 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44  A_VENDOR_DEFINED
4bd0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
4be0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23  "UNKNOWN");.}..#
4bf0: 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28    define malloc(
4c00: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  x) CACKEY_DEBUG_
4c10: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f  FUNC_MALLOC(x, _
4c20: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4c30: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61  _).#  define rea
4c40: 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45  lloc(x, y) CACKE
4c50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
4c60: 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e  LLOC(x, y, __fun
4c70: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
4c80: 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a 23    ifdef strdup.#
4c90: 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 70      undef strdup
4ca0: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66  .#  endif.#  def
4cb0: 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 41  ine strdup(x) CA
4cc0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4cd0: 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63  STRDUP(x, __func
4ce0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65  __, __LINE__).#e
4cf0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41  lse.#  define CA
4d00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4d10: 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  F(x...) /**/.#  
4d20: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4d30: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20  BUG_PRINTBUF(f, 
4d40: 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x, y) /**/.#  de
4d50: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4d60: 47 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f  G_PERROR(x) /**/
4d70: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4d80: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
4d90: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4da0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4db0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4dc0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
4dd0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4de0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4df0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4e00: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
4e10: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e20: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e30: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e40: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
4e90: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4ea0: 49 53 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a  ISABLED".#endif.
4eb0: 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a  .typedef enum {.
4ec0: 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f  .CACKEY_ID_TYPE_
4ed0: 43 41 43 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f  CAC,..CACKEY_ID_
4ee0: 54 59 50 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45  TYPE_PIV,..CACKE
4ef0: 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
4f00: 4e 4c 59 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73  NLY.} cackey_pcs
4f10: 63 5f 69 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75  c_id_type;..stru
4f20: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
4f30: 64 65 6e 74 69 74 79 20 7b 0a 09 63 61 63 6b 65  dentity {..cacke
4f40: 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69  y_pcsc_id_type i
4f50: 64 5f 74 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74  d_type;...size_t
4f60: 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
4f70: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
4f80: 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a   *certificate;..
4f90: 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65  .ssize_t keysize
4fa0: 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74  ;...union {...st
4fb0: 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e  ruct {....unsign
4fc0: 65 64 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37  ed char applet[7
4fd0: 5d 3b 0a 09 09 09 75 69 6e 74 31 36 5f 74 20 66  ];....uint16_t f
4fe0: 69 6c 65 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09  ile;...} cac;...
4ff0: 09 73 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73  .struct {....uns
5000: 69 67 6e 65 64 20 63 68 61 72 20 6b 65 79 5f 69  igned char key_i
5010: 64 3b 0a 09 09 7d 20 70 69 76 3b 0a 09 7d 20 63  d;...} piv;..} c
5020: 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  ard;.};..struct 
5030: 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
5040: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
5050: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
5060: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a  pcsc_identity;..
5070: 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  .CK_ATTRIBUTE *a
5080: 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55  ttributes;..CK_U
5090: 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f  LONG attributes_
50a0: 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63  count;.};..struc
50b0: 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  t cackey_session
50c0: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
50d0: 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
50e0: 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20  tID;...CK_STATE 
50f0: 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53  state;..CK_FLAGS
5100: 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e   flags;..CK_ULON
5110: 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b  G ulDeviceError;
5120: 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  ..CK_VOID_PTR pA
5130: 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f  pplication;..CK_
5140: 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a  NOTIFY Notify;..
5150: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
5160: 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
5170: 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
5180: 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63  ong identities_c
5190: 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72  ount;...int sear
51a0: 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41  ch_active;..CK_A
51b0: 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65 61  TTRIBUTE_PTR sea
51c0: 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55  rch_query;..CK_U
51d0: 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72  LONG search_quer
51e0: 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e  y_count;..unsign
51f0: 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63  ed long search_c
5200: 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69  urr_id;...int si
5210: 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d  gn_active;..CK_M
5220: 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69  ECHANISM_TYPE si
5230: 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43  gn_mechanism;..C
5240: 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f  K_BYTE_PTR sign_
5250: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
5260: 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b  ong sign_buflen;
5270: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
5280: 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73  sign_bufused;..s
5290: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
52a0: 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e  ntity *sign_iden
52b0: 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72  tity;...int decr
52c0: 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ypt_active;..CK_
52d0: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64  MECHANISM_TYPE d
52e0: 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
52f0: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64  ;..CK_VOID_PTR d
5300: 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
5310: 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72  ;..CK_ULONG decr
5320: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e  ypt_mech_parmlen
5330: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
5340: 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79  _identity *decry
5350: 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a  pt_identity;.};.
5360: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  .struct cackey_s
5370: 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76  lot {..int activ
5380: 65 3b 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c  e;..int internal
5390: 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72  ;...char *pcsc_r
53a0: 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73  eader;...int pcs
53b0: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
53c0: 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70  ;..SCARDHANDLE p
53d0: 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20  csc_card;...int 
53e0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
53f0: 68 3b 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74  h;..int transact
5400: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
5410: 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73  ;...int slot_res
5420: 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74  et;...CK_FLAGS t
5430: 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e  oken_flags;...un
5440: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62  signed char *lab
5450: 65 6c 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74  el;...DWORD prot
5460: 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64  ocol;...unsigned
5470: 20 69 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74   int cached_cert
5480: 73 5f 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74  s_count;..struct
5490: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
54a0: 6e 74 69 74 79 20 2a 63 61 63 68 65 64 5f 63 65  ntity *cached_ce
54b0: 72 74 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  rts;.};..typedef
54c0: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
54d0: 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20  TLV_APP_GENERIC 
54e0: 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f  = 0x01,..CACKEY_
54f0: 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20  TLV_APP_SKI     
5500: 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f  = 0x02,..CACKEY_
5510: 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20  TLV_APP_PKI     
5520: 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f  = 0x04.} cackey_
5530: 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79  tlv_apptype;..ty
5540: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
5550: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47  CKEY_TLV_OBJID_G
5560: 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20  ENERALINFO      
5570: 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b   = 0x2000,..CACK
5580: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f  EY_TLV_OBJID_PRO
5590: 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d  PERSONALINFO   =
55a0: 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59   0x2100,..CACKEY
55b0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53  _TLV_OBJID_ACCES
55c0: 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30  SCONTROL     = 0
55d0: 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x3000,..CACKEY_T
55e0: 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20  LV_OBJID_LOGIN  
55f0: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 34             = 0x4
5600: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
5610: 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20  _OBJID_CARDINFO 
5620: 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30 30           = 0x500
5630: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
5640: 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20  BJID_BIOMETRICS 
5650: 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c         = 0x6000,
5660: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5670: 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52  ID_DIGITALSIGCER
5680: 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09  T    = 0x7000,..
5690: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
56a0: 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20  _CAC_PERSON     
56b0: 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41     = 0x0200,..CA
56c0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
56d0: 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20  AC_BENEFITS     
56e0: 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b   = 0x0202,..CACK
56f0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
5700: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d  _OTHERBENEFITS =
5710: 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59   0x0203,..CACKEY
5720: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50  _TLV_OBJID_CAC_P
5730: 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30  ERSONNEL     = 0
5740: 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54  x0201,..CACKEY_T
5750: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
5760: 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78 30  CERT       = 0x0
5770: 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  2FE.} cackey_tlv
5780: 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65  _objectid;..type
5790: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b  def enum {..CACK
57a0: 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
57b0: 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09  RESENT    = 1,..
57c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
57e0: 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  0,..CACKEY_PCSC_
57f0: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20 20  E_GENERIC       
5800: 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f    = -1,..CACKEY_
5810: 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20  PCSC_E_BADPIN   
5820: 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41         = -2,..CA
5830: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b  CKEY_PCSC_E_LOCK
5840: 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33  ED          = -3
5850: 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  ,..CACKEY_PCSC_E
5860: 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20  _NEEDLOGIN      
5870: 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50   = -4,..CACKEY_P
5880: 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
5890: 54 20 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43  T     = -6,..CAC
58a0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
58b0: 20 20 20 20 20 20 20 20 20 20 20 3d 20 2d 37 0a             = -7.
58c0: 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73  } cackey_ret;..s
58d0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
58e0: 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69  _cardurl {..unsi
58f0: 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20 20  gned char       
5900: 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79   rid[5];..cackey
5910: 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61  _tlv_apptype   a
5920: 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f  pptype;..cackey_
5930: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62  tlv_objectid  ob
5940: 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f  jectid;..cackey_
5950: 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70  tlv_objectid  ap
5960: 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  pid;..unsigned c
5970: 68 61 72 20 20 20 20 20 20 20 20 70 69 6e 69 64  har        pinid
5980: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
5990: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a  key_tlv_entity;.
59a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
59b0: 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74  v_entity {..uint
59c0: 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74  8_t tag;..size_t
59d0: 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e   length;...union
59e0: 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65   {...void *value
59f0: 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b 65  ;...struct cacke
5a00: 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76  y_tlv_cardurl *v
5a10: 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09  alue_cardurl;...
5a20: 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79  uint8_t value_by
5a30: 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74  te;..};...struct
5a40: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
5a50: 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f  ty *_next;.};../
5a60: 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20  * CACKEY Global 
5a70: 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69  Handles */.stati
5a80: 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62  c void *cackey_b
5a90: 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73  iglock = NULL;.s
5aa0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
5ab0: 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b  key_session cack
5ac0: 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d  ey_sessions[128]
5ad0: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
5ae0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b  cackey_slot cack
5af0: 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73  ey_slots[128];.s
5b00: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
5b10: 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  _initialized = 0
5b20: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ;.static int cac
5b30: 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
5b40: 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49   = 0;.CK_C_INITI
5b50: 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65  ALIZE_ARGS cacke
5b60: 79 5f 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74  y_args;../** Ext
5b70: 72 61 20 63 65 72 74 69 66 69 63 61 74 65 73 20  ra certificates 
5b80: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f  to include in to
5b90: 6b 65 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63  ken **/.struct c
5ba0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
5bb0: 69 74 79 20 65 78 74 72 61 5f 63 65 72 74 73 5b  ity extra_certs[
5bc0: 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22  ] = {.#include "
5bd0: 63 61 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63  cackey_builtin_c
5be0: 65 72 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50  erts.h".};../* P
5bf0: 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c  CSC Global Handl
5c00: 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53  es */.static LPS
5c10: 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b  CARDCONTEXT cack
5c20: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d  ey_pcsc_handle =
5c30: 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75   NULL;..static u
5c40: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63  nsigned long cac
5c50: 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76  key_getversion(v
5c60: 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75  oid) {..static u
5c70: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74  nsigned long ret
5c80: 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69  val = 255;..unsi
5c90: 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20  gned long major 
5ca0: 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  = 0;..unsigned l
5cb0: 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09  ong minor = 0;..
5cc0: 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20  char *major_str 
5cd0: 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d  = NULL;..char *m
5ce0: 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b  inor_str = NULL;
5cf0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
5d00: 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
5d10: 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20  );...if (retval 
5d20: 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b  != 255) {...CACK
5d30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
5d40: 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78  "Returning 0x%lx
5d50: 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74   (cached).", ret
5d60: 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  val);....return(
5d70: 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65  retval);..}...re
5d80: 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65  tval = 0;..#ifde
5d90: 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  f PACKAGE_VERSIO
5da0: 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f  N.        major_
5db0: 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45  str = PACKAGE_VE
5dc0: 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f  RSION;..if (majo
5dd0: 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20  r_str) {..      
5de0: 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75    major = strtou
5df0: 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69  l(major_str, &mi
5e00: 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09  nor_str, 10);...
5e10: 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20  .if (minor_str) 
5e20: 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72  {....minor = str
5e30: 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b  toul(minor_str +
5e40: 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09   1, NULL, 10);..
5e50: 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d  .}..}...retval =
5e60: 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c   (major << 16) |
5e70: 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23   (minor << 8);.#
5e80: 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
5e90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
5ea0: 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72  urning 0x%lx", r
5eb0: 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
5ec0: 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20  (retval);.}../* 
5ed0: 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75  PC/SC Related Fu
5ee0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a  nctions */./*. *
5ef0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
5f00: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f   void cackey_slo
5f10: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
5f20: 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  l(void);. *. * A
5f30: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
5f40: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
5f50: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
5f60: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
5f70: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
5f80: 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73  tion disconnects
5f90: 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e   from all cards.
5fa0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
5fb0: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
5fc0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
5fd0: 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f  void) {..uint32_
5fe0: 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f  t idx;...CACKEY_
5ff0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6000: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28  lled.");...for (
6010: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
6020: 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
6030: 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
6040: 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
6050: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
6060: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6070: 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
6080: 09 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61  ./* Skip interna
6090: 6c 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f  l slots */....co
60a0: 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
60b0: 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
60c0: 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63  idx].pcsc_card_c
60d0: 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43  onnected) {....C
60e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
60f0: 54 46 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e  TF("SCardDisconn
6100: 65 63 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22  ect(%lu) called"
6110: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
6120: 29 20 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72  ) idx);.....SCar
6130: 64 44 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b  dDisconnect(cack
6140: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
6150: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
6160: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a  EAVE_CARD);...}.
6170: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
6180: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20  ots[idx].label) 
6190: 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
61a0: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65  _slots[idx].labe
61b0: 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  l);.....cackey_s
61c0: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20  lots[idx].label 
61d0: 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63  = NULL;...}....c
61e0: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
61f0: 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  .pcsc_card_conne
6200: 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b  cted = 0;...cack
6210: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72  ey_slots[idx].tr
6220: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
6230: 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
6240: 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
6250: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
6260: 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61  k = 0;....if (ca
6270: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
6280: 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43  active) {....CAC
6290: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
62a0: 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65  ("Marking active
62b0: 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69   slot %lu as bei
62c0: 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69  ng reset", (unsi
62d0: 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b  gned long) idx);
62e0: 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
62f0: 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72  lots[idx].slot_r
6300: 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43  eset = 1;..}...C
6310: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6320: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  TF("Returning");
6330: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
6340: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6350: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
6360: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
6370: 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ct(void);. *. * 
6380: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
6390: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
63a0: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
63b0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
63c0: 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63           On succ
63d0: 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  ess. *     CACKE
63e0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
63f0: 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a      On error. *.
6400: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
6410: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
6420: 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50 43  nnects to the PC
6430: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d  /SC Connection M
6440: 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61 74  anager and updat
6450: 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c  es the. *     gl
6460: 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a  obal handle.. *.
6470: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
6480: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73  y_ret cackey_pcs
6490: 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20  c_connect(void) 
64a0: 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73  {..LONG scard_es
64b0: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23  t_context_ret;.#
64c0: 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52 44  ifdef HAVE_SCARD
64d0: 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09  ISVALIDCONTEXT..
64e0: 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c  LONG scard_isval
64f0: 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a  id_ret;.#endif..
6500: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6510: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
6520: 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63  ...if (cackey_pc
6530: 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c  sc_handle == NUL
6540: 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63  L) {...cackey_pc
6550: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c  sc_handle = mall
6560: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65  oc(sizeof(*cacke
6570: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b  y_pcsc_handle));
6580: 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63  ...if (cackey_pc
6590: 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c  sc_handle == NUL
65a0: 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  L) {....CACKEY_D
65b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
65c0: 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61  l to malloc() fa
65d0: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
65e0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
65f0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
6600: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
6610: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
6620: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6630: 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  C);...}....CACKE
6640: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6650: 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f  SCardEstablishCo
6660: 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29  ntext() called")
6670: 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f  ;...scard_est_co
6680: 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72  ntext_ret = SCar
6690: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
66a0: 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59  t(SCARD_SCOPE_SY
66b0: 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  STEM, NULL, NULL
66c0: 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  , cackey_pcsc_ha
66d0: 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61  ndle);...if (sca
66e0: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
66f0: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
6700: 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b  CCESS) {....CACK
6710: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6720: 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73  "Call to SCardEs
6730: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66  tablishContext f
6740: 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20  ailed (returned 
6750: 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69  %s/%li), returni
6760: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20  ng in failure", 
6770: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
6780: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
6790: 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  R(scard_est_cont
67a0: 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ext_ret), (long)
67b0: 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65   scard_est_conte
67c0: 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65  xt_ret);.....fre
67d0: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
67e0: 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79  ndle);....cackey
67f0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
6800: 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ULL;.....cackey_
6810: 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
6820: 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75  _all();.....retu
6830: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6840: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09  _GENERIC);...}..
6850: 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  }..#ifdef HAVE_S
6860: 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45  CARDISVALIDCONTE
6870: 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  XT..CACKEY_DEBUG
6880: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 49 73  _PRINTF("SCardIs
6890: 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63  ValidContext() c
68a0: 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f  alled");..scard_
68b0: 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43  isvalid_ret = SC
68c0: 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78  ardIsValidContex
68d0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
68e0: 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61  andle);..if (sca
68f0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21  rd_isvalid_ret !
6900: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
6910: 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  S) {...CACKEY_DE
6920: 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64  BUG_PRINTF("Hand
6930: 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e  le has become in
6940: 76 61 6c 69 64 20 28 53 43 61 72 64 49 73 56 61  valid (SCardIsVa
6950: 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f  lidContext = %s/
6960: 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20  %li), trying to 
6970: 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22  re-establish..."
6980: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
6990: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
69a0: 53 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69  STR(scard_isvali
69b0: 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  d_ret), (long) s
69c0: 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74  card_isvalid_ret
69d0: 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
69e0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
69f0: 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74  EstablishContext
6a00: 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73  () called");...s
6a10: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6a20: 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74 61  _ret = SCardEsta
6a30: 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41  blishContext(SCA
6a40: 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c  RD_SCOPE_SYSTEM,
6a50: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63   NULL, NULL, cac
6a60: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6a70: 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65 73  ;...if (scard_es
6a80: 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d  t_context_ret !=
6a90: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
6aa0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
6ab0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6ac0: 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69   to SCardEstabli
6ad0: 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64  shContext failed
6ae0: 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c   (returned %s/%l
6af0: 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  i), returning in
6b00: 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45   failure", CACKE
6b10: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
6b20: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
6b30: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6b40: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
6b50: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
6b60: 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63  t);.....free(cac
6b70: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6b80: 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
6b90: 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  _handle = NULL;.
6ba0: 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
6bb0: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
6bc0: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
6bd0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
6be0: 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  RIC);...}....CAC
6bf0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6c00: 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65  ("Handle has bee
6c10: 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64  n re-established
6c20: 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  ");..}.#endif...
6c30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6c40: 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79  NTF("Sucessfully
6c50: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43   connected to PC
6c60: 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  /SC, returning i
6c70: 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72  n success");...r
6c80: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6c90: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
6ca0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6cb0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
6cc0: 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
6cd0: 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  ect(void);. *. *
6ce0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6cf0: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6d00: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6d10: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
6d20: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
6d30: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
6d40: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6d50: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
6d60: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
6d70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
6d80: 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20  isconnects from 
6d90: 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63  the PC/SC Connec
6da0: 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64  tion manager and
6db0: 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20   updates. *     
6dc0: 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c  the global handl
6dd0: 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  e.. *. */.static
6de0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
6df0: 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
6e00: 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47  ct(void) {..LONG
6e10: 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65   scard_rel_conte
6e20: 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  xt_ret;...CACKEY
6e30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6e40: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
6e50: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6e60: 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  le == NULL) {...
6e70: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
6e80: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73  SC_S_OK);..}...s
6e90: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
6ea0: 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65  _ret = SCardRele
6eb0: 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b  aseContext(*cack
6ec0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b  ey_pcsc_handle);
6ed0: 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63  ...if (cackey_pc
6ee0: 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66  sc_handle) {...f
6ef0: 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  ree(cackey_pcsc_
6f00: 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63  handle);.....cac
6f10: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6f20: 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20  = NULL;..}...if 
6f30: 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65  (scard_rel_conte
6f40: 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  xt_ret != SCARD_
6f50: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72  S_SUCCESS) {...r
6f60: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
6f70: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
6f80: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
6f90: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
6fa0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
6fb0: 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65  *     void cacke
6fc0: 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
6fd0: 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  t(struct cackey_
6fe0: 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a  slot *slot);. *.
6ff0: 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
7000: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52      None. *. * R
7010: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
7020: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f     None. *. * NO
7030: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
7040: 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61  function marks a
7050: 20 73 6c 6f 74 20 68 61 73 20 68 61 76 69 6e 67   slot has having
7060: 20 62 65 65 6e 20 72 65 73 65 74 2c 20 74 6f 20   been reset, to 
7070: 6c 61 74 65 72 20 62 65 20 63 6c 65 61 6e 65 64  later be cleaned
7080: 20 75 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61   up.. *     Clea
7090: 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73  nup only happens
70a0: 20 77 68 65 6e 20 61 20 50 4b 43 53 23 31 31 20   when a PKCS#11 
70b0: 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46  client calls C_F
70c0: 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a  indObjectsInit..
70d0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f   *. */.static vo
70e0: 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  id cackey_mark_s
70f0: 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75 63 74  lot_reset(struct
7100: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7110: 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74 20  ot) {..if (slot 
7120: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
7130: 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  urn;..}...CACKEY
7140: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
7150: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
7160: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
7170: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 53  connected) {...S
7180: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
7190: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
71a0: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
71b0: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c  );..}...slot->sl
71c0: 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 73  ot_reset = 1;..s
71d0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
71e0: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 73  onnected = 0;..s
71f0: 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot->token_flags
7200: 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51   = CKF_LOGIN_REQ
7210: 55 49 52 45 44 3b 0a 0a 09 43 41 43 4b 45 59 5f  UIRED;...CACKEY_
7220: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
7230: 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65  turning.");...re
7240: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  turn;.}../*. * S
7250: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c  YNPOSIS. *     L
7260: 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  ONG cackey_recon
7270: 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74  nect_card(struct
7280: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
7290: 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c  ot, DWORD defaul
72a0: 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57  t_protocol, LPDW
72b0: 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f  ORD selected_pro
72c0: 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52  tocol);. *. * AR
72d0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63  GUMENTS. *     c
72e0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
72f0: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74  . *         Slot
7300: 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64   to send command
7310: 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44  s to. *. *     D
7320: 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f  WORD default_pro
7330: 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20  tocol. *        
7340: 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74   Protocol to att
7350: 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a  empt first. *. *
7360: 20 20 20 20 20 4c 50 44 57 4f 52 44 20 73 65 6c       LPDWORD sel
7370: 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a 20  ected_protocol. 
7380: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
7390: 50 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  Protocol selecte
73a0: 64 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  d. *. * RETURN V
73b0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 65 20  ALUE. *     The 
73c0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
73d0: 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  m SCardReconnect
73e0: 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  (). *. * NOTES. 
73f0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
7400: 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65 72  ion is a wrapper
7410: 20 61 72 6f 75 6e 64 20 53 43 61 72 64 52 65 63   around SCardRec
7420: 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20  onnect(). *. *  
7430: 20 20 20 54 68 65 20 53 43 61 72 64 52 65 63 6f     The SCardReco
7440: 6e 6e 65 63 74 28 29 20 66 75 6e 63 74 69 6f 6e  nnect() function
7450: 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61   call will be ca
7460: 6c 6c 65 64 20 66 69 72 73 74 20 77 69 74 68 20  lled first with 
7470: 74 68 65 0a 20 2a 20 20 20 20 20 64 77 50 72 65  the. *     dwPre
7480: 66 65 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20  ferredProtocols 
7490: 6f 66 20 22 64 65 66 61 75 6c 74 5f 70 72 6f 74  of "default_prot
74a0: 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68 61 74 20  ocol".  If that 
74b0: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20  call returns. * 
74c0: 20 20 20 20 53 43 41 52 44 5f 45 5f 50 52 4f 54      SCARD_E_PROT
74d0: 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72 79 20 61  O_MISMATCH try a
74e0: 67 61 69 6e 20 77 69 74 68 20 61 20 70 72 6f 74  gain with a prot
74f0: 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64  ocol of T=0, and
7500: 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20   failing. *     
7510: 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f  that T=1.. *. */
7520: 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 63 61 63  .static LONG cac
7530: 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
7540: 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  rd(struct cackey
7550: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f  _slot *slot, DWO
7560: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
7570: 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c  col, LPDWORD sel
7580: 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 20  ected_protocol) 
7590: 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f  {..LONG scard_co
75a0: 6e 6e 5f 72 65 74 3b 0a 0a 09 73 63 61 72 64 5f  nn_ret;...scard_
75b0: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
75c0: 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e  Reconnect(slot->
75d0: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
75e0: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 64  _SHARE_SHARED, d
75f0: 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c  efault_protocol,
7600: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7610: 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  D, selected_prot
7620: 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61  ocol);...if (sca
7630: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
7640: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7650: 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43 4b 45  MATCH) {...CACKE
7660: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7670: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7680: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
7690: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
76a0: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
76b0: 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61 72 64  st T=0")...scard
76c0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
76d0: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  dReconnect(slot-
76e0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
76f0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7700: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7710: 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43  0, SCARD_RESET_C
7720: 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72  ARD, selected_pr
7730: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28  otocol);....if (
7740: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7750: 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  = SCARD_E_PROTO_
7760: 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43  MISMATCH) {....C
7770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7780: 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65  TF("SCardReconne
7790: 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  ct() returned SC
77a0: 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d  ARD_E_PROTO_MISM
77b0: 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74  ATCH, trying wit
77c0: 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09  h just T=1")....
77d0: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
77e0: 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
77f0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7800: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
7810: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
7820: 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45  COL_T1, SCARD_RE
7830: 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74  SET_CARD, select
7840: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  ed_protocol);...
7850: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63  }..}...return(sc
7860: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d  ard_conn_ret);.}
7870: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
7880: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
7890: 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63  et cackey_connec
78a0: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61  t_card(struct ca
78b0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
78c0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
78d0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
78e0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
78f0: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
7900: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
7910: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
7920: 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  E. *     CACKEY_
7930: 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20  PCSC_S_OK       
7940: 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20    On success. * 
7950: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
7960: 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20  E_GENERIC    On 
7970: 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45  error. *. * NOTE
7980: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
7990: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
79a0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f  ey_ret cackey_co
79b0: 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63  nnect_card(struc
79c0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
79d0: 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72  lot) {..cackey_r
79e0: 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  et pcsc_connect_
79f0: 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74  ret;..DWORD prot
7a00: 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72  ocol;..LONG scar
7a10: 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41  d_conn_ret;...CA
7a20: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
7a30: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
7a40: 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43  if (!slot) {...C
7a50: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7a60: 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74  TF("Invalid slot
7a70: 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75   specified, retu
7a80: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
7a90: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
7aa0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
7ab0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f  RIC);..}...pcsc_
7ac0: 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
7ad0: 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
7ae0: 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  t();..if (pcsc_c
7af0: 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
7b00: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
7b10: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
7b20: 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
7b30: 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69  ion to PC/SC fai
7b40: 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  led, returning i
7b50: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
7b60: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7b70: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7b80: 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74  }.../* Connect t
7b90: 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65  o reader, if nee
7ba0: 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f  ded */..if (!slo
7bb0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
7bc0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b  nected) {...CACK
7bd0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7be0: 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73  "SCardConnect(%s
7bf0: 29 20 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d  ) called", slot-
7c00: 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  >pcsc_reader);..
7c10: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
7c20: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
7c30: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
7c40: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
7c50: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
7c60: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
7c70: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53  _PROTOCOL_T0 | S
7c80: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
7c90: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
7ca0: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
7cb0: 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e  ...if (scard_con
7cc0: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45  n_ret == SCARD_E
7cd0: 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29  _PROTO_MISMATCH)
7ce0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
7cf0: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7d00: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
7d10: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7d20: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7d30: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22  g with just T=0"
7d40: 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  )....scard_conn_
7d50: 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65  ret = SCardConne
7d60: 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  ct(*cackey_pcsc_
7d70: 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63  handle, slot->pc
7d80: 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44  sc_reader, SCARD
7d90: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
7da0: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30  CARD_PROTOCOL_T0
7db0: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
7dc0: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
7dd0: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
7de0: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
7df0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
7e00: 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
7e10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
7e20: 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75  rdConnect() retu
7e30: 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f  rned SCARD_E_PRO
7e40: 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79  TO_MISMATCH, try
7e50: 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d  ing with just T=
7e60: 31 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f  1").....scard_co
7e70: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f  nn_ret = SCardCo
7e80: 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63  nnect(*cackey_pc
7e90: 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d  sc_handle, slot-
7ea0: 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43  >pcsc_reader, SC
7eb0: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7ec0: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
7ed0: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
7ee0: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
7ef0: 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  );....}...}....i
7f00: 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  f (scard_conn_re
7f10: 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50  t == SCARD_W_UNP
7f20: 4f 57 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09  OWERED_CARD) {..
7f30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7f40: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
7f50: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
7f60: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
7f70: 5f 43 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f  _CARD, trying to
7f80: 20 72 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29   re-connect...")
7f90: 3b 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ;.....scard_conn
7fa0: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7fb0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7fc0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7fd0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7fe0: 44 5f 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20  D_SHARE_DIRECT, 
7ff0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
8000: 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
8010: 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T1, &slot->pc
8020: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
8030: 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61  ol);.....if (sca
8040: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
8050: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
8060: 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43  MATCH) {.....CAC
8070: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8080: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29  ("SCardConnect()
8090: 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f   returned SCARD_
80a0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
80b0: 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75  , trying with ju
80c0: 73 74 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61  st T=0").....sca
80d0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
80e0: 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b  ardConnect(*cack
80f0: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
8100: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
8110: 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53  r, SCARD_SHARE_S
8120: 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f  HARED, SCARD_PRO
8130: 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d  TOCOL_T0, &slot-
8140: 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f  >pcsc_card, &pro
8150: 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20  tocol);......if 
8160: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
8170: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
8180: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
8190: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
81a0: 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e  RINTF("SCardConn
81b0: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
81c0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
81d0: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
81e0: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09  th just T=1")...
81f0: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8200: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
8210: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
8220: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
8230: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
8240: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
8250: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
8260: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
8270: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
8280: 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61  ..}....}.....sca
8290: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  rd_conn_ret = ca
82a0: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
82b0: 61 72 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63  ard(slot, protoc
82c0: 6f 6c 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  ol, &protocol);.
82d0: 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
82e0: 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41  _conn_ret != SCA
82f0: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
8300: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8310: 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69  PRINTF("Connecti
8320: 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65  on to card faile
8330: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
8340: 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f  failure (SCardCo
8350: 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69  nnect() = %s/%li
8360: 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  )", CACKEY_DEBUG
8370: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
8380: 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e  O_STR(scard_conn
8390: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
83a0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a  ard_conn_ret);..
83b0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
83c0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
83d0: 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70  ;...}....slot->p
83e0: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
83f0: 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e  ed = 1;...slot->
8400: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8410: 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74  h = 0;...slot->t
8420: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
8430: 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73  hw_lock = 0;...s
8440: 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20  lot->protocol = 
8450: 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72  protocol;..}...r
8460: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8470: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
8480: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
8490: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
84a0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
84b0: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63  ction(struct cac
84c0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b  key_slot *slot);
84d0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
84e0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
84f0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
8500: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
8510: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
8520: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
8530: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8540: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
8550: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
8560: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
8570: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
8580: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
8590: 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e  . *     The tran
85a0: 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  saction should b
85b0: 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69  e terminated usi
85c0: 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ng "cackey_end_t
85d0: 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20  ransaction". *. 
85e0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
85f0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69  _ret cackey_begi
8600: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74  n_transaction(st
8610: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
8620: 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65   *slot) {..cacke
8630: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e  y_ret cackey_con
8640: 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61  n_ret;..LONG sca
8650: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
8660: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8670: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
8680: 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65  ..cackey_conn_re
8690: 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
86a0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
86b0: 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  if (cackey_conn_
86c0: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
86d0: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
86e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
86f0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
8700: 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
8710: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
8720: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
8730: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8740: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  IC);..}...slot->
8750: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8760: 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  h++;...if (slot-
8770: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8780: 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d  th > 1 && !slot-
8790: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
87a0: 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43  d_hw_lock) {...C
87b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
87c0: 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61  TF("Already in a
87d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65   transaction, pe
87e0: 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69  rforming no acti
87f0: 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20  on (new depth = 
8800: 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e  %i)", slot->tran
8810: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a  saction_depth);.
8820: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8830: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
8840: 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
8850: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
8860: 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72   = 0;...scard_tr
8870: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42  ans_ret = SCardB
8880: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
8890: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29  slot->pcsc_card)
88a0: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61  ;..if (scard_tra
88b0: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  ns_ret != SCARD_
88c0: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
88d0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
88e0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65  TF("Unable to be
88f0: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  gin transaction,
8900: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
8910: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
8920: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
8930: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
8940: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8950: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62  F("Sucessfully b
8960: 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egan transaction
8970: 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20   on slot (%s)", 
8980: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
8990: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  r);...return(CAC
89a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
89b0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
89c0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
89d0: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
89e0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
89f0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8a00: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  lot);. *. * ARGU
8a10: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
8a20: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
8a30: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
8a40: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
8a50: 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  to. *. * RETURN 
8a60: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8a70: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8a80: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
8a90: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8aa0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
8ab0: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
8ac0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
8ad0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69  s function requi
8ae0: 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69  res "cackey_begi
8af0: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74  n_transaction" t
8b00: 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  o be called firs
8b10: 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  t. *. */.static 
8b20: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8b30: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
8b40: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
8b50: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c  slot *slot) {..L
8b60: 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f  ONG scard_trans_
8b70: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8b80: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8b90: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
8ba0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
8bb0: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43  nnected) {...CAC
8bc0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8bd0: 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f  ("Card is not co
8be0: 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20  nnected, unable 
8bf0: 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69  to end transacti
8c00: 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09  on on card");...
8c10: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
8c20: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
8c30: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8c40: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72  BUG_PRINTF("Decr
8c50: 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69  easing transacti
8c60: 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b  on depth and ask
8c70: 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64 77 61  ing for a hardwa
8c80: 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e  re lock on the n
8c90: 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ext begin transa
8ca0: 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64  ction (current d
8cb0: 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f  epth = %i)", slo
8cc0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8cd0: 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d  epth);.....slot-
8ce0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8cf0: 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c  th--;.....if (sl
8d00: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8d10: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
8d20: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8d30: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
8d40: 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  = 1;....}...}...
8d50: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8d60: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
8d70: 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .}...if (slot->t
8d80: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8d90: 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
8da0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8db0: 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72  Terminating a tr
8dc0: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68  ansaction that h
8dd0: 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b  as not begun!");
8de0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8df0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8e00: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8e10: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
8e20: 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  -;...if (slot->t
8e30: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8e40: 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   > 0) {...CACKEY
8e50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
8e60: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
8e70: 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e  l in progress, n
8e80: 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f  ot terminating o
8e90: 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  n-card Transacti
8ea0: 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74  on (current dept
8eb0: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
8ec0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8ed0: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  h);....return(CA
8ee0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
8ef0: 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e  ..}...scard_tran
8f00: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64  s_ret = SCardEnd
8f10: 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  Transaction(slot
8f20: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
8f30: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
8f40: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
8f50: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
8f60: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
8f70: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8f80: 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  ("Unable to end 
8f90: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
8fa0: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
8fb0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
8fc0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8fd0: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
8fe0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
8ff0: 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69  ucessfully termi
9000: 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  nated transactio
9010: 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c  n on slot (%s)",
9020: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
9030: 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  er);...return(CA
9040: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
9050: 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61  .}../* APDU Rela
9060: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
9070: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
9080: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
9090: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
90a0: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
90b0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
90c0: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
90d0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
90e0: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
90f0: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
9100: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
9110: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9120: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
9130: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
9140: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
9150: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
9160: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
9170: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
9180: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a  espdata_len);. *
9190: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
91a0: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
91b0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
91c0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
91d0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
91e0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
91f0: 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20  ar class. *     
9200: 20 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28      APDU Class (
9210: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
9220: 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41  816 or GSCIS_CLA
9230: 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
9240: 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73  RM. *         us
9250: 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a  ually), (CLA). *
9260: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9270: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
9280: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  n. *         APD
9290: 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49  U Instruction (I
92a0: 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  NS). *. *     un
92b0: 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20  signed char p1. 
92c0: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50  *         APDU P
92d0: 61 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a  arameter 1 (P1).
92e0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
92f0: 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20  ed char p2. *   
9300: 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d        APDU Param
9310: 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20  eter 2 (P2). *. 
9320: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9330: 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20  har lc. *       
9340: 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66    APDU Length of
9350: 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d   Content (Lc) --
9360: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
9370: 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a  gth of "data". *
9380: 20 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74           paramet
9390: 65 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69  er.  If "data" i
93a0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  s specified as N
93b0: 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65  ULL, this parame
93c0: 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  ter will. *     
93d0: 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a      be ignored..
93e0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
93f0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a  ed char *data. *
9400: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
9410: 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65   to buffer to se
9420: 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62  nd.  It should b
9430: 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e  e "Lc" bytes lon
9440: 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20  g.  If. *       
9450: 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e    specified as N
9460: 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e  ULL, "Lc" will n
9470: 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20  ot be sent, and 
9480: 74 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c  this buffer will
9490: 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69   be. *         i
94a0: 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  gnored.. *. *   
94b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
94c0: 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  le. *         AP
94d0: 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70  DU Length of Exp
94e0: 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d  ectation (Le) --
94f0: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
9500: 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20  gth of the. *   
9510: 20 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72        expected r
9520: 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69  eply.  If this i
9530: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30  s specified as 0
9540: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
9550: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20  t. *         be 
9560: 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  sent.. *. *     
9570: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
9580: 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  de. *         [O
9590: 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73  UT] Pointer to s
95a0: 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72  torage of APDU r
95b0: 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49  esponse code.  I
95c0: 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20  f this is. *    
95d0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
95e0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70  s NULL, the resp
95f0: 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62  onse code will b
9600: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
9610: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9620: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20  char *respdata. 
9630: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
9640: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61  Pointer to stora
9650: 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f  ge of APDU respo
9660: 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68  nse data.  If th
9670: 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  is is. *        
9680: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
9690: 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65  LL, the response
96a0: 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69   data will be di
96b0: 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20  scarded.  If. * 
96c0: 20 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73          the "res
96d0: 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d  pdata_len" param
96e0: 65 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65  eter is specifie
96f0: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
9700: 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20  buffer. *       
9710: 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70    will not be up
9720: 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  dated.. *. *    
9730: 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74   size_t *respdat
9740: 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  a_len. *        
9750: 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74   [IN, OUT] Point
9760: 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f  er initialing co
9770: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a  ntaining the siz
9780: 65 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61  e of the "respda
9790: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62  ta". *         b
97a0: 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72  uffer.  Before r
97b0: 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f  eturning, the po
97c0: 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69  inted to value i
97d0: 73 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65  s updated to the
97e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62  . *         numb
97f0: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
9800: 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65  ten to the buffe
9810: 72 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  r.  If this is s
9820: 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20  pecified as. *  
9830: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20         NULL, it 
9840: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9850: 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61  ted, and "respda
9860: 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ta" will be igno
9870: 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20  red causing. *  
9880: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f         the respo
9890: 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64  nse data to be d
98a0: 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20  iscarded.. *. * 
98b0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
98c0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
98d0: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f  S_OK           O
98e0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
98f0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
9900: 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65  ENERIC      On e
9910: 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b  rror. *     CACK
9920: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
9930: 42 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65  BSENT  If the se
9940: 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63  nding failed bec
9950: 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69  ause the token i
9960: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20  s. *            
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a      absent. *. *
9990: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
99a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
99b0: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
99c0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
99d0: 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20   Manager via. * 
99e0: 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f      cackey_pcsc_
99f0: 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65  connect() if nee
9a00: 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49  ded.. *. *     I
9a10: 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  t will connect t
9a20: 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20 74 68  o the card in th
9a30: 65 20 72 65 61 64 65 72 20 61 74 74 61 63 68 65  e reader attache
9a40: 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a  d to the slot. *
9a50: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 2e 20       specified. 
9a60: 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65   It will reconne
9a70: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
9a80: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9a90: 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61  . *     goes awa
9aa0: 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  y.. *. */.static
9ab0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
9ac0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72  ey_send_apdu(str
9ad0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9ae0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
9af0: 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69  char class, unsi
9b00: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
9b10: 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20  ction, unsigned 
9b20: 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65  char p1, unsigne
9b30: 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67  d char p2, unsig
9b40: 6e 65 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69  ned int lc, unsi
9b50: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c  gned char *data,
9b60: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
9b70: 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70  , uint16_t *resp
9b80: 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  code, unsigned c
9b90: 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73  har *respdata, s
9ba0: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9bb0: 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20  len) {..uint8_t 
9bc0: 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f  major_rc, minor_
9bd0: 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65  rc;..size_t byte
9be0: 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72  s_to_copy, tmp_r
9bf0: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50  espdata_len;..LP
9c00: 43 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53  CSCARD_IO_REQUES
9c10: 54 20 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44  T pioSendPci;..D
9c20: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
9c30: 44 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20  DWORD xmit_len, 
9c40: 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20  recv_len;..LONG 
9c50: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20  scard_xmit_ret, 
9c60: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
9c70: 3b 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66  ;..BYTE xmit_buf
9c80: 5b 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66  [1024], recv_buf
9c90: 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73  [1024];..int pcs
9ca0: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70  c_connect_ret, p
9cb0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b  csc_getresp_ret;
9cc0: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43  ..int idx;...CAC
9cd0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9ce0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
9cf0: 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41  f (!slot) {...CA
9d00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9d10: 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  F("Invalid slot 
9d20: 73 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09  specified.");...
9d30: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9d40: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
9d50: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
9d60: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
9d70: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
9d80: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
9d90: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
9da0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
9db0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9dc0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
9dd0: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
9de0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9df0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9e00: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
9e10: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
9e20: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  ./* Determine wh
9e30: 69 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20  ich protocol to 
9e40: 73 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73  send using */..s
9e50: 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f  witch (slot->pro
9e60: 74 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20  tocol) {...case 
9e70: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
9e80: 30 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  0:....CACKEY_DEB
9e90: 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f  UG_PRINTF("Proto
9ea0: 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61  col to send data
9eb0: 67 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a  gram is T=0");..
9ec0: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
9ed0: 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09  SCARD_PCI_T0;...
9ee0: 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
9ef0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
9f00: 31 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  1:....CACKEY_DEB
9f10: 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f  UG_PRINTF("Proto
9f20: 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61  col to send data
9f30: 67 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a  gram is T=1");..
9f40: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
9f50: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
9f60: 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75  ..break;...defau
9f70: 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  lt:....CACKEY_DE
9f80: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
9f90: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75  lid protocol fou
9fa0: 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b  nd, aborting.");
9fb0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
9fc0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
9fd0: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e  C);..}.../* Tran
9fe0: 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65  smit */..xmit_le
9ff0: 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66  n = 0;..xmit_buf
a000: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63  [xmit_len++] = c
a010: 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  lass;..xmit_buf[
a020: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e  xmit_len++] = in
a030: 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74  struction;..xmit
a040: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a050: 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66   = p1;..xmit_buf
a060: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70  [xmit_len++] = p
a070: 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a  2;..if (data) {.
a080: 09 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20  ..if (lc > 255) 
a090: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
a0a0: 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f  G_PRINTF("CAUTIO
a0b0: 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20  N!  Using an Lc 
a0c0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35  greater than 255
a0d0: 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c   is untested.  L
a0e0: 63 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09  c = %u", lc);...
a0f0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a100: 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f  len++] = 0x82; /
a110: 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a  * XXX UNTESTED *
a120: 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  /....xmit_buf[xm
a130: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20  it_len++] = (lc 
a140: 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a  & 0xff00) >> 8;.
a150: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a160: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30  _len++] = lc & 0
a170: 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  xff;...} else {.
a180: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a190: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09  _len++] = lc;...
a1a0: 7d 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
a1b0: 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b  ; idx < lc; idx+
a1c0: 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  +) {....xmit_buf
a1d0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64  [xmit_len++] = d
a1e0: 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d  ata[idx];...}..}
a1f0: 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30  ...if (le != 0x0
a200: 30 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20  0) {...if (le > 
a210: 32 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  256) {....CACKEY
a220: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
a230: 41 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61  AUTION!  Using a
a240: 6e 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61  n Le greater tha
a250: 6e 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65  n 256 is unteste
a260: 64 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65  d.  Le = %u", le
a270: 29 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  );.....xmit_buf[
a280: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78  xmit_len++] = 0x
a290: 38 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53  82; /* XXX UNTES
a2a0: 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62  TED */....xmit_b
a2b0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a2c0: 20 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e   (le & 0xff00) >
a2d0: 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66  > 8;....xmit_buf
a2e0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c  [xmit_len++] = l
a2f0: 65 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c  e & 0xff;...} el
a300: 73 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36  se if (le == 256
a310: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
a320: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78  xmit_len++] = 0x
a330: 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  00;...} else {..
a340: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a350: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d  len++] = le;...}
a360: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53  ..}.../* Begin S
a370: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
a380: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
a390: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
a3a0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63  n(slot);...if (c
a3b0: 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c  lass == GSCIS_CL
a3c0: 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69  ASS_ISO7816 && i
a3d0: 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53  nstruction == GS
a3e0: 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59  CIS_INSTR_VERIFY
a3f0: 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20   && p1 == 0x00) 
a400: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a410: 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67  _PRINTF("Sending
a420: 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65   APDU: <<censore
a430: 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  d>>");..} else {
a440: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a450: 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e  PRINTBUF("Sendin
a460: 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62  g APDU:", xmit_b
a470: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09  uf, xmit_len);..
a480: 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  }...recv_len = s
a490: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
a4a0: 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ..scard_xmit_ret
a4b0: 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74   = SCardTransmit
a4c0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
a4d0: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d  , pioSendPci, xm
a4e0: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
a4f0: 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66  , NULL, recv_buf
a500: 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  , &recv_len);...
a510: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
a520: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f  et == SCARD_E_NO
a530: 54 5f 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a  T_TRANSACTED) {.
a540: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a550: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
a560: 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61   send APDU to ca
a570: 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  rd (SCardTransmi
a580: 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77  t() = %s/%lx), w
a590: 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20  ill ask calling 
a5a0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72  function to retr
a5b0: 79 20 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67  y (not resetting
a5c0: 20 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b   card)...", CACK
a5d0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
a5e0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
a5f0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
a600: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
a610: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a  card_xmit_ret);.
a620: 0a 09 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72  .../* Begin Smar
a630: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a640: 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e  n */...cackey_en
a650: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
a660: 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ot);....return(C
a670: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
a680: 52 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63  RY);..}...if (sc
a690: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20  ard_xmit_ret != 
a6a0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
a6b0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
a6c0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
a6d0: 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f   to send APDU to
a6e0: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e   card (SCardTran
a6f0: 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29  smit() = %s/%lx)
a700: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
a710: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
a720: 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f  _STR(scard_xmit_
a730: 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ret), (unsigned 
a740: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74  long) scard_xmit
a750: 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  _ret);....CACKEY
a760: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
a770: 61 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68  arking slot as h
a780: 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74  aving been reset
a790: 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  ");...cackey_mar
a7a0: 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
a7b0: 74 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64  t);....if (scard
a7c0: 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41  _xmit_ret == SCA
a7d0: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29  RD_W_RESET_CARD)
a7e0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
a7f0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
a800: 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73   required, pleas
a810: 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09  e hold...");....
a820: 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  .scard_reconn_re
a830: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
a840: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
a850: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
a860: 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
a870: 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c  OL_T1, &protocol
a880: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
a890: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
a8a0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
a8b0: 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20  {...../* Update 
a8c0: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09  protocol */.....
a8d0: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d  slot->protocol =
a8e0: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 09 09 09 73   protocol;.....s
a8f0: 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f  witch (slot->pro
a900: 74 6f 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63 61  tocol) {......ca
a910: 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  se SCARD_PROTOCO
a920: 4c 5f 54 30 3a 0a 09 09 09 09 09 09 70 69 6f 53  L_T0:.......pioS
a930: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
a940: 43 49 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62 72  CI_T0;........br
a950: 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 53  eak;......case S
a960: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
a970: 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50  :.......pioSendP
a980: 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54  ci = SCARD_PCI_T
a990: 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  1;........break;
a9a0: 0a 09 09 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  ......default:..
a9b0: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a9c0: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
a9d0: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
a9e0: 2c 20 62 75 74 20 74 6f 6f 20 6c 61 74 65 20 74  , but too late t
a9f0: 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 62  o do anything ab
aa00: 6f 75 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74 72  out it now -- tr
aa10: 79 69 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a  ying anyway.");.
aa20: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
aa30: 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65  ..}....../* Re-e
aa40: 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63  stablish transac
aa50: 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20  tion, if it was 
aa60: 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69  present */.....i
aa70: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
aa80: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
aa90: 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  {......slot->tra
aaa0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
aab0: 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  ;......slot->tra
aac0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
aad0: 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09  _lock = 1;......
aae0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
aaf0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
ab00: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
ab10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ab20: 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c  Reset successful
ab30: 2c 20 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67  , retransmitting
ab40: 22 29 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65  ");......recv_le
ab50: 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f  n = sizeof(recv_
ab60: 62 75 66 29 3b 0a 09 09 09 09 73 63 61 72 64 5f  buf);.....scard_
ab70: 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64  xmit_ret = SCard
ab80: 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70  Transmit(slot->p
ab90: 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e  csc_card, pioSen
aba0: 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20  dPci, xmit_buf, 
abb0: 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20  xmit_len, NULL, 
abc0: 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f  recv_buf, &recv_
abd0: 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73  len);......if (s
abe0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d  card_xmit_ret !=
abf0: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
ac00: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
ac10: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
ac20: 74 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c  transmit failed,
ac30: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
ac40: 69 6c 75 72 65 20 61 66 74 65 72 20 64 69 73 63  ilure after disc
ac50: 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61  onnecting the ca
ac60: 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  rd (SCardTransmi
ac70: 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41  t = %s/%li)", CA
ac80: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
ac90: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
aca0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
acb0: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d   (long) scard_xm
acc0: 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53  it_ret);.......S
acd0: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
ace0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
acf0: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
ad00: 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63  );......slot->pc
ad10: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
ad20: 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20  d = 0;......./* 
ad30: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
ad40: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
ad50: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
ad60: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
ad70: 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
ad80: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
ad90: 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43  ;.......return(C
ada0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
adb0: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d  ENABSENT);.....}
adc0: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
add0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ade0: 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74  INTF("Disconnect
adf0: 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09  ing card");.....
ae00: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
ae10: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
ae20: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
ae30: 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70  RD);.....slot->p
ae40: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
ae50: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20  ed = 0;....../* 
ae60: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
ae70: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
ae80: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
ae90: 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09  on_depth = 1;...
aea0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
aeb0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
aec0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
aed0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
aee0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
aef0: 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
af00: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
af10: 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09  ABSENT);....}...
af20: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
af30: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
af40: 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63  "Disconnecting c
af50: 61 72 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64  ard");.....SCard
af60: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
af70: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
af80: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
af90: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
afa0: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
afb0: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
afc0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
afd0: 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72  n */....slot->tr
afe0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
aff0: 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65  = 1;....cackey_e
b000: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b010: 6c 6f 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  lot);.....CACKEY
b020: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
b030: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b040: 75 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e  ure");....return
b050: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
b060: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d  OKENABSENT);...}
b070: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
b080: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 65 74  UG_PRINTBUF("Ret
b090: 75 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20 72  urned Value:", r
b0a0: 65 63 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65  ecv_buf, recv_le
b0b0: 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c  n);...if (recv_l
b0c0: 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d  en < 2) {.../* M
b0d0: 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20  inimal response 
b0e0: 6c 65 6e 67 74 68 20 69 73 20 32 20 62 79 74 65  length is 2 byte
b0f0: 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  s, returning in 
b100: 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43  failure */...CAC
b110: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b120: 28 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73  ("Response too s
b130: 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20  mall, returning 
b140: 69 6e 20 66 61 69 6c 75 72 65 20 28 72 65 63 76  in failure (recv
b150: 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75  _len = %lu)", (u
b160: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
b170: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45  cv_len);..../* E
b180: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
b190: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
b1a0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b1b0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72  tion(slot);....r
b1c0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
b1d0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
b1e0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
b1f0: 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09  result code */..
b200: 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f  major_rc = recv_
b210: 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32  buf[recv_len - 2
b220: 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72  ];..minor_rc = r
b230: 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e  ecv_buf[recv_len
b240: 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65 73 70   - 1];..if (resp
b250: 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 63  code) {...*respc
b260: 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20  ode = (major_rc 
b270: 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63  << 8) | minor_rc
b280: 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74  ;..}.../* Adjust
b290: 20 6d 65 73 73 61 67 65 20 62 75 66 66 65 72 20   message buffer 
b2a0: 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20  */..recv_len -= 
b2b0: 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74 65  2;.../* Add byte
b2c0: 73 20 74 6f 20 72 65 74 75 72 6e 20 76 61 6c 75  s to return valu
b2d0: 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61  e */..tmp_respda
b2e0: 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20  ta_len = 0;..if 
b2f0: 28 72 65 73 70 64 61 74 61 20 26 26 20 72 65 73  (respdata && res
b300: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74  pdata_len) {...t
b310: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  mp_respdata_len 
b320: 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  = *respdata_len;
b330: 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
b340: 79 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  y = *respdata_le
b350: 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  n;....if (recv_l
b360: 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f  en < bytes_to_co
b370: 70 79 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  py) {....bytes_t
b380: 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65  o_copy = recv_le
b390: 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  n;...}....CACKEY
b3a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
b3b0: 6f 70 79 69 6e 67 20 25 6c 75 20 62 79 74 65 73  opying %lu bytes
b3c0: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 28   to the buffer (
b3d0: 72 65 63 76 27 64 20 25 6c 75 20 62 79 74 65 73  recv'd %lu bytes
b3e0: 2c 20 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62  , but only %lu b
b3f0: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 6f 75 72  ytes left in our
b400: 20 62 75 66 66 65 72 29 22 2c 20 28 75 6e 73 69   buffer)", (unsi
b410: 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73  gned long) bytes
b420: 5f 74 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67  _to_copy, (unsig
b430: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
b440: 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
b450: 6e 67 29 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  ng) *respdata_le
b460: 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65  n);....memcpy(re
b470: 73 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66  spdata, recv_buf
b480: 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  , bytes_to_copy)
b490: 3b 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20  ;...respdata += 
b4a0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a  bytes_to_copy;..
b4b0: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  ..*respdata_len 
b4c0: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
b4d0: 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  ...tmp_respdata_
b4e0: 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f  len -= bytes_to_
b4f0: 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  copy;..} else {.
b500: 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21  ..if (recv_len !
b510: 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
b520: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
b530: 68 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75  hrowing away %lu
b540: 20 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20   bytes, nowhere 
b550: 74 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28  to put them!", (
b560: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
b570: 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d  ecv_len);...}..}
b580: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20  ...if (major_rc 
b590: 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20  == 0x61) {.../* 
b5a0: 57 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20  We need to READ 
b5b0: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
b5c0: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
b5d0: 20 72 65 61 64 20 72 65 71 75 69 72 65 64 22 29   read required")
b5e0: 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72  ;....if (minor_r
b5f0: 63 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  c == 0x00) {....
b600: 6d 69 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45  minor_rc = CACKE
b610: 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a  Y_APDU_MTU;...}.
b620: 0a 09 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f  ...pcsc_getresp_
b630: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
b640: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
b650: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
b660: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  , GSCIS_INSTR_GE
b670: 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30  T_RESPONSE, 0x00
b680: 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c  , 0x00, 0, NULL,
b690: 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63   minor_rc, respc
b6a0: 6f 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26  ode, respdata, &
b6b0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
b6c0: 29 3b 0a 0a 09 09 69 66 20 28 70 63 73 63 5f 67  );....if (pcsc_g
b6d0: 65 74 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41  etresp_ret != CA
b6e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
b6f0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
b700: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
b710: 20 72 65 61 64 20 66 61 69 6c 65 64 21 20 20 52   read failed!  R
b720: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b730: 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e  ure");...../* En
b740: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
b750: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61  saction */....ca
b760: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b770: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
b780: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70  if (pcsc_getresp
b790: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
b7a0: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
b7b0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b7c0: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a  _PCSC_E_RETRY);.
b7d0: 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
b7e0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
b7f0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69  NERIC);...}....i
b800: 66 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  f (respdata_len)
b810: 20 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f   {....*respdata_
b820: 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64  len += tmp_respd
b830: 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ata_len;...}....
b840: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b850: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b860: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
b870: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b880: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b890: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
b8a0: 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 62 75  g in success (bu
b8b0: 66 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c 65  ffer read comple
b8c0: 74 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e 28  te)");...return(
b8d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
b8e0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53  );..}.../* End S
b8f0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b900: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
b910: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
b920: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a  slot);...if (maj
b930: 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20 7b  or_rc == 0x90) {
b940: 0a 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f  .../* Success */
b950: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b960: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
b970: 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d 61  g in success (ma
b980: 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22 29  jor_rc = 0x90)")
b990: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
b9a0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
b9b0: 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
b9c0: 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 52  G_PRINTF("APDU R
b9d0: 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
b9e0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
b9f0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75  ailure");...retu
ba00: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
ba10: 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a  _GENERIC);.}../*
ba20: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
ba30: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
ba40: 65 79 5f 67 65 74 5f 64 61 74 61 28 73 74 72 75  ey_get_data(stru
ba50: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
ba60: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
ba70: 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a  har *buffer, siz
ba80: 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67  e_t count, unsig
ba90: 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29  ned char oid[3])
baa0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
bab0: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
bac0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
bad0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
bae0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
baf0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
bb00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
bb10: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20  uffer. *        
bb20: 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a   [OUT] Buffer. *
bb30: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 63  . *     size_t c
bb40: 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20 20  ount. *         
bb50: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
bb60: 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  to attempt to re
bb70: 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  ad. *. *     uns
bb80: 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33  igned char oid[3
bb90: 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33 2d 62  ]. *         3-b
bba0: 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61 64 0a  yte OID to read.
bbb0: 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20   *. *. * RETURN 
bbc0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69  VALUE. *     Thi
bbd0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
bbe0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
bbf0: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
bc00: 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65  read, or -1 on e
bc10: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45  rror.. *. * NOTE
bc20: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
bc30: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a  . */.static ssiz
bc40: 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64  e_t cackey_get_d
bc50: 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65  ata(struct cacke
bc60: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
bc70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
bc80: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
bc90: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
bca0: 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69   oid[3]) {..unsi
bcb0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
bcc0: 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  r_p;..size_t ini
bcd0: 74 5f 63 6f 75 6e 74 3b 0a 0a 09 73 69 7a 65 5f  t_count;...size_
bce0: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 73 69  t offset = 0, si
bcf0: 7a 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ze;..unsigned ch
bd00: 61 72 20 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43  ar cmd[] = {0x5C
bd10: 2c 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78  , 0x03, 0x00, 0x
bd20: 30 30 2c 20 30 78 30 30 7d 3b 0a 09 75 69 6e 74  00, 0x00};..uint
bd30: 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09  16_t respcode;..
bd40: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69  int send_ret;..i
bd50: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  nt idx;...CACKEY
bd60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
bd70: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74  alled.");...init
bd80: 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a  _count = count;.
bd90: 0a 09 63 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30  ..cmd[2] = oid[0
bda0: 5d 3b 0a 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64  ];..cmd[3] = oid
bdb0: 5b 31 5d 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f  [1];..cmd[4] = o
bdc0: 69 64 5b 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20  id[2];.../* 256 
bdd0: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  to indicate the 
bde0: 6c 61 72 67 65 73 74 20 6d 65 73 73 61 67 65 20  largest message 
bdf0: 73 69 7a 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61  size -- not clea
be00: 72 20 69 66 20 74 68 69 73 20 77 69 6c 6c 20 77  r if this will w
be10: 6f 72 6b 20 77 69 74 68 20 61 6c 6c 20 6d 65 73  ork with all mes
be20: 73 61 67 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72  sages */..send_r
be30: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
be40: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
be50: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
be60: 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f   NISTSP800_73_3_
be70: 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41 2c 20  INSTR_GET_DATA, 
be80: 30 78 33 46 2c 20 30 78 46 46 2c 20 73 69 7a 65  0x3F, 0xFF, size
be90: 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35  of(cmd), cmd, 25
bea0: 36 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75  6, &respcode, bu
beb0: 66 66 65 72 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a  ffer, &count);..
bec0: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
bed0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52   CACKEY_PCSC_E_R
bee0: 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59  ETRY) {...CACKEY
bef0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
bf00: 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c  DPU Sending fail
bf10: 65 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61  ed, retrying rea
bf20: 64 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 72  d buffer");....r
bf30: 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 67 65 74  eturn(cackey_get
bf40: 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66  _data(slot, buff
bf50: 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20  er, init_count, 
bf60: 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  oid));..}...if (
bf70: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
bf80: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
bf90: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bfa0: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65  RINTF("cackey_se
bfb0: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64  nd_apdu() failed
bfc0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
bfd0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
bfe0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6f 66  urn(-1);..}...of
bff0: 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a  fset += count;..
c000: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
c010: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
c020: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
c030: 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f  ..if (offset > _
c040: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
c050: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
c060: 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74  G_PRINTF("Offset
c070: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
c080: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
c090: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
c0a0: 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74  ax = %li, offset
c0b0: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
c0c0: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
c0d0: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
c0e0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72  g) offset);....r
c0f0: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
c100: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
c110: 69 66 20 28 6f 66 66 73 65 74 20 3c 20 32 29 20  if (offset < 2) 
c120: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c130: 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45  _PRINTF("APDU GE
c140: 54 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20  T DATA returned 
c150: 25 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68  %lu bytes, which
c160: 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f   is too short fo
c170: 72 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70  r a BER-TLV resp
c180: 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64  onse", (unsigned
c190: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
c1a0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c1b0: 7d 0a 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62  }...buffer_p = b
c1c0: 75 66 66 65 72 3b 0a 09 69 66 20 28 2a 62 75 66  uffer;..if (*buf
c1d0: 66 65 72 5f 70 20 21 3d 20 30 78 35 33 29 20 7b  fer_p != 0x53) {
c1e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c1f0: 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54  PRINTF("APDU GET
c200: 20 44 41 54 41 20 64 69 64 20 6e 6f 74 20 72 65   DATA did not re
c210: 74 75 72 6e 20 61 20 42 45 52 2d 54 4c 56 20 77  turn a BER-TLV w
c220: 69 74 68 20 74 61 67 20 35 33 2e 20 20 54 61 67  ith tag 53.  Tag
c230: 20 3d 20 25 30 32 78 22 2c 20 28 75 6e 73 69 67   = %02x", (unsig
c240: 6e 65 64 20 69 6e 74 29 20 2a 62 75 66 66 65 72  ned int) *buffer
c250: 5f 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  _p);....return(-
c260: 31 29 3b 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70  1);..}..buffer_p
c270: 2b 2b 3b 0a 0a 09 69 66 20 28 28 2a 62 75 66 66  ++;...if ((*buff
c280: 65 72 5f 70 20 26 20 30 78 38 30 29 20 3d 3d 20  er_p & 0x80) == 
c290: 30 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d  0x80) {...size =
c2a0: 20 30 3b 0a 09 09 69 64 78 20 3d 20 28 2a 62 75   0;...idx = (*bu
c2b0: 66 66 65 72 5f 70 20 26 20 30 78 37 66 29 3b 0a  ffer_p & 0x7f);.
c2c0: 0a 09 09 69 66 20 28 28 28 62 75 66 66 65 72 5f  ...if (((buffer_
c2d0: 70 20 2d 20 62 75 66 66 65 72 29 20 2b 20 69 64  p - buffer) + id
c2e0: 78 29 20 3e 3d 20 6f 66 66 73 65 74 29 20 7b 0a  x) >= offset) {.
c2f0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c300: 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65  PRINTF("Malforme
c310: 64 20 42 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e  d BER value -- n
c320: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
c330: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 72 65 61  available to rea
c340: 64 20 6c 65 6e 67 74 68 22 29 3b 0a 0a 09 09 09  d length");.....
c350: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
c360: 0a 09 09 66 6f 72 20 28 3b 20 69 64 78 20 3e 20  ...for (; idx > 
c370: 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62  0; idx--) {....b
c380: 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09 09 73 69  uffer_p++;....si
c390: 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a  ze <<= 8;....siz
c3a0: 65 20 7c 3d 20 2a 62 75 66 66 65 72 5f 70 3b 0a  e |= *buffer_p;.
c3b0: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
c3c0: 73 69 7a 65 20 3d 20 2a 62 75 66 66 65 72 5f 70  size = *buffer_p
c3d0: 3b 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70 2b 2b  ;..}..buffer_p++
c3e0: 3b 0a 0a 09 69 66 20 28 28 28 62 75 66 66 65 72  ;...if (((buffer
c3f0: 5f 70 20 2d 20 62 75 66 66 65 72 29 20 2b 20 73  _p - buffer) + s
c400: 69 7a 65 29 20 21 3d 20 6f 66 66 73 65 74 29 20  ize) != offset) 
c410: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c420: 5f 50 52 49 4e 54 46 28 22 45 6e 74 69 72 65 20  _PRINTF("Entire 
c430: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 63 6f  buffer is not co
c440: 6e 73 75 6d 65 64 21 22 29 3b 0a 0a 09 09 69 66  nsumed!");....if
c450: 20 28 28 28 62 75 66 66 65 72 5f 70 20 2d 20 62   (((buffer_p - b
c460: 75 66 66 65 72 29 20 2b 20 73 69 7a 65 29 20 3e  uffer) + size) >
c470: 20 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41   offset) {....CA
c480: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c490: 46 28 22 45 6e 63 6f 64 65 64 20 73 69 7a 65 20  F("Encoded size 
c4a0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c4b0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61  the amount of da
c4c0: 74 61 20 72 65 61 64 2c 20 64 72 6f 70 70 69 6e  ta read, droppin
c4d0: 67 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  g");.....return(
c4e0: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 65  -1);...}..}...me
c4f0: 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c 20 62 75  mmove(buffer, bu
c500: 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 0a  ffer_p, size);..
c510: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c520: 49 4e 54 42 55 46 28 22 47 45 54 20 44 41 54 41  INTBUF("GET DATA
c530: 20 72 65 73 75 6c 74 22 2c 20 62 75 66 66 65 72   result", buffer
c540: 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45  , size);...CACKE
c550: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c560: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
c570: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
c580: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
c590: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09   long) size);...
c5a0: 72 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a  return(size);.}.
c5b0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
c5c0: 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63   *     ssize_t c
c5d0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
c5e0: 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  r(struct cackey_
c5f0: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
c600: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c610: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c  r, size_t count,
c620: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
c630: 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e  _or_v, size_t in
c640: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20  itial_offset);. 
c650: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c660: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c670: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
c680: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
c690: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
c6a0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
c6b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c6c0: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  er. *         [O
c6d0: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a  UT] Buffer. *. *
c6e0: 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e       size_t coun
c6f0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  t. *         Num
c700: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
c710: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a  attempt to read.
c720: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
c730: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20  ed char t_or_v. 
c740: 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  *         Select
c750: 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28 30   the T-buffer (0
c760: 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28  1) or V-buffer (
c770: 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  02) to read from
c780: 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  .  . *. *     si
c790: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
c7a0: 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  set. *         S
c7b0: 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73 65  pecify the offse
c7c0: 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72  t to begin the r
c7d0: 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20  ead from. *. *. 
c7e0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
c7f0: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
c800: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
c810: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c820: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f  actually read, o
c830: 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20  r -1 on error.. 
c840: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c850: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
c860: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
c870: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
c880: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c890: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
c8a0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
c8b0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75   size_t count, u
c8c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
c8d0: 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74  r_v, size_t init
c8e0: 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75  ial_offset) {..u
c8f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e  nsigned char *in
c900: 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a 65  it_buffer;..size
c910: 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09  _t init_count;..
c920: 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74  size_t init_init
c930: 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69  ial_offset;...si
c940: 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c  ze_t offset = 0,
c950: 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78   max_offset, max
c960: 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65  _count;..unsigne
c970: 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09  d char cmd[2];..
c980: 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
c990: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
c9a0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
c9b0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
c9c0: 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65  ");...init_buffe
c9d0: 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e 69  r = buffer;..ini
c9e0: 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b  t_count = count;
c9f0: 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f  ..init_initial_o
ca00: 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f  ffset = initial_
ca10: 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66  offset;...max_of
ca20: 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d  fset = count;..m
ca30: 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45  ax_count = CACKE
ca40: 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66  Y_APDU_MTU;...if
ca50: 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26   (t_or_v != 1 &&
ca60: 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a   t_or_v != 2) {.
ca70: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ca80: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54  RINTF("Invalid T
ca90: 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72 20   or V parameter 
caa0: 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72  specified, retur
cab0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
cac0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
cad0: 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20  ;..}...cmd[0] = 
cae0: 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20  t_or_v;...while 
caf0: 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73  (1) {...if (offs
cb00: 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74  et >= max_offset
cb10: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
cb20: 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66  BUG_PRINTF("Buff
cb30: 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65  er too small, re
cb40: 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20  turning what we 
cb50: 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72  got...");.....br
cb60: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e  eak;...}....coun
cb70: 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d  t = max_offset -
cb80: 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63   offset;...if (c
cb90: 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74  ount > max_count
cba0: 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d  ) {....count = m
cbb0: 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09  ax_count;...}...
cbc0: 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b  .cmd[1] = count;
cbd0: 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
cbe0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
cbf0: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
cc00: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
cc10: 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52  M, GSCIS_INSTR_R
cc20: 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e  EAD_BUFFER, ((in
cc30: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f  itial_offset + o
cc40: 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30  ffset) >> 8) & 0
cc50: 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66  xff, (initial_of
cc60: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26  fset + offset) &
cc70: 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d   0xff, sizeof(cm
cc80: 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26  d), cmd, 0x00, &
cc90: 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72  respcode, buffer
cca0: 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e   + offset, &coun
ccb0: 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  t);....if (send_
ccc0: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
ccd0: 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09  SC_E_RETRY) {...
cce0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ccf0: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
cd00: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79  ng failed, retry
cd10: 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72 22  ing read buffer"
cd20: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 61  );.....return(ca
cd30: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
cd40: 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66  (slot, init_buff
cd50: 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20  er, init_count, 
cd60: 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69  t_or_v, init_ini
cd70: 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09  tial_offset));..
cd80: 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  .}....if (send_r
cd90: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
cda0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20  C_S_OK) {....if 
cdb0: 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
cdc0: 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d  A86) {.....if (m
cdd0: 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b  ax_count == 1) {
cde0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
cdf0: 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e  .}......max_coun
ce00: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20  t = max_count / 
ce10: 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  2;......continue
ce20: 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
ce30: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ce40: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
ce50: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
ce60: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
ce70: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
ce80: 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74  );...}....offset
ce90: 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66   += count;....if
cea0: 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f   (count < max_co
ceb0: 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  unt) {....CACKEY
cec0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
ced0: 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75  hort read -- cou
cee0: 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20  nt = %i, cmd[1] 
cef0: 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75  = %i", (int) cou
cf00: 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d  nt, (int) cmd[1]
cf10: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
cf20: 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  }..}..#ifdef CAC
cf30: 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
cf40: 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
cf50: 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73  ZE_MAX..if (offs
cf60: 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  et > _POSIX_SSIZ
cf70: 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
cf80: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cf90: 4f 66 66 73 65 74 20 65 78 63 65 65 64 73 20 6d  Offset exceeds m
cfa0: 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
cfb0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
cfc0: 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
cfd0: 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20  offset = %lu)", 
cfe0: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
cff0: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
d000: 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29  ed long) offset)
d010: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
d020: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
d030: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
d040: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
d050: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
d060: 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73 22   read %lu bytes"
d070: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
d080: 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74  ) offset);...ret
d090: 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a  urn(offset);.}..
d0a0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
d0b0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
d0c0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
d0d0: 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63  pplet(struct cac
d0e0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
d0f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
d100: 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c  id, size_t aid_l
d110: 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  en);. *. * ARGUM
d120: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
d130: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d140: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
d150: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
d160: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
d170: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
d180: 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20   *aid. *        
d190: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
d1a0: 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20  ng Applet ID to 
d1b0: 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20  select. *. *    
d1c0: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a   size_t aid_len.
d1d0: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65   *         Numbe
d1e0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
d1f0: 65 20 22 61 69 64 22 20 28 41 70 70 6c 65 74 20  e "aid" (Applet 
d200: 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a  ID) parameter. *
d210: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
d220: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
d230: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
d240: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
d250: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
d260: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
d270: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
d280: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
d290: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
d2a0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
d2b0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
d2c0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
d2d0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
d2e0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
d2f0: 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20  aid_len) {..int 
d300: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
d310: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d320: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
d330: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d340: 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61  BUF("Selecting a
d350: 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69  pplet:", aid, ai
d360: 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72  d_len);...send_r
d370: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d380: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d390: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
d3a0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
d3b0: 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d  ECT, GSCIS_PARAM
d3c0: 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20  _SELECT_APPLET, 
d3d0: 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61  0x00, aid_len, a
d3e0: 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  id, 0x00, NULL, 
d3f0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  NULL, NULL);...i
d400: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
d410: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
d420: 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  RY) {...CACKEY_D
d430: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
d440: 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64  U Sending failed
d450: 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c 65 63  , retrying selec
d460: 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72  t applet");....r
d470: 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c  eturn(cackey_sel
d480: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
d490: 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b   aid, aid_len));
d4a0: 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72  ..}...if (send_r
d4b0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
d4c0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
d4d0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d4e0: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "Failed to open 
d4f0: 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e  applet, returnin
d500: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
d510: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
d520: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
d530: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
d540: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63  BUG_PRINTF("Succ
d550: 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65  essfully selecte
d560: 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75  d file");...retu
d570: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
d580: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
d590: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
d5a0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
d5b0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
d5c0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
d5d0: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
d5e0: 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ef);. *. * ARGUM
d5f0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
d600: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d610: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
d620: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
d630: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
d640: 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20     uint16_t ef. 
d650: 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e  *         Elemen
d660: 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65  tal File to sele
d670: 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ct. *. * RETURN 
d680: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
d690: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
d6a0: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
d6b0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
d6c0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
d6d0: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
d6e0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
d6f0: 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65  s selects an Ele
d700: 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46  mentary File (EF
d710: 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 72  ) under the curr
d720: 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20  ently selected. 
d730: 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64 20  *     Dedicated 
d740: 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20  File (DF). *. * 
d750: 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68      Typically th
d760: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
d770: 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65  er selecting the
d780: 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20   correct Applet 
d790: 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61  (using. *     ca
d7a0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
d7b0: 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73  et) for VM cards
d7c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
d7d0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
d7e0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
d7f0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
d800: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
d810: 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ef) {..unsigned 
d820: 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b  char fid_buf[2];
d830: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
d840: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d850: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
d860: 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ;.../* Open the 
d870: 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20  elementary file 
d880: 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d  */..fid_buf[0] =
d890: 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66   (ef >> 8) & 0xf
d8a0: 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d  f;..fid_buf[1] =
d8b0: 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41   ef & 0xff;...CA
d8c0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d8d0: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c  F("Selecting fil
d8e0: 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69  e: %04lx", (unsi
d8f0: 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a  gned long) ef);.
d900: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
d910: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
d920: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
d930: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
d940: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30  NSTR_SELECT, 0x0
d950: 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28  2, 0x0C, sizeof(
d960: 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75  fid_buf), fid_bu
d970: 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e  f, 0x00, NULL, N
d980: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
d990: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
d9a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
d9b0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d9c0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
d9d0: 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74  o open file, ret
d9e0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d9f0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
da00: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
da10: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
da20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
da30: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
da40: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
da50: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
da60: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
da70: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
da80: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
da90: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
daa0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
dab0: 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20  y *root);. *. * 
dac0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
dad0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74   struct cackey_t
dae0: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a  lv_entity *root.
daf0: 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20   *         Root 
db00: 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20  of the TLV list 
db10: 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e 67  to start freeing
db20: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
db30: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
db40: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
db50: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
db60: 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c   frees the TLV l
db70: 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74  inked listed ret
db80: 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20  urned from. *   
db90: 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74    "cackey_read_t
dba0: 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  lv". *. */.stati
dbb0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
dbc0: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ee_tlv(struct ca
dbd0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
dbe0: 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *root) {..struct
dbf0: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
dc00: 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b  ty *curr, *next;
dc10: 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
dc20: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  ULL) {...return;
dc30: 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20  ..}...for (curr 
dc40: 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75  = root; curr; cu
dc50: 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e  rr = next) {...n
dc60: 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78  ext = curr->_nex
dc70: 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  t;....switch (cu
dc80: 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61  rr->tag) {....ca
dc90: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52  se GSCIS_TAG_ACR
dca0: 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20  _TABLE:....case 
dcb0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
dcc0: 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63  ICATE:.....if (c
dcd0: 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09  urr->value) {...
dce0: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
dcf0: 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  lue);.....}.....
dd00: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
dd10: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
dd20: 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e  :.....if (curr->
dd30: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b  value_cardurl) {
dd40: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d  ......free(curr-
dd50: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b  >value_cardurl);
dd60: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
dd70: 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75  ;...}....free(cu
dd80: 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  rr);..}...return
dd90: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
dda0: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
ddb0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
ddc0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
ddd0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
dde0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
ddf0: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
de00: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
de10: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
de20: 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
de30: 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ad_tlv(struct ca
de40: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
de50: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
de60: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75  y_tlv_entity *cu
de70: 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74  rr_entity, *root
de80: 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d   = NULL, *last =
de90: 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64   NULL;..unsigned
dea0: 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32   char tlen_buf[2
deb0: 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34  ], tval_buf[1024
dec0: 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *tval;..unsig
ded0: 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75  ned char vlen_bu
dee0: 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38  f[2], vval_buf[8
def0: 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e  192], *vval;..un
df00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
df10: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
df20: 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  ong tmpbuflen;..
df30: 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c  ssize_t tlen, vl
df40: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  en;..ssize_t rea
df50: 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f  d_ret;..size_t o
df60: 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66  ffset_t = 0, off
df70: 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69  set_v = 0;..unsi
df80: 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a 09  gned char tag;..
df90: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23  size_t length;.#
dfa0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
dfb0: 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
dfc0: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ret;.#endif...CA
dfd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
dfe0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
dff0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
e000: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
e010: 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, tlen_buf, si
e020: 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20  zeof(tlen_buf), 
e030: 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69  1, offset_t);..i
e040: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
e050: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29  izeof(tlen_buf))
e060: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e070: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
e080: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
e090: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e0a0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e0b0: 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65  .}...tlen = (tle
e0c0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
e0d0: 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   tlen_buf[0];...
e0e0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
e0f0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
e100: 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, vlen_buf, si
e110: 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20  zeof(vlen_buf), 
e120: 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69  2, offset_v);..i
e130: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
e140: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29  izeof(vlen_buf))
e150: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e160: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
e170: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
e180: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e190: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e1a0: 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65  .}...vlen = (vle
e1b0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
e1c0: 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   vlen_buf[0];...
e1d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e1e0: 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20  NTF("Tag Length 
e1f0: 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e  = %lu, Value Len
e200: 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  gth = %lu", (uns
e210: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e  igned long) tlen
e220: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e230: 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65  ) vlen);...offse
e240: 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65  t_t += 2;..offse
e250: 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28  t_v += 2;...if (
e260: 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76  tlen > sizeof(tv
e270: 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  al_buf)) {...CAC
e280: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e290: 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20  ("Tag length is 
e2a0: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72  too large, retur
e2b0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
e2c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
e2d0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65  L);..}...if (vle
e2e0: 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f  n > sizeof(vval_
e2f0: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
e300: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56  _DEBUG_PRINTF("V
e310: 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74  alue length is t
e320: 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e  oo large, return
e330: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e340: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e350: 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74  );..}...read_ret
e360: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
e370: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c  uffer(slot, tval
e380: 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f  _buf, tlen, 1, o
e390: 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72  ffset_t);..if (r
e3a0: 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29  ead_ret != tlen)
e3b0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e3c0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
e3d0: 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20   to read entire 
e3e0: 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  T-buffer, return
e3f0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e400: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e410: 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74  );..}...read_ret
e420: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
e430: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c  uffer(slot, vval
e440: 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f  _buf, vlen, 2, o
e450: 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72  ffset_v);..if (r
e460: 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29  ead_ret != vlen)
e470: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e480: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
e490: 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20   to read entire 
e4a0: 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  V-buffer, return
e4b0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e4c0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e4d0: 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74  );..}...tval = t
e4e0: 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d  val_buf;..vval =
e4f0: 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c   vval_buf;..whil
e500: 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76  e (tlen > 0 && v
e510: 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67  len > 0) {...tag
e520: 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c   = *tval;...tval
e530: 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09  ++;...tlen--;...
e540: 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78  .if (*tval == 0x
e550: 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20  ff) {....length 
e560: 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29  = (tval[2] << 8)
e570: 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74   | tval[1];....t
e580: 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65  val += 3;....tle
e590: 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65  n -= 3;...} else
e5a0: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a   {....length = *
e5b0: 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b  tval;....tval++;
e5c0: 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a  ....tlen--;...}.
e5d0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e5e0: 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20  PRINTF("Tag: %s 
e5f0: 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  (%02x)", CACKEY_
e600: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
e610: 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73  O_STR(tag), (uns
e620: 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b  igned int) tag);
e630: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e640: 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a  PRINTBUF("Value:
e650: 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  ", vval, length)
e660: 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79  ;....curr_entity
e670: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63   = NULL;...switc
e680: 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73  h (tag) {....cas
e690: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
e6a0: 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  URL:.....curr_en
e6b0: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
e6c0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
e6d0: 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  y));.....curr_en
e6e0: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
e6f0: 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  url = malloc(siz
e700: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
e710: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
e720: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  );......memcpy(c
e730: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
e740: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
e750: 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75  vval, 5);.....cu
e760: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
e770: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
e780: 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09  e = vval[5];....
e790: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
e7a0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
e7b0: 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d  ectid = (vval[6]
e7c0: 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d   << 8) | vval[7]
e7d0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
e7e0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
e7f0: 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b  ->appid = (vval[
e800: 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b  8] << 8) | vval[
e810: 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  9];......curr_en
e820: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
e830: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
e840: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
e850: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
e860: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
e870: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72  R_TABLE:.....cur
e880: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
e890: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
e8a0: 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70  ntity));.....tmp
e8b0: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e  buf = malloc(len
e8c0: 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70  gth);......memcp
e8d0: 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20  y(tmpbuf, vval, 
e8e0: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75  length);......cu
e8f0: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
e900: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
e910: 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20  ntity->length = 
e920: 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72  length;.....curr
e930: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d  _entity->value =
e940: 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72   tmpbuf;.....cur
e950: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
e960: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
e970: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
e980: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
e990: 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  E:.....curr_enti
e9a0: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
e9b0: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
e9c0: 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  );..#ifdef HAVE_
e9d0: 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c  LIBZ.....tmpbufl
e9e0: 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b  en = length * 2;
e9f0: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
ea00: 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b  lloc(tmpbuflen);
ea10: 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73  ......uncompress
ea20: 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73  _ret = uncompres
ea30: 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75  s(tmpbuf, &tmpbu
ea40: 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  flen, vval, leng
ea50: 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63  th);.....if (unc
ea60: 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a  ompress_ret != Z
ea70: 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  _OK) {......CACK
ea80: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ea90: 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d  "Failed to decom
eaa0: 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73  press, uncompres
eab0: 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 20  s() returned %i 
eac0: 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20  -- resorting to 
ead0: 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e  direct copy", un
eae0: 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a  compress_ret);..
eaf0: 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
eb00: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65   length;......me
eb10: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
eb20: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09  l, length);.....
eb30: 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
eb40: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65  BUG_PRINTBUF("De
eb50: 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c  compressed to:",
eb60: 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
eb70: 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43  en);.#else.....C
eb80: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
eb90: 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42  TF("Missing ZLIB
eba0: 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63   Support, this c
ebb0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c 69  ertificate is li
ebc0: 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22  kely useless..."
ebd0: 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65  );......tmpbufle
ebe0: 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  n = length;.....
ebf0: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
ec00: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65  val, length);.#e
ec10: 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65  ndif......curr_e
ec20: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
ec30: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
ec40: 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62  y->length = tmpb
ec50: 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f  uflen;.....curr_
ec60: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20  entity->value = 
ec70: 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72  tmpbuf;.....curr
ec80: 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d  _entity->_next =
ec90: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61   NULL;......brea
eca0: 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53  k;....case GSCIS
ecb0: 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09  _TAG_PKCS15:....
ecc0: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
ecd0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
ece0: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09  rr_entity));....
ecf0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
ed00: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
ed10: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
ed20: 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b  _byte = vval[0];
ed30: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
ed40: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
ed50: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
ed60: 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74  ...vval += lengt
ed70: 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e  h;...vlen -= len
ed80: 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72  gth;....if (curr
ed90: 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29  _entity != NULL)
eda0: 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d   {....if (root =
edb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f  = NULL) {.....ro
edc0: 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79  ot = curr_entity
edd0: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c  ;....}.....if (l
ede0: 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ast != NULL) {..
edf0: 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d  ...last->_next =
ee00: 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09   curr_entity;...
ee10: 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75  .}.....last = cu
ee20: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09  rr_entity;...}..
ee30: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29  }...return(root)
ee40: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
ee50: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
ee60: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
ee70: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
ee80: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
ee90: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
eea0: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
eeb0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  *. */.static voi
eec0: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  d cackey_free_ce
eed0: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
eee0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
eef0: 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63  *start, size_t c
ef00: 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73  ount, int free_s
ef10: 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20  tart) {..size_t 
ef20: 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74  idx;...if (start
ef30: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
ef40: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
ef50: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
ef60: 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
ef70: 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e  .if (start[idx].
ef80: 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09  certificate) {..
ef90: 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64 78  ..free(start[idx
efa0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a  ].certificate);.
efb0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65  ..}..}...if (fre
efc0: 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65  e_start) {...fre
efd0: 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72  e(start);..}...r
efe0: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
eff0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
f000: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
f010: 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
f020: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
f030: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 73  sc_identity *des
f040: 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
f050: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
f060: 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f  start, size_t co
f070: 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69  unt) {..size_t i
f080: 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20  dx;...if (start 
f090: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
f0a0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
f0b0: 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c  if (dest == NULL
f0c0: 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c  ) {...dest = mal
f0d0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65 73 74  loc(sizeof(*dest
f0e0: 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ) * count);..}..
f0f0: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
f100: 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b  dx < count; idx+
f110: 2b 29 20 7b 0a 09 09 64 65 73 74 5b 69 64 78 5d  +) {...dest[idx]
f120: 2e 69 64 5f 74 79 70 65 20 3d 20 73 74 61 72 74  .id_type = start
f130: 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 3b 0a 0a  [idx].id_type;..
f140: 09 09 73 77 69 74 63 68 20 28 64 65 73 74 5b 69  ..switch (dest[i
f150: 64 78 5d 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09  dx].id_type) {..
f160: 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
f170: 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 6d  _TYPE_CAC:.....m
f180: 65 6d 63 70 79 28 64 65 73 74 5b 69 64 78 5d 2e  emcpy(dest[idx].
f190: 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c  card.cac.applet,
f1a0: 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64   start[idx].card
f1b0: 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a  .cac.applet, siz
f1c0: 65 6f 66 28 64 65 73 74 5b 69 64 78 5d 2e 63 61  eof(dest[idx].ca
f1d0: 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
f1e0: 0a 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63  .....dest[idx].c
f1f0: 61 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 73  ard.cac.file = s
f200: 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63  tart[idx].card.c
f210: 61 63 2e 66 69 6c 65 3b 0a 09 09 09 09 62 72 65  ac.file;.....bre
f220: 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ak;....case CACK
f230: 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
f240: 09 09 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61  ....dest[idx].ca
f250: 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20  rd.piv.key_id = 
f260: 73 74 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e  start[idx].card.
f270: 70 69 76 2e 6b 65 79 5f 69 64 3b 0a 09 09 09 09  piv.key_id;.....
f280: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
f290: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
f2a0: 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65  RT_ONLY:.....bre
f2b0: 61 6b 3b 0a 09 09 7d 0a 09 09 64 65 73 74 5b 69  ak;...}...dest[i
f2c0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
f2d0: 6c 65 6e 20 3d 20 73 74 61 72 74 5b 69 64 78 5d  len = start[idx]
f2e0: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
f2f0: 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 6b 65  ;...dest[idx].ke
f300: 79 73 69 7a 65 20 3d 20 73 74 61 72 74 5b 69 64  ysize = start[id
f310: 78 5d 2e 6b 65 79 73 69 7a 65 3b 0a 0a 09 09 64  x].keysize;....d
f320: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
f330: 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 64 65  cate = malloc(de
f340: 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
f350: 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63  ate_len);...memc
f360: 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  py(dest[idx].cer
f370: 74 69 66 69 63 61 74 65 2c 20 73 74 61 72 74 5b  tificate, start[
f380: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
f390: 2c 20 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74  , dest[idx].cert
f3a0: 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d  ificate_len);..}
f3b0: 0a 0a 09 72 65 74 75 72 6e 28 64 65 73 74 29 3b  ...return(dest);
f3c0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
f3d0: 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
f3e0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
f3f0: 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
f400: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
f410: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
f420: 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
f430: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  . */.static stru
f440: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
f450: 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f  dentity *cackey_
f460: 72 65 61 64 5f 63 65 72 74 73 28 73 74 72 75 63  read_certs(struc
f470: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
f480: 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b  lot, struct cack
f490: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
f4a0: 20 2a 63 65 72 74 73 2c 20 75 6e 73 69 67 6e 65   *certs, unsigne
f4b0: 64 20 6c 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b  d long *count) {
f4c0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
f4d0: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
f4e0: 75 72 72 5f 69 64 3b 0a 09 73 74 72 75 63 74 20  urr_id;..struct 
f4f0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
f500: 79 20 2a 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63  y *ccc_tlv, *ccc
f510: 5f 63 75 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c  _curr, *app_tlv,
f520: 20 2a 61 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73   *app_curr;..uns
f530: 69 67 6e 65 64 20 63 68 61 72 20 63 63 63 5f 61  igned char ccc_a
f540: 69 64 5b 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49  id[] = {GSCIS_AI
f550: 44 5f 43 43 43 7d 2c 20 70 69 76 5f 61 69 64 5b  D_CCC}, piv_aid[
f560: 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
f570: 33 5f 33 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 75  3_3_PIV_AID};..u
f580: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69  nsigned char *pi
f590: 76 5f 6f 69 64 2c 20 70 69 76 5f 6f 69 64 5f 70  v_oid, piv_oid_p
f5a0: 69 76 61 75 74 68 5b 5d 20 3d 20 7b 4e 49 53 54  ivauth[] = {NIST
f5b0: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50  SP800_73_3_OID_P
f5c0: 49 56 41 55 54 48 7d 2c 20 70 69 76 5f 6f 69 64  IVAUTH}, piv_oid
f5d0: 5f 73 69 67 6e 61 74 75 72 65 5b 5d 20 3d 20 7b  _signature[] = {
f5e0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
f5f0: 49 44 5f 53 49 47 4e 41 54 55 52 45 7d 2c 20 70  ID_SIGNATURE}, p
f600: 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d 20  iv_oid_keymgt[] 
f610: 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  = {NISTSP800_73_
f620: 33 5f 4f 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09  3_OID_KEYMGT};..
f630: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 75  unsigned char cu
f640: 72 72 5f 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69  rr_aid[7];..unsi
f650: 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72  gned char buffer
f660: 5b 38 31 39 32 5d 3b 0a 09 75 6e 73 69 67 6e 65  [8192];..unsigne
f670: 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20  d long outidx = 
f680: 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 74  0;..cackey_ret t
f690: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a  ransaction_ret;.
f6a0: 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72 65  .ssize_t read_re
f6b0: 74 3b 0a 09 69 6e 74 20 63 65 72 74 73 5f 72 65  t;..int certs_re
f6c0: 73 69 7a 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65  sizable;..int se
f6d0: 6e 64 5f 72 65 74 2c 20 73 65 6c 65 63 74 5f 72  nd_ret, select_r
f6e0: 65 74 3b 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79  et;..int piv_key
f6f0: 2c 20 70 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20  , piv = 0;..int 
f700: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
f710: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
f720: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75  ed.");...if (cou
f730: 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
f740: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f750: 4e 54 46 28 22 63 6f 75 6e 74 20 69 73 20 4e 55  NTF("count is NU
f760: 4c 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  LL, returning in
f770: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
f780: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
f790: 0a 09 69 66 20 28 63 65 72 74 73 20 21 3d 20 4e  ..if (certs != N
f7a0: 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f  ULL) {...if (*co
f7b0: 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43  unt == 0) {....C
f7c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
f7d0: 54 46 28 22 52 65 71 75 65 73 74 65 64 20 77 65  TF("Requested we
f7e0: 20 72 65 74 75 72 6e 20 30 20 6f 62 6a 65 63 74   return 0 object
f7f0: 73 2c 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  s, short-circuit
f800: 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  ");.....return(c
f810: 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  erts);...}..}...
f820: 69 66 20 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f  if (!slot->slot_
f830: 72 65 73 65 74 29 20 7b 0a 09 09 69 66 20 28 73  reset) {...if (s
f840: 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
f850: 73 29 20 7b 0a 09 09 09 69 66 20 28 63 65 72 74  s) {....if (cert
f860: 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s == NULL) {....
f870: 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28  .certs = malloc(
f880: 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
f890: 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65   slot->cached_ce
f8a0: 72 74 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 09  rts_count);.....
f8b0: 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63  *count = slot->c
f8c0: 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e  ached_certs_coun
f8d0: 74 3b 0a 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  t;.....} else {.
f8e0: 09 09 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e  ....if (*count >
f8f0: 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65   slot->cached_ce
f900: 72 74 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  rts_count) {....
f910: 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d  ..*count = slot-
f920: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
f930: 75 6e 74 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  unt;.....}....}.
f940: 0a 09 09 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f  ....cackey_copy_
f950: 63 65 72 74 73 28 63 65 72 74 73 2c 20 73 6c 6f  certs(certs, slo
f960: 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c  t->cached_certs,
f970: 20 2a 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65   *count);.....re
f980: 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d  turn(certs);...}
f990: 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
f9a0: 63 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a  cached_certs) {.
f9b0: 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
f9c0: 72 74 73 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64  rts(slot->cached
f9d0: 5f 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61  _certs, slot->ca
f9e0: 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
f9f0: 2c 20 31 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63  , 1);....slot->c
fa00: 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55  ached_certs = NU
fa10: 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69  LL;..}.../* Begi
fa20: 6e 20 61 20 53 6d 61 72 74 43 61 72 64 20 74 72  n a SmartCard tr
fa30: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72  ansaction */..tr
fa40: 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20  ansaction_ret = 
fa50: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
fa60: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
fa70: 09 69 66 20 28 74 72 61 6e 73 61 63 74 69 6f 6e  .if (transaction
fa80: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
fa90: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
faa0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
fab0: 46 28 22 55 6e 61 62 6c 65 20 62 65 67 69 6e 20  F("Unable begin 
fac0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
fad0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
fae0: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
faf0: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ULL);..}...if (c
fb00: 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  erts == NULL) {.
fb10: 09 09 63 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63  ..certs = malloc
fb20: 28 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20  (sizeof(*certs) 
fb30: 2a 20 35 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d  * 5);...*count =
fb40: 20 35 3b 0a 09 09 63 65 72 74 73 5f 72 65 73 69   5;...certs_resi
fb50: 7a 61 62 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c  zable = 1;..} el
fb60: 73 65 20 7b 0a 09 09 63 65 72 74 73 5f 72 65 73  se {...certs_res
fb70: 69 7a 61 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a  izable = 0;..}..
fb80: 09 2f 2a 20 53 65 6c 65 63 74 20 74 68 65 20 43  ./* Select the C
fb90: 43 43 20 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65  CC Applet */..se
fba0: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
fbb0: 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
fbc0: 6f 74 2c 20 63 63 63 5f 61 69 64 2c 20 73 69 7a  ot, ccc_aid, siz
fbd0: 65 6f 66 28 63 63 63 5f 61 69 64 29 29 3b 0a 09  eof(ccc_aid));..
fbe0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
fbf0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
fc00: 29 20 7b 0a 09 09 2f 2a 20 54 72 79 20 50 49 56  ) {.../* Try PIV
fc10: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 2a 2f 0a   application */.
fc20: 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
fc30: 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65  key_select_apple
fc40: 74 28 73 6c 6f 74 2c 20 70 69 76 5f 61 69 64 2c  t(slot, piv_aid,
fc50: 20 73 69 7a 65 6f 66 28 70 69 76 5f 61 69 64 29   sizeof(piv_aid)
fc60: 29 3b 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
fc70: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
fc80: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
fc90: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fca0: 22 57 65 20 68 61 76 65 20 61 20 50 49 56 20 63  "We have a PIV c
fcb0: 61 72 64 20 2d 2d 20 6e 6f 74 20 75 73 69 6e 67  ard -- not using
fcc0: 20 74 68 65 20 43 43 43 2c 20 70 75 6c 6c 69 6e   the CCC, pullin
fcd0: 67 20 70 72 65 2d 73 65 6c 65 63 74 65 64 20 6b  g pre-selected k
fce0: 65 79 73 22 29 3b 0a 0a 09 09 09 70 69 76 20 3d  eys");.....piv =
fcf0: 20 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09   1;...} else {..
fd00: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
fd10: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
fd20: 20 73 65 6c 65 63 74 20 43 43 43 20 41 70 70 6c   select CCC Appl
fd30: 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  et, returning in
fd40: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
fd50: 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61  /* Terminate Sma
fd60: 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtCard Transacti
fd70: 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
fd80: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
fd90: 73 6c 6f 74 29 3b 0a 0a 09 09 09 72 65 74 75 72  slot);.....retur
fda0: 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d 0a  n(NULL);...}..}.
fdb0: 0a 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09 66  ..if (piv) {...f
fdc0: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
fdd0: 20 3c 20 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09   < 3; idx++) {..
fde0: 09 09 73 77 69 74 63 68 20 28 69 64 78 29 20 7b  ..switch (idx) {
fdf0: 0a 09 09 09 09 63 61 73 65 20 30 3a 0a 09 09 09  .....case 0:....
fe00: 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f  ..piv_oid = piv_
fe10: 6f 69 64 5f 70 69 76 61 75 74 68 3b 0a 09 09 09  oid_pivauth;....
fe20: 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54  ..piv_key = NIST
fe30: 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50  SP800_78_3_KEY_P
fe40: 49 56 41 55 54 48 3b 0a 09 09 09 09 09 62 72 65  IVAUTH;......bre
fe50: 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a  ak;.....case 1:.
fe60: 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70  .....piv_oid = p
fe70: 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65  iv_oid_signature
fe80: 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d  ;......piv_key =
fe90: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
fea0: 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09  KEY_SIGNATURE;..
feb0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63  ....break;.....c
fec0: 61 73 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f  ase 2:......piv_
fed0: 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65  oid = piv_oid_ke
fee0: 79 6d 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b  ymgt;......piv_k
fef0: 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
ff00: 38 5f 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a  8_3_KEY_KEYMGT;.
ff10: 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
ff20: 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20 3d 20  .....read_ret = 
ff30: 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61 28  cackey_get_data(
ff40: 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 73 69  slot, buffer, si
ff50: 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20 70 69  zeof(buffer), pi
ff60: 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20 28  v_oid);.....if (
ff70: 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
ff80: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
ff90: 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64 20  ..}.....curr_id 
ffa0: 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
ffb0: 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a  ;....outidx++;..
ffc0: 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73  ...curr_id->keys
ffd0: 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72  ize = -1;....cur
ffe0: 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20  r_id->id_type = 
fff0: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50  CACKEY_ID_TYPE_P
10000 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  IV;....curr_id->
10010 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20  card.piv.key_id 
10020 3d 20 70 69 76 5f 6b 65 79 3b 0a 0a 09 09 09 63  = piv_key;.....c
10030 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10040 61 74 65 5f 6c 65 6e 20 3d 20 72 65 61 64 5f 72  ate_len = read_r
10050 65 74 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e  et;....curr_id->
10060 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61  certificate = ma
10070 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65  lloc(curr_id->ce
10080 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
10090 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
100a0 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  d->certificate, 
100b0 62 75 66 66 65 72 20 2b 20 34 2c 20 63 75 72 72  buffer + 4, curr
100c0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
100d0 5f 6c 65 6e 20 2d 20 34 29 3b 20 2f 2a 20 58 58  _len - 4); /* XX
100e0 58 20 54 4f 44 4f 20 50 49 56 20 28 2d 34 20 68  X TODO PIV (-4 h
100f0 65 61 64 65 72 2c 20 2d 35 20 74 72 61 69 6c 65  eader, -5 traile
10100 72 20 3d 3d 20 77 68 79 20 3f 29 20 2a 2f 0a 09  r == why ?) */..
10110 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  ..curr_id->certi
10120 66 69 63 61 74 65 5f 6c 65 6e 20 2d 3d 20 34 3b  ficate_len -= 4;
10130 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
10140 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 2d 3d 20  tificate_len -= 
10150 35 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  5;...}..} else {
10160 0a 09 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74  .../* Read all t
10170 68 65 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20  he applets from 
10180 74 68 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f  the CCC's TLV */
10190 0a 09 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63  ...ccc_tlv = cac
101a0 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f  key_read_tlv(slo
101b0 74 29 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66  t);..../* Look f
101c0 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61 74  or CARDURLs that
101d0 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50   coorespond to P
101e0 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09  KI applets */...
101f0 66 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20  for (ccc_curr = 
10200 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72  ccc_tlv; ccc_cur
10210 72 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r; ccc_curr = cc
10220 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  c_curr->_next) {
10230 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10240 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
10250 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41  ag: %s ... ", CA
10260 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
10270 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  TAG_TO_STR(ccc_c
10280 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09  urr->tag));.....
10290 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61  if (ccc_curr->ta
102a0 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43  g != GSCIS_TAG_C
102b0 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 09 43 41  ARDURL) {.....CA
102c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
102d0 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
102e0 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
102f0 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
10300 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69  s)");......conti
10310 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  nue;....}.....if
10320 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   ((ccc_curr->val
10330 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
10340 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54 4c 56  ype & CACKEY_TLV
10350 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43  _APP_PKI) != CAC
10360 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29  KEY_TLV_APP_PKI)
10370 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10380 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
10390 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
103a0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
103b0 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74  t PKI applets, t
103c0 68 69 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f  his applet suppo
103d0 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20  rts: %s/%02x)", 
103e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
103f0 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
10400 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
10410 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
10420 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  e), (unsigned in
10430 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  t) ccc_curr->val
10440 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
10450 79 70 65 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69  ype);......conti
10460 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  nue;....}.....CA
10470 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10480 42 55 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f  BUF("RID:", ccc_
10490 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
104a0 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66  url->rid, sizeof
104b0 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
104c0 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b  _cardurl->rid));
104d0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
104e0 5f 50 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d  _PRINTF("AppID =
104f0 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b   %s/%04lx", CACK
10500 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42  EY_DEBUG_FUNC_OB
10510 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  JID_TO_STR(ccc_c
10520 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10530 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73  rl->appid), (uns
10540 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f  igned long) ccc_
10550 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10560 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09  url->appid);....
10570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10580 4e 54 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20  NTF("ObjectID = 
10590 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45  %s/%04lx", CACKE
105a0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
105b0 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  ID_TO_STR(ccc_cu
105c0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
105d0 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75  l->objectid), (u
105e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63  nsigned long) cc
105f0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10600 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
10610 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ;.....memcpy(cur
10620 72 5f 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d  r_aid, ccc_curr-
10630 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10640 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f  rid, sizeof(ccc_
10650 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10660 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63  url->rid));....c
10670 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63  urr_aid[sizeof(c
10680 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20  urr_aid) - 2] = 
10690 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
106a0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20  _cardurl->appid 
106b0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09  >> 8) & 0xff;...
106c0 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66  .curr_aid[sizeof
106d0 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20  (curr_aid) - 1] 
106e0 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
106f0 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
10700 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20   & 0xff;...../* 
10710 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70  Select found app
10720 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65  let ... */....se
10730 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  lect_ret = cacke
10740 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
10750 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20  slot, curr_aid, 
10760 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
10770 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74  );....if (select
10780 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
10790 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09  CSC_S_OK) {.....
107a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
107b0 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
107c0 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
107d0 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
107e0 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
107f0 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
10800 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e  e;....}...../* .
10810 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 66  .. and object (f
10820 69 6c 65 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63  ile) */....selec
10830 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
10840 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c  elect_file(slot,
10850 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
10860 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
10870 69 64 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65  id);....if (sele
10880 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
10890 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
108a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
108b0 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
108c0 20 73 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b   select file, sk
108d0 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
108e0 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
108f0 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
10900 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50  e;....}...../* P
10910 72 6f 63 65 73 73 20 74 68 69 73 20 66 69 6c 65  rocess this file
10920 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66  's TLV looking f
10930 6f 72 20 63 65 72 74 69 66 69 63 61 74 65 73 20  or certificates 
10940 2a 2f 0a 09 09 09 61 70 70 5f 74 6c 76 20 3d 20  */....app_tlv = 
10950 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
10960 73 6c 6f 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20  slot);......for 
10970 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f  (app_curr = app_
10980 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61  tlv; app_curr; a
10990 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75  pp_curr = app_cu
109a0 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09  rr->_next) {....
109b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
109c0 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
109d0 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
109e0 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
109f0 54 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67  TR(app_curr->tag
10a00 29 29 3b 0a 09 09 09 09 69 66 20 28 61 70 70 5f  ));.....if (app_
10a10 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43  curr->tag != GSC
10a20 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
10a30 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  TE) {......CACKE
10a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10a50 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
10a60 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
10a70 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41 54  about CERTIFICAT
10a80 45 73 29 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e  Es)");.......con
10a90 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09  tinue;.....}....
10aa0 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72  ..curr_id = &cer
10ab0 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09  ts[outidx];.....
10ac0 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63  outidx++;......c
10ad0 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20  urr_id->id_type 
10ae0 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
10af0 5f 43 41 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79  _CAC;.....memcpy
10b00 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63  (curr_id->card.c
10b10 61 63 2e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f  ac.applet, curr_
10b20 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  aid, sizeof(curr
10b30 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
10b40 70 6c 65 74 29 29 3b 0a 09 09 09 09 63 75 72 72  plet));.....curr
10b50 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69  _id->card.cac.fi
10b60 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76  le = ccc_curr->v
10b70 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
10b80 6a 65 63 74 69 64 3b 0a 09 09 09 09 63 75 72 72  jectid;.....curr
10b90 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d  _id->keysize = -
10ba0 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  1;......CACKEY_D
10bb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c  EBUG_PRINTF("Fil
10bc0 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 63 61  ling curr_id->ca
10bd0 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 20 28 25  rd.cac.applet (%
10be0 70 29 20 77 69 74 68 20 25 6c 75 20 62 79 74 65  p) with %lu byte
10bf0 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61  s:", curr_id->ca
10c00 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 28  rd.cac.applet, (
10c10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
10c20 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63  izeof(curr_id->c
10c30 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
10c40 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
10c50 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c  UG_PRINTBUF("VAL
10c60 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72  :", curr_id->car
10c70 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69  d.cac.applet, si
10c80 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61  zeof(curr_id->ca
10c90 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
10ca0 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ......curr_id->c
10cb0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
10cc0 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74   app_curr->lengt
10cd0 68 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  h;......curr_id-
10ce0 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
10cf0 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63  alloc(curr_id->c
10d00 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
10d10 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
10d20 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10d30 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75  , app_curr->valu
10d40 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  e, curr_id->cert
10d50 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
10d60 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d  ...if (outidx >=
10d70 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09   *count) {......
10d80 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
10d90 62 6c 65 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f  ble) {.......*co
10da0 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09  unt *= 2;.......
10db0 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28  certs = realloc(
10dc0 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63  certs, sizeof(*c
10dd0 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29  erts) * (*count)
10de0 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  );......} else {
10df0 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
10e00 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  ...}.....}....}.
10e10 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
10e20 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09  tlv(app_tlv);...
10e30 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20  ..if (outidx >= 
10e40 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72  *count) {.....br
10e50 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
10e60 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
10e70 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09  (ccc_tlv);..}...
10e80 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
10e90 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
10ea0 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74  izable) {...cert
10eb0 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
10ec0 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
10ed0 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
10ee0 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64  }...slot->cached
10ef0 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65 79 5f  _certs = cackey_
10f00 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c  copy_certs(NULL,
10f10 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b   certs, *count);
10f20 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  ..slot->cached_c
10f30 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f  erts_count = *co
10f40 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e  unt;.../* Termin
10f50 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
10f60 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
10f70 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
10f80 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65  tion(slot);...re
10f90 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a  turn(certs);.}..
10fa0 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
10fb0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
10fc0 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
10fd0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
10fe0 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
10ff0 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
11000 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
11010 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
11020 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
11030 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  pt(struct cackey
11040 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
11050 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
11060 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
11070 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
11080 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  f, size_t buflen
11090 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
110a0 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20  *outbuf, size_t 
110b0 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70  outbuflen, int p
110c0 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70  adInput, int unp
110d0 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 63 61 63  adOutput) {..cac
110e0 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
110f0 20 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67   id_type;..unsig
11100 6e 65 64 20 63 68 61 72 20 64 79 6e 5f 61 75 74  ned char dyn_aut
11110 68 5f 74 65 6d 70 6c 61 74 65 5b 31 30 5d 3b 0a  h_template[10];.
11120 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
11130 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f  tmpbuf, *tmpbuf_
11140 73 2c 20 2a 6f 75 74 62 75 66 5f 73 3b 0a 09 75  s, *outbuf_s;..u
11150 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 79 74  nsigned char byt
11160 65 73 5f 74 6f 5f 73 65 6e 64 2c 20 70 31 2c 20  es_to_send, p1, 
11170 63 6c 61 73 73 3b 0a 09 75 6e 73 69 67 6e 65 64  class;..unsigned
11180 20 63 68 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b   char blocktype;
11190 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 73 65 6e  ..cackey_ret sen
111a0 64 5f 72 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74  d_ret;..uint16_t
111b0 20 72 65 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a   respcode;..ssiz
111c0 65 5f 74 20 72 65 74 76 61 6c 20 3d 20 30 2c 20  e_t retval = 0, 
111d0 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 73 69  unpadoffset;..si
111e0 7a 65 5f 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20  ze_t tmpbuflen, 
111f0 70 61 64 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75  padlen, tmpoutbu
11200 66 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f  flen;..int free_
11210 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74  tmpbuf = 0;..int
11220 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45   le;...CACKEY_DE
11230 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
11240 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f  ed.");...if (slo
11250 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
11260 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11270 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74  TF("Error.  slot
11280 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
11290 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
112a0 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29  if (buf == NULL)
112b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
112c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
112d0 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b    buf is NULL");
112e0 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
112f0 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20  .}...if (outbuf 
11300 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
11310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11320 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66  ("Error.  outbuf
11330 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
11340 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
11350 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20  if (identity == 
11360 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
11370 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11380 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20  rror.  identity 
11390 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
113a0 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
113b0 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  f (identity->pcs
113c0 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55  c_identity == NU
113d0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
113e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
113f0 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70  or.  identity->p
11400 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20  csc_identity is 
11410 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
11420 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74  n(-1);..}...id_t
11430 79 70 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ype = identity->
11440 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69  pcsc_identity->i
11450 64 5f 74 79 70 65 3b 0a 09 69 66 20 28 69 64 5f  d_type;..if (id_
11460 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49  type == CACKEY_I
11470 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
11480 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11490 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
114a0 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
114b0 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 43 41  c_identity is CA
114c0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
114d0 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63 61  T_ONLY, which ca
114e0 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 66 6f 72  nnot be used for
114f0 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b   sign/decrypt");
11500 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
11510 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 69 64 5f  .}...switch (id_
11520 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
11530 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
11540 56 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  V:...case CACKEY
11550 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
11560 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
11570 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
11580 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11590 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
115a0 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f  c_identity is no
115b0 74 20 61 20 73 75 70 70 6f 72 74 65 64 20 76 61  t a supported va
115c0 6c 75 65 2e 20 54 79 70 65 20 69 73 3a 20 30 78  lue. Type is: 0x
115d0 25 6c 78 20 28 50 49 56 20 3d 20 30 78 25 6c 78  %lx (PIV = 0x%lx
115e0 2c 20 43 41 43 20 3d 20 30 78 25 6c 78 29 22 2c  , CAC = 0x%lx)",
115f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11600 20 69 64 5f 74 79 70 65 2c 20 28 75 6e 73 69 67   id_type, (unsig
11610 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59  ned long) CACKEY
11620 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 20 28 75  _ID_TYPE_PIV, (u
11630 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
11640 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
11650 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
11660 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
11670 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65  mine identity Ke
11680 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69  y size */..if (i
11690 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
116a0 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
116b0 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74  < 0) {...identit
116c0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
116d0 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39  ->keysize = x509
116e0 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e  _to_keysize(iden
116f0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11700 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
11710 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
11720 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
11730 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a  ficate_len);..}.
11740 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65  ../* Pad message
11750 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a   to key size */.
11760 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b  .if (padInput) {
11770 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
11780 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
11790 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09  keysize > 0) {..
117a0 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20  ..if (buflen != 
117b0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
117c0 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
117d0 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c  ) {.....if (bufl
117e0 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e  en > (identity->
117f0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
11800 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09  eysize + 3)) {..
11810 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11820 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
11830 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   Message is too 
11840 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65  large to sign/de
11850 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72  crypt");.......r
11860 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d  eturn(-1);.....}
11870 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
11880 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  = identity->pcsc
11890 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
118a0 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  ze;.....tmpbuf =
118b0 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
118c0 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70  n);.....free_tmp
118d0 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61  buf = 1;......pa
118e0 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e  dlen = tmpbuflen
118f0 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a   - buflen - 3;..
11900 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23  ..../* RSA PKCS#
11910 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f  1 EMSA-PKCS1-v1_
11920 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09  5 Padding */....
11930 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30  .tmpbuf[0] = 0x0
11940 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d  0;.....tmpbuf[1]
11950 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d   = 0x01;.....mem
11960 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20  set(&tmpbuf[2], 
11970 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09  0xFF, padlen);..
11980 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  ...tmpbuf[padlen
11990 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09   + 2]= 0x00;....
119a0 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b  .memcpy(&tmpbuf[
119b0 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66  padlen + 3], buf
119c0 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  , buflen);......
119d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
119e0 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
119f0 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ", buf, buflen);
11a00 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
11a10 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64  G_PRINTBUF("Padd
11a20 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  ed:", tmpbuf, tm
11a30 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65  pbuflen);....} e
11a40 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66  lse {.....tmpbuf
11a50 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62   = buf;.....tmpb
11a60 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
11a70 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
11a80 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20  = 0;.....padlen 
11a90 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  = 0;....}...} el
11aa0 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
11ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
11ac0 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
11ad0 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e   key size, hopin
11ae0 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73  g the message is
11af0 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64   properly padded
11b00 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20  !");.....tmpbuf 
11b10 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66  = buf;....tmpbuf
11b20 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
11b30 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
11b40 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  ;....padlen = 0;
11b50 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
11b60 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09  .tmpbuf = buf;..
11b70 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66  .tmpbuflen = buf
11b80 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62  len;...free_tmpb
11b90 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e  uf = 0;...padlen
11ba0 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65   = 0;..}.../* Be
11bb0 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
11bc0 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  */..cackey_begin
11bd0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
11be0 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20  t);.../* Select 
11bf0 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a  correct applet *
11c00 2f 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79  /..switch (id_ty
11c10 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43  pe) {...case CAC
11c20 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
11c30 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
11c40 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69  _PRINTF("Selecti
11c50 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20  ng applet found 
11c60 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e  at %p ...", iden
11c70 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11c80 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  ity->card.cac.ap
11c90 70 6c 65 74 29 3b 0a 09 09 09 63 61 63 6b 65 79  plet);....cackey
11ca0 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
11cb0 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
11cc0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
11cd0 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73  rd.cac.applet, s
11ce0 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e  izeof(identity->
11cf0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
11d00 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
11d10 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
11d20 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a  correct file */.
11d30 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  ...cackey_select
11d40 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e  _file(slot, iden
11d50 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11d60 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69  ity->card.cac.fi
11d70 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  le);....break;..
11d80 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
11d90 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e  TYPE_PIV:....dyn
11da0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30  _auth_template[0
11db0 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09 64 79 6e  ] = 0x7C;....dyn
11dc0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31  _auth_template[1
11dd0 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e  ] = 0x82;....dyn
11de0 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32  _auth_template[2
11df0 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e 20  ] = ((tmpbuflen 
11e00 2b 20 36 29 20 26 20 30 78 66 66 30 30 29 20 3e  + 6) & 0xff00) >
11e10 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68  > 8;....dyn_auth
11e20 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28  _template[3] = (
11e30 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26  tmpbuflen + 6) &
11e40 20 30 78 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f   0x00ff;....dyn_
11e50 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d  auth_template[4]
11e60 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
11e70 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d  auth_template[5]
11e80 20 3d 20 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f   = 0x00;....dyn_
11e90 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d  auth_template[6]
11ea0 20 3d 20 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f   = 0x81;....dyn_
11eb0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d  auth_template[7]
11ec0 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
11ed0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d  auth_template[8]
11ee0 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20   = (tmpbuflen & 
11ef0 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
11f00 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
11f10 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65  te[9] = tmpbufle
11f20 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 09  n & 0x00ff;.....
11f30 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
11f40 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
11f50 2c 20 30 78 31 30 2c 20 4e 49 53 54 53 50 38 30  , 0x10, NISTSP80
11f60 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e  0_73_3_INSTR_GEN
11f70 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f  AUTH, NISTSP800_
11f80 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34  78_3_ALGO_RSA204
11f90 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  8, identity->pcs
11fa0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
11fb0 2e 70 69 76 2e 6b 65 79 5f 69 64 2c 20 73 69 7a  .piv.key_id, siz
11fc0 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d  eof(dyn_auth_tem
11fd0 70 6c 61 74 65 29 2c 20 64 79 6e 5f 61 75 74 68  plate), dyn_auth
11fe0 5f 74 65 6d 70 6c 61 74 65 2c 20 30 78 30 30 2c  _template, 0x00,
11ff0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
12000 4c 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  L);....break;...
12010 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
12020 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09  YPE_CERT_ONLY:..
12030 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d  ..break;..}...tm
12040 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b  pbuf_s = tmpbuf;
12050 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74  ..outbuf_s = out
12060 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70  buf;..while (tmp
12070 62 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f  buflen) {...tmpo
12080 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75  utbuflen = outbu
12090 66 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70  flen;....if (tmp
120a0 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f  buflen > CACKEY_
120b0 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62  APDU_MTU) {....b
120c0 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43  ytes_to_send = C
120d0 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a  ACKEY_APDU_MTU;.
120e0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79  ..} else {....by
120f0 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d  tes_to_send = tm
12100 70 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  pbuflen;...}....
12110 73 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b 45  send_ret = CACKE
12120 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
12130 3b 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f 74  ;...switch (id_t
12140 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
12150 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
12160 43 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75  C:.....if (tmpbu
12170 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50  flen > CACKEY_AP
12180 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 70  DU_MTU) {......p
12190 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 6c  1 = 0x80;......l
121a0 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20  e = 0x00;.....} 
121b0 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20 3d  else {......p1 =
121c0 20 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x00;......le =
121d0 20 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09   0x00;.....}....
121e0 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
121f0 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
12200 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
12210 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c  GLOBAL_PLATFORM,
12220 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47   GSCIS_INSTR_SIG
12230 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78  NDECRYPT, p1, 0x
12240 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e  00, bytes_to_sen
12250 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26  d, tmpbuf, le, &
12260 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66  respcode, outbuf
12270 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29  , &tmpoutbuflen)
12280 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
12290 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
122a0 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 20  YPE_PIV:.....if 
122b0 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43  (tmpbuflen > CAC
122c0 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a  KEY_APDU_MTU) {.
122d0 09 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78 31  .....class = 0x1
122e0 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30  0;......le = 0x0
122f0 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  0;.....} else {.
12300 09 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43  .....class = GSC
12310 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
12320 3b 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36 3b  ;......le = 256;
12330 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64  .....}......send
12340 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
12350 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c  nd_apdu(slot, cl
12360 61 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f 37  ass, NISTSP800_7
12370 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54  3_3_INSTR_GENAUT
12380 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  H, NISTSP800_78_
12390 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20  3_ALGO_RSA2048, 
123a0 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
123b0 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69  dentity->card.pi
123c0 76 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 5f  v.key_id, bytes_
123d0 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c  to_send, tmpbuf,
123e0 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20   le, &respcode, 
123f0 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62  outbuf, &tmpoutb
12400 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61  uflen);.....brea
12410 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45  k;....case CACKE
12420 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
12430 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  NLY:.....break;.
12440 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  ..}....if (send_
12450 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
12460 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
12470 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12480 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
12490 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e  Failed -- return
124a0 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b  ing in error.");
124b0 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d  .....if (free_tm
124c0 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28  pbuf) {.....if (
124d0 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09  tmpbuf_s) {.....
124e0 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b  .free(tmpbuf_s);
124f0 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
12500 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69  /* End transacti
12510 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
12520 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
12530 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 72  slot);.....if (r
12540 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38  espcode == 0x698
12550 32 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  2) {.....CACKEY_
12560 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
12570 63 75 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f  curity status no
12580 74 20 73 61 74 69 73 69 66 69 65 64 2e 20 20 52  t satisified.  R
12590 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47  eturning NEEDLOG
125a0 49 4e 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  IN");......cacke
125b0 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
125c0 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f  t(slot);.....slo
125d0 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
125e0 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
125f0 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  RED;......return
12600 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  (CACKEY_PCSC_E_N
12610 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a  EEDLOGIN);....}.
12620 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
12630 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
12640 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
12650 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12660 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20  G_PRINTF("Token 
12670 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  absent.  Returni
12680 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29  ng TOKENABSENT")
12690 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  ;......cackey_ma
126a0 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
126b0 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  ot);......return
126c0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
126d0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
126e0 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  }.....return(-1)
126f0 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20  ;...}....tmpbuf 
12700 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  += bytes_to_send
12710 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d  ;...tmpbuflen -=
12720 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a   bytes_to_send;.
12730 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70  ...outbuf += tmp
12740 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74  outbuflen;...out
12750 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74  buflen -= tmpout
12760 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c  buflen;...retval
12770 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e   += tmpoutbuflen
12780 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f  ;..}...if (free_
12790 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28  tmpbuf) {...if (
127a0 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66  tmpbuf_s) {....f
127b0 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09  ree(tmpbuf_s);..
127c0 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d  .}..}...outbuf =
127d0 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20   outbuf_s;.../* 
127e0 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  End transaction 
127f0 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
12800 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
12810 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  ;..#ifdef CACKEY
12820 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
12830 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
12840 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c  MAX..if (outbufl
12850 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  en > _POSIX_SSIZ
12860 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
12870 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12880 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64  Outbuflen exceed
12890 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c  s maximum value,
128a0 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
128b0 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c  ilure. (max = %l
128c0 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25  i, outbuflen = %
128d0 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
128e0 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
128f0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
12900 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65  utbuflen);....re
12910 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
12920 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f  endif.#endif.../
12930 2a 20 57 65 20 6d 75 73 74 20 72 65 6d 6f 76 65  * We must remove
12940 20 74 68 65 20 22 37 43 22 20 74 61 67 20 74 6f   the "7C" tag to
12950 20 67 65 74 20 74 6f 20 74 68 65 20 73 69 67 6e   get to the sign
12960 61 74 75 72 65 20 2a 2f 0a 09 73 77 69 74 63 68  ature */..switch
12970 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63   (id_type) {...c
12980 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
12990 50 45 5f 50 49 56 3a 0a 09 09 09 69 66 20 28 6f  PE_PIV:....if (o
129a0 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 37 43  utbuf[0] != 0x7C
129b0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
129c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
129d0 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66  ponse from PIV f
129e0 6f 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48  or GENERATE AUTH
129f0 45 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e  ENTICATION was n
12a00 6f 74 20 61 20 30 78 37 43 20 74 61 67 2c 20 72  ot a 0x7C tag, r
12a10 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
12a20 75 72 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ure");......retu
12a30 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09  rn(-1);....}....
12a40 09 2f 2a 20 58 58 58 20 54 4f 44 4f 20 50 49 56  ./* XXX TODO PIV
12a50 20 2a 2f 0a 09 09 09 6d 65 6d 6d 6f 76 65 28 6f   */....memmove(o
12a60 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20 2b 20  utbuf, outbuf + 
12a70 38 2c 20 72 65 74 76 61 6c 20 2d 20 38 29 3b 0a  8, retval - 8);.
12a80 09 09 09 72 65 74 76 61 6c 20 2d 3d 20 38 3b 0a  ...retval -= 8;.
12a90 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
12aa0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
12ab0 43 41 43 3a 0a 09 09 63 61 73 65 20 43 41 43 4b  CAC:...case CACK
12ac0 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
12ad0 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a  ONLY:....break;.
12ae0 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65  .}.../* Unpad re
12af0 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61  ply */..if (unpa
12b00 64 4f 75 74 70 75 74 29 20 7b 0a 09 09 69 66 20  dOutput) {...if 
12b10 28 72 65 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09  (retval < 3) {..
12b20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
12b30 52 49 4e 54 46 28 22 52 65 70 6c 79 20 69 73 20  RINTF("Reply is 
12b40 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72  too small, we ar
12b50 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e  e not able to un
12b60 70 61 64 20 2d 2d 20 70 61 73 73 69 6e 67 20 62  pad -- passing b
12b70 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e 67 20 66  ack and hoping f
12b80 6f 72 20 74 68 65 20 62 65 73 74 21 22 29 3b 0a  or the best!");.
12b90 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12ba0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
12bb0 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
12bc0 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79 74  etval = %li (byt
12bd0 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74  es)", (long) ret
12be0 76 61 6c 29 3b 0a 09 09 09 72 65 74 75 72 6e 28  val);....return(
12bf0 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09  retval);...}....
12c00 69 66 20 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d  if (outbuf[0] !=
12c10 20 30 78 30 30 29 20 7b 0a 09 09 09 43 41 43 4b   0x00) {....CACK
12c20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12c30 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64 20 70 61  "Unrecognized pa
12c40 64 64 69 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20  dding scheme -- 
12c50 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61 6e 64  passing back and
12c60 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68 65 20   hoping for the 
12c70 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43 41 43  best!");.....CAC
12c80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12c90 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
12ca0 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
12cb0 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
12cc0 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 09  long) retval);..
12cd0 09 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
12ce0 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79  ;...}....blockty
12cf0 70 65 20 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a  pe = outbuf[1];.
12d00 09 09 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20  ..unpadoffset = 
12d10 30 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 62 6c  0;....switch (bl
12d20 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09 09 63 61  ocktype) {....ca
12d30 73 65 20 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20  se 0x00:...../* 
12d40 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 31  Padding Scheme 1
12d50 2c 20 74 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d  , the first non-
12d60 7a 65 72 6f 20 62 79 74 65 20 69 73 20 74 68 65  zero byte is the
12d70 20 73 74 61 72 74 20 6f 66 20 64 61 74 61 20 2a   start of data *
12d80 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
12d90 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
12da0 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
12db0 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
12dc0 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
12dd0 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
12de0 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  != 0x00) {......
12df0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09  .break;......}..
12e00 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
12e10 09 09 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09  ...case 0x01:...
12e20 09 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68  ../* Padding Sch
12e30 65 6d 65 20 32 2c 20 70 61 64 20 62 79 74 65 73  eme 2, pad bytes
12e40 20 61 72 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77   are 0xFF follow
12e50 65 64 20 62 79 20 30 78 30 30 20 2a 2f 0a 09 09  ed by 0x00 */...
12e60 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73  ..for (unpadoffs
12e70 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66  et = 2; unpadoff
12e80 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e  set < retval; un
12e90 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09  padoffset++) {..
12ea0 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75  ....if (outbuf[u
12eb0 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30  npadoffset] != 0
12ec0 78 46 46 29 20 7b 0a 09 09 09 09 09 09 69 66 20  xFF) {.......if 
12ed0 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66  (outbuf[unpadoff
12ee0 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a  set] == 0x00) {.
12ef0 09 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73  .......unpadoffs
12f00 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72  et++;.........br
12f10 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73  eak;.......} els
12f20 65 20 7b 0a 09 09 09 09 09 09 09 43 41 43 4b 45  e {........CACKE
12f30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
12f40 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20  Invalid padding 
12f50 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75  data found, retu
12f60 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
12f70 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  , should have be
12f80 65 6e 20 30 78 30 30 20 66 6f 75 6e 64 20 30 78  en 0x00 found 0x
12f90 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64  %02x", (unsigned
12fa0 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70   int) outbuf[unp
12fb0 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09  adoffset]);.....
12fc0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
12fd0 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65  ......}......} e
12fe0 6c 73 65 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  lse {.......CACK
12ff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13000 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69 6e 67  "Invalid padding
13010 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72 65 74   data found, ret
13020 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
13030 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  e, should have b
13040 65 65 6e 20 30 78 46 46 20 66 6f 75 6e 64 20 30  een 0xFF found 0
13050 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65  x%02x", (unsigne
13060 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e  d int) outbuf[un
13070 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09  padoffset]);....
13080 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
13090 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
130a0 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
130b0 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x02:...../* Pad
130c0 64 69 6e 67 20 53 63 68 65 6d 65 20 33 2c 20 70  ding Scheme 3, p
130d0 61 64 20 62 79 74 65 73 20 61 72 65 20 6e 6f 6e  ad bytes are non
130e0 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a 65 72 6f  -zero first zero
130f0 20 62 79 74 65 20 66 6f 75 6e 64 20 69 73 20 74   byte found is t
13100 68 65 20 73 65 70 65 72 61 74 6f 72 20 62 79 74  he seperator byt
13110 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e  e */.....for (un
13120 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75  padoffset = 2; u
13130 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74  npadoffset < ret
13140 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  val; unpadoffset
13150 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f  ++) {......if (o
13160 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
13170 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] == 0x00) {...
13180 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b  ....unpadoffset+
13190 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  +;........break;
131a0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
131b0 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
131c0 69 66 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  if (unpadoffset 
131d0 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09 09 09 43  > retval) {....C
131e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
131f0 54 46 28 22 4f 66 66 73 65 74 20 67 72 65 61 74  TF("Offset great
13200 65 72 20 74 68 61 6e 20 72 65 70 6c 79 20 73 69  er than reply si
13210 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e 20 20 28  ze, aborting.  (
13220 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 25 6c  unpadoffset = %l
13230 75 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 75 29  u, retval = %lu)
13240 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
13250 67 29 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20  g) unpadoffset, 
13260 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
13270 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
13280 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
13290 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
132a0 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a 22 2c  NTBUF("Padded:",
132b0 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29   outbuf, retval)
132c0 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d 3d 20 75  ;....retval -= u
132d0 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65  npadoffset;...me
132e0 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20 6f 75  mmove(outbuf, ou
132f0 74 62 75 66 20 2b 20 75 6e 70 61 64 6f 66 66 73  tbuf + unpadoffs
13300 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  et, retval);....
13310 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13320 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
13330 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76 61  ", outbuf, retva
13340 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59  l);..}....CACKEY
13350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13360 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
13370 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  ess, retval = %l
13380 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e  i (bytes)", (lon
13390 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65  g) retval);...re
133a0 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a  turn(retval);.}.
133b0 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
133c0 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
133d0 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
133e0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
133f0 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
13400 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
13410 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
13420 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
13430 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  ret cackey_login
13440 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
13450 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
13460 6e 65 64 20 63 68 61 72 20 2a 70 69 6e 2c 20 75  ned char *pin, u
13470 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e  nsigned long pin
13480 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73  _len, int *tries
13490 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
134a0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63  .unsigned char c
134b0 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46  ac_pin[8] = {0xF
134c0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
134d0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
134e0 20 30 78 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75   0xFF, 0xFF};..u
134f0 69 6e 74 31 36 5f 74 20 72 65 73 70 6f 6e 73 65  int16_t response
13500 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74 72 69 65  _code;..int trie
13510 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e  s_remaining;..in
13520 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74  t send_ret;..int
13530 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d   key_reference =
13540 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 49 6e 64 69   0x00;.../* Indi
13550 63 61 74 65 20 74 68 61 74 20 77 65 20 64 6f 20  cate that we do 
13560 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68  not know about h
13570 6f 77 20 6d 61 6e 79 20 74 72 69 65 73 20 61 72  ow many tries ar
13580 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09  e remaining */..
13590 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
135a0 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65  ing_p) {...*trie
135b0 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20  s_remaining_p = 
135c0 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61  -1;..}.../* Appa
135d0 72 65 6e 74 6c 79 2c 20 43 41 43 20 50 49 4e 73  rently, CAC PINs
135e0 20 61 72 65 20 2a 45 58 41 43 54 4c 59 2a 20 38   are *EXACTLY* 8
135f0 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70   bytes long -- p
13600 61 64 20 77 69 74 68 20 30 78 46 46 20 69 66 20  ad with 0xFF if 
13610 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66  too short */..if
13620 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20   (pin_len >= 8) 
13630 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
13640 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20  in, pin, 8);..} 
13650 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
13660 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69  cac_pin, pin, pi
13670 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  n_len);..}.../* 
13680 49 73 73 75 65 20 50 49 4e 20 56 65 72 69 66 79  Issue PIN Verify
13690 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20   */..send_ret = 
136a0 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
136b0 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
136c0 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
136d0 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 2c 20  S_INSTR_VERIFY, 
136e0 30 78 30 30 2c 20 6b 65 79 5f 72 65 66 65 72 65  0x00, key_refere
136f0 6e 63 65 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f  nce, sizeof(cac_
13700 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30  pin), cac_pin, 0
13710 78 30 30 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63  x00, &response_c
13720 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ode, NULL, NULL)
13730 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ;..if (send_ret 
13740 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
13750 5f 4f 4b 20 26 26 20 72 65 73 70 6f 6e 73 65 5f  _OK && response_
13760 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 38 29 20  code == 0x6A88) 
13770 7b 0a 09 09 6b 65 79 5f 72 65 66 65 72 65 6e 63  {...key_referenc
13780 65 20 3d 20 30 78 38 30 3b 0a 0a 09 09 73 65 6e  e = 0x80;....sen
13790 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
137a0 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
137b0 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38  SCIS_CLASS_ISO78
137c0 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  16, GSCIS_INSTR_
137d0 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20 6b 65  VERIFY, 0x00, ke
137e0 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73 69 7a  y_reference, siz
137f0 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20 63 61  eof(cac_pin), ca
13800 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26 72 65  c_pin, 0x00, &re
13810 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c  sponse_code, NUL
13820 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  L, NULL);..}...i
13830 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
13840 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
13850 20 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e   {...if ((respon
13860 73 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30  se_code & 0x63C0
13870 29 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09  ) == 0x63C0) {..
13880 09 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  ..tries_remainin
13890 67 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f  g = (response_co
138a0 64 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43  de & 0xF);.....C
138b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
138c0 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
138d0 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20  tion failed, %i 
138e0 74 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22  tries remaining"
138f0 2c 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  , tries_remainin
13900 67 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65  g);.....if (trie
13910 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b  s_remaining_p) {
13920 0a 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61  .....*tries_rema
13930 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f  ining_p = tries_
13940 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a  remaining;....}.
13950 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
13960 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
13970 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
13980 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78  ponse_code == 0x
13990 36 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45  6983) {....CACKE
139a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
139b0 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e  PIN Verification
139c0 20 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20   failed, device 
139d0 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09  is locked");....
139e0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
139f0 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09  CSC_E_LOCKED);..
13a00 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  .}....return(CAC
13a10 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
13a20 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
13a30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
13a40 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
13a50 73 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72  succeeded");...r
13a60 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
13a70 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
13a80 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
13a90 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
13aa0 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
13ab0 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
13ac0 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
13ad0 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
13ae0 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
13af0 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
13b00 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
13b10 65 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  ent(struct cacke
13b20 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
13b30 09 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63  .cackey_ret pcsc
13b40 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44  _connect_ret;..D
13b50 57 4f 52 44 20 72 65 61 64 65 72 5f 6c 65 6e 20  WORD reader_len 
13b60 3d 20 30 2c 20 73 74 61 74 65 20 3d 20 30 2c 20  = 0, state = 0, 
13b70 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74  protocol = 0, at
13b80 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74 72  r_len;..BYTE atr
13b90 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a  [MAX_ATR_SIZE];.
13ba0 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f 72 65 74  .LONG status_ret
13bb0 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  , scard_reconn_r
13bc0 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
13bd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
13be0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  d.");...if (slot
13bf0 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ->internal) {...
13c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13c10 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74  NTF("Returning t
13c20 6f 6b 65 6e 20 70 72 65 73 65 6e 74 20 28 69 6e  oken present (in
13c30 74 65 72 6e 61 6c 20 74 6f 6b 65 6e 29 22 29 3b  ternal token)");
13c40 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
13c50 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
13c60 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63 73  ESENT);..}...pcs
13c70 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20  c_connect_ret = 
13c80 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
13c90 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28  ard(slot);..if (
13ca0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
13cb0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
13cc0 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
13cd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
13ce0 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
13cf0 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
13d00 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
13d10 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
13d20 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
13d30 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61  NABSENT);..}...a
13d40 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  tr_len = sizeof(
13d50 61 74 72 29 3b 0a 09 73 74 61 74 75 73 5f 72 65  atr);..status_re
13d60 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
13d70 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
13d80 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
13d90 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
13da0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
13db0 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61  _len);...if (sta
13dc0 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  tus_ret == SCARD
13dd0 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
13de0 45 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  E) {...CACKEY_DE
13df0 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
13e00 64 53 74 61 74 75 73 28 29 20 72 65 74 75 72 6e  dStatus() return
13e10 65 64 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  ed SCARD_E_INVAL
13e20 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69  ID_HANDLE, marki
13e30 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ng is not alread
13e40 79 20 63 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20  y connected and 
13e50 74 72 79 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a  trying again");.
13e60 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
13e70 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
13e80 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
13e90 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
13ea0 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
13eb0 0a 09 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ...if (pcsc_conn
13ec0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
13ed0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
13ee0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13ef0 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
13f00 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
13f10 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
13f20 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09  n absent");.....
13f30 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
13f40 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
13f50 29 3b 0a 09 09 7d 0a 0a 09 09 61 74 72 5f 6c 65  );...}....atr_le
13f60 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b  n = sizeof(atr);
13f70 0a 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ...status_ret = 
13f80 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
13f90 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
13fa0 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
13fb0 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
13fc0 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
13fd0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61 74  );..}...if (stat
13fe0 75 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  us_ret != SCARD_
13ff0 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 63  S_SUCCESS) {...c
14000 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
14010 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
14020 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d  if (status_ret =
14030 3d 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  = SCARD_W_RESET_
14040 43 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45  CARD) {....CACKE
14050 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14060 52 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20  Reset required, 
14070 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29  please hold...")
14080 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f  ;.....scard_reco
14090 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nn_ret = cackey_
140a0 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  reconnect_card(s
140b0 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  lot, SCARD_PROTO
140c0 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50  COL_T0 | SCARD_P
140d0 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f  ROTOCOL_T1, &pro
140e0 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73  tocol);....if (s
140f0 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20  card_reconn_ret 
14100 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  == SCARD_S_SUCCE
14110 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64  SS) {...../* Upd
14120 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  ate protocol */.
14130 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ....slot->protoc
14140 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a  ol = protocol;..
14150 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c  ..../* Re-establ
14160 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ish transaction,
14170 20 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65   if it was prese
14180 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c  nt */.....if (sl
14190 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
141a0 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
141b0 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
141c0 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09  ion_depth--;....
141d0 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
141e0 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
141f0 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65   = 1;......cacke
14200 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
14210 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d  ion(slot);.....}
14220 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
14230 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
14240 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71   successful, req
14250 75 65 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73  uerying");.....s
14260 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
14270 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
14280 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
14290 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
142a0 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
142b0 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09  tr, &atr_len);..
142c0 09 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
142d0 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
142e0 43 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43  CESS) {......CAC
142f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14300 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74  ("Still unable t
14310 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61  o query card sta
14320 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  tus, returning t
14330 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
14340 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73  ardStatus() = %s
14350 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
14360 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
14370 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29  _STR(status_ret)
14380 29 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28  );.......return(
14390 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
143a0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09  KENABSENT);.....
143b0 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  }....} else {...
143c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
143d0 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
143e0 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61   reconnect to ca
143f0 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  rd, returning to
14400 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61  ken absent.  SCa
14410 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20  rdReconnect() = 
14420 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
14430 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
14440 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63  TO_STR(scard_rec
14450 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09  onn_ret));......
14460 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
14470 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
14480 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
14490 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
144a0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
144b0 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20  e to query card 
144c0 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e  status, returnin
144d0 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
144e0 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d   SCardStatus() =
144f0 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
14500 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
14510 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72  _TO_STR(status_r
14520 65 74 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  et));.....return
14530 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
14540 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d  OKENABSENT);...}
14550 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65  ..}...if ((state
14560 20 26 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29   & SCARD_ABSENT)
14570 20 3d 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54   == SCARD_ABSENT
14580 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14590 55 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20  UG_PRINTF("Card 
145a0 69 73 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72  is absent, retur
145b0 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
145c0 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  t");....return(C
145d0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
145e0 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  ENABSENT);..}...
145f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14600 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74  NTF("Returning t
14610 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b  oken present.");
14620 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
14630 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
14640 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  SENT);.}../*. * 
14650 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
14660 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
14670 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
14680 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
14690 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
146a0 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
146b0 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
146c0 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
146d0 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74  _pcsc_identity_t
146e0 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63  o_label(struct c
146f0 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
14700 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
14710 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61  nsigned char *la
14720 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65  bel_buf, unsigne
14730 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66  d long label_buf
14740 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  _len) {..unsigne
14750 64 20 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61  d long certifica
14760 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c  te_len;..void *l
14770 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64  abel_asn1;..void
14780 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09   *certificate;..
14790 69 6e 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65  int x509_read_re
147a0 74 3b 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65  t;...certificate
147b0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
147c0 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69  tificate;..certi
147d0 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65  ficate_len = ide
147e0 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
147f0 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65  te_len;...if (ce
14800 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20  rtificate_len < 
14810 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  0) {...return(-1
14820 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61  );..}...x509_rea
14830 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
14840 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63  subject(certific
14850 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
14860 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20  _len, (void **) 
14870 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69  &label_asn1);..i
14880 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
14890 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
148a0 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f  (-1);..}...x509_
148b0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
148c0 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62  dn_to_string(lab
148d0 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65  el_asn1, x509_re
148e0 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29  ad_ret, (char *)
148f0 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65   label_buf, labe
14900 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29  l_buf_len, "CN")
14910 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ;..if (x509_read
14920 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78  _ret <= 0) {...x
14930 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
14940 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67  509_dn_to_string
14950 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30  (label_asn1, x50
14960 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61  9_read_ret, (cha
14970 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20  r *) label_buf, 
14980 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e  label_buf_len, N
14990 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30  ULL);....if (x50
149a0 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29  9_read_ret <= 0)
149b0 20 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29   {....return(-1)
149c0 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66  ;...}..}..#ifdef
149d0 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
149e0 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
149f0 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
14a00 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20  x509_read_ret > 
14a10 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
14a20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
14a30 55 47 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f  UG_PRINTF("x509_
14a40 72 65 61 64 5f 72 65 74 20 65 78 63 65 65 64 73  read_ret exceeds
14a50 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20   maximum value, 
14a60 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
14a70 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69  lure. (max = %li
14a80 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  , x509_read_ret 
14a90 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
14aa0 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
14ab0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
14ac0 29 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29  ) x509_read_ret)
14ad0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
14ae0 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
14af0 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30  dif...return(x50
14b00 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a  9_read_ret);.}..
14b10 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
14b20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
14b30 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
14b40 65 78 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a  ex_create(void *
14b50 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
14b60 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
14b70 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
14b80 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
14b90 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
14ba0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
14bb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
14bc0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
14bd0 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
14be0 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
14bf0 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
14c00 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
14c10 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
14c20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  malloc(sizeof(*p
14c30 74 68 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a  thread_mutex));.
14c40 09 09 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d  ..if (!pthread_m
14c50 75 74 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45  utex) {....CACKE
14c60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14c70 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61  Failed to alloca
14c80 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09  te memory.");...
14c90 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
14ca0 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74  }....pthread_ret
14cb0 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75  val = pthread_mu
14cc0 74 65 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64  tex_init(pthread
14cd0 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09  _mutex, NULL);..
14ce0 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
14cf0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
14d00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14d10 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
14d20 78 5f 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65  x_init() returne
14d30 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
14d40 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
14d50 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14d60 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d  ...}....*mutex =
14d70 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a   pthread_mutex;.
14d80 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
14d90 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61  cackey_args.Crea
14da0 74 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  teMutex) {....cu
14db0 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
14dc0 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
14dd0 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
14de0 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
14df0 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
14e00 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14e10 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
14e20 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
14e30 78 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  x() returned err
14e40 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e  or (%li).", (lon
14e50 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  g) custom_retval
14e60 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
14e70 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a  1);....}...}..}.
14e80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14e90 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
14ea0 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29   sucessfully (0)
14eb0 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b  ");...return(0);
14ec0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30  .}../* Returns 0
14ed0 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73   on success */.s
14ee0 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
14ef0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64  _mutex_lock(void
14f00 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72   *mutex) {..pthr
14f10 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
14f20 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
14f30 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
14f40 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72  ..CK_RV custom_r
14f50 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
14f60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
14f70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
14f80 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
14f90 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49  s & CKF_OS_LOCKI
14fa0 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53  NG_OK) == CKF_OS
14fb0 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09  _LOCKING_OK) {..
14fc0 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d  .pthread_mutex =
14fd0 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65   mutex;....pthre
14fe0 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
14ff0 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70  ead_mutex_lock(p
15000 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09  thread_mutex);..
15010 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
15020 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
15030 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15040 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
15050 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65  x_lock() returne
15060 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
15070 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
15080 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
15090 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
150a0 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
150b0 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09  .LockMutex) {...
150c0 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
150d0 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63   cackey_args.Loc
150e0 6b 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a  kMutex(mutex);..
150f0 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65  ...if (custom_re
15100 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  tval != CKR_OK) 
15110 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
15120 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
15130 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78  y_args.LockMutex
15140 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
15150 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
15160 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
15170 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
15180 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
15190 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
151a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
151b0 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
151c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
151d0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20  }../* Returns 0 
151e0 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74  on success */.st
151f0 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
15200 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69  mutex_unlock(voi
15210 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68  d *mutex) {..pth
15220 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74  read_mutex_t *pt
15230 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e  hread_mutex;..in
15240 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  t pthread_retval
15250 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f  ;..CK_RV custom_
15260 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
15270 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
15280 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
15290 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  (cackey_args.fla
152a0 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  gs & CKF_OS_LOCK
152b0 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f  ING_OK) == CKF_O
152c0 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a  S_LOCKING_OK) {.
152d0 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20  ..pthread_mutex 
152e0 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72  = mutex;....pthr
152f0 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68  ead_retval = pth
15300 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  read_mutex_unloc
15310 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  k(pthread_mutex)
15320 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f  ;...if (pthread_
15330 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
15340 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15350 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d  RINTF("pthread_m
15360 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65  utex_unlock() re
15370 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69  turned error (%i
15380 29 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74  ).", pthread_ret
15390 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
153a0 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  (-1);...}..} els
153b0 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  e {...if (cackey
153c0 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
153d0 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72  x) {....custom_r
153e0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61  etval = cackey_a
153f0 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28  rgs.UnlockMutex(
15400 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28  mutex);.....if (
15410 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d  custom_retval !=
15420 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43   CKR_OK) {.....C
15430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15440 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e  TF("cackey_args.
15450 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65  UnlockMutex() re
15460 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
15470 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
15480 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
15490 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
154a0 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
154b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
154c0 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
154d0 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
154e0 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74  return(0);.}..st
154f0 61 74 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54  atic CK_ATTRIBUT
15500 45 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74  E_PTR cackey_get
15510 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f  _attributes(CK_O
15520 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65  BJECT_CLASS obje
15530 63 74 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20  ctclass, struct 
15540 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
15550 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20  tity *identity, 
15560 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
15570 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55  entity_num, CK_U
15580 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e  LONG_PTR pulCoun
15590 74 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  t) {..static CK_
155a0 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20  BBOOL ck_true = 
155b0 31 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42  1;..static CK_BB
155c0 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30  OOL ck_false = 0
155d0 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55  ;..static CK_TRU
155e0 53 54 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20  ST ck_trusted = 
155f0 43 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47  CK_TRUSTED_DELEG
15600 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  ATOR;..CK_ULONG 
15610 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65  numattrs = 0, re
15620 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f  tval_count;..CK_
15630 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63  ATTRIBUTE_TYPE c
15640 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09  urr_attr_type;..
15650 43 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72  CK_ATTRIBUTE cur
15660 72 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b  r_attr, *retval;
15670 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56  ..CK_VOID_PTR pV
15680 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  alue;..CK_ULONG 
15690 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f  ulValueLen;..CK_
156a0 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f  OBJECT_CLASS ck_
156b0 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43  object_class;..C
156c0 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
156d0 50 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74  PE ck_certificat
156e0 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f  e_type;..CK_KEY_
156f0 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65  TYPE ck_key_type
15700 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75  ;..CK_UTF8CHAR u
15710 63 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09  cTmpBuf[1024];..
15720 53 48 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31  SHA1Context sha1
15730 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d  _ctx;..MD5_CTX m
15740 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74  d5_ctx;..uint8_t
15750 20 73 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48   sha1_hash[SHA1H
15760 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38  ashSize];..uint8
15770 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48  _t md5_hash[MD5H
15780 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67  ashSize];..unsig
15790 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66  ned char *certif
157a0 69 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20  icate;..ssize_t 
157b0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
157c0 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  = -1, x509_read_
157d0 72 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65  ret;..int pValue
157e0 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f  _free;...CACKEY_
157f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
15800 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73  lled (objectClas
15810 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74  s = %lu, identit
15820 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20  y_num = %lu).", 
15830 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15840 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65  objectclass, ide
15850 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70  ntity_num);...*p
15860 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69  ulCount = 0;...i
15870 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
15880 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
15890 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  E && objectclass
158a0 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   != CKO_PUBLIC_K
158b0 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  EY && objectclas
158c0 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s != CKO_PRIVATE
158d0 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
158e0 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
158f0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43  APE_TRUST) {...C
15900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15910 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20  TF("Returning 0 
15920 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20  objects (NULL), 
15930 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63  invalid object c
15940 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72  lass");....retur
15950 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a  n(NULL);..}.../*
15960 20 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66   Get Cert */..if
15970 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55   (identity == NU
15980 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
15990 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
159a0 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
159b0 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64   (NULL), invalid
159c0 20 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65   identiy provide
159d0 64 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  d");....return(N
159e0 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69  ULL);..}...certi
159f0 66 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74  ficate = identit
15a00 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a  y->certificate;.
15a10 09 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
15a20 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72   = identity->cer
15a30 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09  tificate_len;...
15a40 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f  if (certificate_
15a50 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72  len == -1 || cer
15a60 74 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c  tificate == NULL
15a70 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
15a80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
15a90 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28  ning 0 objects (
15aa0 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e  NULL), this iden
15ab0 74 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61  tity does not ha
15ac0 76 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74  ve an X.509 cert
15ad0 69 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74  ificate associat
15ae0 65 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77  ed with it and w
15af0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a  ill not work");.
15b00 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
15b10 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20  ..}.../* Verify 
15b20 74 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65  that certificate
15b30 20 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65   is ASN.1 encode
15b40 64 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63  d X.509 certific
15b50 61 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39  ate */..if (x509
15b60 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69  _to_serial(certi
15b70 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
15b80 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c  ate_len, NULL) <
15b90 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
15ba0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
15bb0 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73  urning 0 objects
15bc0 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35   (NULL), the X.5
15bd0 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61  09 certificate a
15be0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
15bf0 68 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20  his identity is 
15c00 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09  not valid");....
15c10 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
15c20 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
15c30 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20  = 64;..retval = 
15c40 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f  malloc(retval_co
15c50 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
15c60 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63  tval));...for (c
15c70 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20  urr_attr_type = 
15c80 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  0; curr_attr_typ
15c90 65 20 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20  e < 0xce5363bf; 
15ca0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b  curr_attr_type++
15cb0 29 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61  ) {...if (curr_a
15cc0 74 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30  ttr_type == 0x80
15cd0 30 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74  0) {....curr_att
15ce0 72 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36  r_type = 0xce536
15cf0 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c  300;...}....pVal
15d00 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70  ue_free = 0;...p
15d10 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
15d20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
15d30 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77  _LONG) -1;....sw
15d40 69 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f  itch (curr_attr_
15d50 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
15d60 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43  CKA_CLASS:.....C
15d70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15d80 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
15d90 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41  ttribute CKA_CLA
15da0 53 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SS (0x%08lx) ...
15db0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15dc0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
15dd0 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65  e);......ck_obje
15de0 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63  ct_class = objec
15df0 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61  tclass;......pVa
15e00 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74  lue = &ck_object
15e10 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61  _class;.....ulVa
15e20 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
15e30 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29  ck_object_class)
15e40 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
15e50 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
15e60 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
15e70 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
15e80 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
15e90 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20  OBJECT_CLASS *) 
15ea0 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
15eb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15ec0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
15ed0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
15ee0 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09  e CKA_TOKEN:....
15ef0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15f00 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
15f10 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54   attribute CKA_T
15f20 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e  OKEN (0x%08lx) .
15f30 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
15f40 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
15f50 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75  ype);......pValu
15f60 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
15f70 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
15f80 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a  izeof(ck_true);.
15f90 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15fa0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
15fb0 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
15fc0 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
15fd0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
15fe0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
15ff0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
16000 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
16010 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
16020 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ....case CKA_PRI
16030 56 41 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  VATE:.....CACKEY
16040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16050 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
16060 75 74 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20  ute CKA_PRIVATE 
16070 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
16080 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
16090 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
160a0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
160b0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
160c0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
160d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
160e0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
160f0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
16100 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
16110 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74  not a Netscape t
16120 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
16130 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
16140 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  }......pValue = 
16150 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75  &ck_false;.....u
16160 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
16170 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09  of(ck_false);...
16180 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16190 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
161a0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
161b0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
161c0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
161d0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
161e0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
161f0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
16200 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
16210 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
16220 45 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ED:.....CACKEY_D
16230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
16240 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
16250 65 20 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30  e CKA_TRUSTED (0
16260 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
16270 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
16280 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
16290 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
162a0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
162b0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
162c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
162d0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
162e0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
162f0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
16300 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
16310 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
16320 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
16330 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
16340 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ue;.....ulValueL
16350 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
16360 72 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  rue);......CACKE
16370 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16380 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
16390 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
163a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
163b0 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
163c0 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
163d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
163e0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
163f0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
16400 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09  KA_MODIFIABLE:..
16410 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16420 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
16430 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
16440 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25  _MODIFIABLE (0x%
16450 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
16460 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
16470 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
16480 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
16490 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alse;.....ulValu
164a0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
164b0 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41  _false);......CA
164c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
164d0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
164e0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
164f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16500 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
16510 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
16520 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16530 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16540 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
16550 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09  e CKA_LABEL:....
16560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16570 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
16580 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c   attribute CKA_L
16590 41 42 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e  ABEL (0x%08lx) .
165a0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
165b0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
165c0 79 70 65 29 3b 0a 0a 09 09 09 09 2f 2a 20 58 58  ype);....../* XX
165d0 58 3a 20 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d  X: Determine nam
165e0 65 20 2a 2f 0a 09 09 09 09 75 6c 56 61 6c 75 65  e */.....ulValue
165f0 4c 65 6e 20 3d 20 73 6e 70 72 69 6e 74 66 28 28  Len = snprintf((
16600 63 68 61 72 20 2a 29 20 75 63 54 6d 70 42 75 66  char *) ucTmpBuf
16610 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75  , sizeof(ucTmpBu
16620 66 29 2c 20 22 49 64 65 6e 74 69 74 79 20 23 25  f), "Identity #%
16630 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
16640 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 6e 75  ong) identity_nu
16650 6d 29 3b 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  m);.....pValue =
16660 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09   ucTmpBuf;......
16670 69 66 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  if (ulValueLen >
16680 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75  = sizeof(ucTmpBu
16690 66 29 29 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c  f)) {......ulVal
166a0 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09  ueLen = 0;......
166b0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
166c0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
166d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
166e0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
166f0 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
16700 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16710 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16720 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
16730 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09  e CKA_VALUE:....
16740 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16750 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
16760 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 56   attribute CKA_V
16770 41 4c 55 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ALUE (0x%08lx) .
16780 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
16790 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
167a0 79 70 65 29 3b 0a 0a 09 09 09 09 73 77 69 74 63  ype);......switc
167b0 68 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 29 20  h (objectclass) 
167c0 7b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  {......case CKO_
167d0 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09  PRIVATE_KEY:....
167e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
167f0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
16800 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
16810 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
16820 20 70 72 69 76 61 74 65 20 6b 65 79 2e 22 29 3b   private key.");
16830 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
16840 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54  ....case CKO_NET
16850 53 43 41 50 45 5f 54 52 55 53 54 3a 0a 09 09 09  SCAPE_TRUST:....
16860 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16870 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
16880 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
16890 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
168a0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
168b0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
168c0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
168d0 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59  e CKO_PUBLIC_KEY
168e0 3a 0a 09 09 09 09 09 09 69 66 20 28 63 65 72 74  :.......if (cert
168f0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
16900 29 20 7b 0a 09 09 09 09 09 09 09 78 35 30 39 5f  ) {........x509_
16910 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
16920 74 6f 5f 70 75 62 6b 65 79 28 63 65 72 74 69 66  to_pubkey(certif
16930 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
16940 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
16950 3b 0a 09 09 09 09 09 09 09 69 66 20 28 78 35 30  ;........if (x50
16960 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
16970 7b 20 0a 09 09 09 09 09 09 09 09 70 56 61 6c 75  { .........pValu
16980 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09  e = NULL;.......
16990 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
169a0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
169b0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
169c0 09 09 09 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a  .....}.......}..
169d0 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
169e0 09 09 63 61 73 65 20 43 4b 4f 5f 43 45 52 54 49  ..case CKO_CERTI
169f0 46 49 43 41 54 45 3a 0a 09 09 09 09 09 09 70 56  FICATE:.......pV
16a00 61 6c 75 65 20 3d 20 63 65 72 74 69 66 69 63 61  alue = certifica
16a10 74 65 3b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  te;.......ulValu
16a20 65 4c 65 6e 20 3d 20 63 65 72 74 69 66 69 63 61  eLen = certifica
16a30 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62  te_len;........b
16a40 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
16a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16a60 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
16a70 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
16a80 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
16a90 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
16aa0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
16ab0 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
16ac0 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
16ad0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
16ae0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
16af0 20 43 4b 41 5f 49 53 53 55 45 52 20 28 30 78 25   CKA_ISSUER (0x%
16b00 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
16b10 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
16b20 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
16b30 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
16b40 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
16b50 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c  CATE && objectcl
16b60 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass != CKO_NETSC
16b70 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
16b80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16b90 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
16ba0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
16bb0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
16bc0 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20  t a certificate 
16bd0 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75 73  or Netscape trus
16be0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
16bf0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
16c00 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
16c10 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
16c20 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
16c30 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73  et = x509_to_iss
16c40 75 65 72 28 63 65 72 74 69 66 69 63 61 74 65 2c  uer(certificate,
16c50 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
16c60 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
16c70 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
16c80 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
16c90 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
16ca0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
16cb0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
16cc0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
16cd0 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
16ce0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16cf0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
16d00 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
16d10 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
16d20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
16d30 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
16d40 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
16d50 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 09 43 41  L_NUMBER:.....CA
16d60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16d70 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
16d80 74 72 69 62 75 74 65 20 43 4b 41 5f 53 45 52 49  tribute CKA_SERI
16d90 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78 25 30 38  AL_NUMBER (0x%08
16da0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
16db0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
16dc0 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
16dd0 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
16de0 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  != CKO_CERTIFICA
16df0 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73  TE && objectclas
16e00 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
16e10 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
16e20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16e30 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
16e40 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
16e50 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
16e60 61 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72  a certificate or
16e70 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
16e80 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
16e90 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
16ea0 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74  ..if (certificat
16eb0 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09  e_len >= 0) {...
16ec0 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
16ed0 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65 72 69 61   = x509_to_seria
16ee0 6c 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  l(certificate, c
16ef0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
16f00 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
16f10 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
16f20 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
16f30 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
16f40 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
16f50 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
16f60 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
16f70 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
16f80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16f90 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
16fa0 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
16fb0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
16fc0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
16fd0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
16fe0 09 09 63 61 73 65 20 43 4b 41 5f 53 55 42 4a 45  ..case CKA_SUBJE
16ff0 43 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  CT:.....CACKEY_D
17000 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
17010 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
17020 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 20 28 30  e CKA_SUBJECT (0
17030 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
17040 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
17050 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
17060 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
17070 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
17080 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
17090 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
170a0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
170b0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
170c0 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
170d0 20 63 65 72 74 69 66 69 63 61 74 65 22 29 3b 0a   certificate");.
170e0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
170f0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
17100 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
17110 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
17120 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
17130 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69 66 69  _subject(certifi
17140 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
17150 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
17160 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
17170 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
17180 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
17190 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
171a0 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
171b0 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
171c0 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
171d0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
171e0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
171f0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
17200 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
17210 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
17220 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
17230 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
17240 49 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ID:.....CACKEY_D
17250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
17260 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
17270 65 20 43 4b 41 5f 49 44 20 28 30 78 25 30 38 6c  e CKA_ID (0x%08l
17280 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
17290 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
172a0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
172b0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
172c0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
172d0 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
172e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
172f0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
17300 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
17310 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
17320 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
17330 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
17340 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d  .....}......ucTm
17350 70 42 75 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e  pBuf[0] = ((iden
17360 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e  tity_num + 1) >>
17370 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 09   8) & 0xff;.....
17380 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28  ucTmpBuf[1] =  (
17390 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31  identity_num + 1
173a0 29 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 09 70  ) & 0xff;......p
173b0 56 61 6c 75 65 20 3d 20 26 75 63 54 6d 70 42 75  Value = &ucTmpBu
173c0 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  f;.....ulValueLe
173d0 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b  n = 2;......CACK
173e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
173f0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
17400 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
17410 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17420 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
17430 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
17440 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54  e CKA_CERTIFICAT
17450 45 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b  E_TYPE:.....CACK
17460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17470 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
17480 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 49 46  ibute CKA_CERTIF
17490 49 43 41 54 45 5f 54 59 50 45 20 28 30 78 25 30  ICATE_TYPE (0x%0
174a0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
174b0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
174c0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
174d0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
174e0 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
174f0 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
17500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17510 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
17520 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
17530 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
17540 72 74 69 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09  rtificate.");...
17550 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
17560 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79  ....../* We only
17570 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 63 65 72   support one cer
17580 74 69 66 69 63 61 74 65 20 74 79 70 65 20 2a 2f  tificate type */
17590 0a 09 09 09 09 63 6b 5f 63 65 72 74 69 66 69 63  .....ck_certific
175a0 61 74 65 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58  ate_type = CKC_X
175b0 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75  _509;......pValu
175c0 65 20 3d 20 26 63 6b 5f 63 65 72 74 69 66 69 63  e = &ck_certific
175d0 61 74 65 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  ate_type;.....ul
175e0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
175f0 66 28 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  f(ck_certificate
17600 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43  _type);......CAC
17610 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17620 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
17630 20 43 4b 43 5f 58 5f 35 30 39 20 28 25 6c 75 29   CKC_X_509 (%lu)
17640 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
17650 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
17660 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59  K_CERTIFICATE_TY
17670 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  PE *) pValue), p
17680 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
17690 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
176a0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
176b0 09 09 09 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f  ...case CKA_KEY_
176c0 54 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TYPE:.....CACKEY
176d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
176e0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
176f0 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45  ute CKA_KEY_TYPE
17700 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
17710 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17720 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
17730 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
17740 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52  tclass != CKO_PR
17750 49 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a  IVATE_KEY && obj
17760 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
17770 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09  PUBLIC_KEY) {...
17780 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17790 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
177a0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
177b0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
177c0 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09  ot a key.");....
177d0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
177e0 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20  ...../* We only 
177f0 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20  support one key 
17800 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b  type */.....ck_k
17810 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53  ey_type = CKK_RS
17820 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  A;......pValue =
17830 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09   &ck_key_type;..
17840 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
17850 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79  sizeof(ck_key_ty
17860 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  pe);......CACKEY
17870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17880 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b  ... returning CK
17890 4b 5f 52 53 41 20 28 25 6c 75 29 20 28 25 70 2f  K_RSA (%lu) (%p/
178a0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
178b0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
178c0 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
178d0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
178e0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
178f0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
17900 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
17910 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
17920 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17930 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
17940 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
17950 49 47 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  IGN (0x%08lx) ..
17960 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
17970 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
17980 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
17990 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
179a0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
179b0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
179c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
179d0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
179e0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
179f0 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
17a00 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
17a10 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
17a20 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  }......if (objec
17a30 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52  tclass == CKO_PR
17a40 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09  IVATE_KEY) {....
17a50 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74  ..pValue = &ck_t
17a60 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  rue;......ulValu
17a70 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
17a80 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c  _true);.....} el
17a90 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65  se {......pValue
17aa0 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
17ab0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
17ac0 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
17ad0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
17ae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17af0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
17b00 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
17b10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17b20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
17b30 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
17b40 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17b50 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
17b60 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
17b70 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
17b80 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  R:.....CACKEY_DE
17b90 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
17ba0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
17bb0 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45   CKA_SIGN_RECOVE
17bc0 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  R (0x%08lx) ..."
17bd0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17be0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
17bf0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
17c00 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
17c10 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
17c20 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17c30 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17c40 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
17c50 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
17c60 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
17c70 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
17c80 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
17c90 0a 09 09 09 09 2f 2a 20 57 65 20 63 75 72 72 65  ...../* We curre
17ca0 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ntly only suppor
17cb0 74 20 22 53 69 67 6e 20 77 69 74 68 20 41 70 70  t "Sign with App
17cc0 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09 09 70 56  endix" */.....pV
17cd0 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
17ce0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
17cf0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
17d00 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  se);......CACKEY
17d10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17d20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
17d30 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
17d40 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
17d50 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
17d60 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
17d70 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17d80 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17d90 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17da0 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 09 43  A_DECRYPT:.....C
17db0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17dc0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17dd0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 44 45 43  ttribute CKA_DEC
17de0 52 59 50 54 20 28 30 78 25 30 38 6c 78 29 20 2e  RYPT (0x%08lx) .
17df0 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
17e00 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
17e10 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
17e20 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
17e30 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
17e40 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
17e50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17e60 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
17e70 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
17e80 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
17e90 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
17ea0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17eb0 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
17ec0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
17ed0 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62  RIVATE_KEY || ob
17ee0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
17ef0 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09  _PUBLIC_KEY) {..
17f00 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
17f10 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
17f20 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
17f30 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
17f40 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
17f50 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
17f60 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
17f70 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
17f80 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  e);.....}......C
17f90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17fa0 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
17fb0 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
17fc0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17fd0 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
17fe0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
17ff0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18000 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
18010 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
18020 73 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  se CKA_SENSITIVE
18030 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18040 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
18050 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
18060 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 20 28 30  CKA_SENSITIVE (0
18070 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18080 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18090 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
180a0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
180b0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
180c0 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
180d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
180e0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
180f0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
18100 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
18110 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
18120 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
18130 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
18140 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18150 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
18160 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
18170 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
18180 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18190 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
181a0 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
181b0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
181c0 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56  _false;......ulV
181d0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
181e0 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
181f0 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
18200 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18210 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
18220 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
18230 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
18240 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
18250 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
18260 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
18270 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
18280 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 45  k;....case CKA_E
18290 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09 09 09  XTRACTABLE:.....
182a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
182b0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
182c0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 45 58  attribute CKA_EX
182d0 54 52 41 43 54 41 42 4c 45 20 28 30 78 25 30 38  TRACTABLE (0x%08
182e0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
182f0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
18300 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
18310 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
18320 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f  == CKO_NETSCAPE_
18330 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41  TRUST) {......CA
18340 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18350 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
18360 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
18370 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
18380 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
18390 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
183a0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
183b0 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
183c0 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29  CKO_PRIVATE_KEY)
183d0 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
183e0 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
183f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
18400 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
18410 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
18420 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
18430 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
18440 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
18450 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
18460 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18470 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
18480 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
18490 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
184a0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
184b0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
184c0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
184d0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
184e0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
184f0 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
18500 55 53 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  US:.....CACKEY_D
18510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18520 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18530 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30  e CKA_MODULUS (0
18540 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18550 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18560 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
18570 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
18580 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
18590 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
185a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
185b0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
185c0 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
185d0 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
185e0 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
185f0 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
18600 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
18610 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
18620 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
18630 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
18640 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75  = x509_to_modulu
18650 73 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  s(certificate, c
18660 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20  ertificate_len, 
18670 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69  &pValue);......i
18680 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
18690 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56   < 0) {.......pV
186a0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
186b0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
186c0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35  .ulValueLen = x5
186d0 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09  09_read_ret;....
186e0 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43  ..}.....}......C
186f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18700 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
18710 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56  ng (%p/%lu)", pV
18720 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
18730 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18740 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18750 09 09 63 61 73 65 20 43 4b 41 5f 50 55 42 4c 49  ..case CKA_PUBLI
18760 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09  C_EXPONENT:.....
18770 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18780 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
18790 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 50 55  attribute CKA_PU
187a0 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30  BLIC_EXPONENT (0
187b0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
187c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
187d0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
187e0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
187f0 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
18800 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
18810 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18820 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
18830 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
18840 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
18850 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
18860 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
18870 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
18880 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
18890 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
188a0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
188b0 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65  = x509_to_expone
188c0 6e 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  nt(certificate, 
188d0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
188e0 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09   &pValue);......
188f0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
18900 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70  t < 0) {.......p
18910 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
18920 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
18930 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78  ..ulValueLen = x
18940 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09  509_read_ret;...
18950 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ...}.....}......
18960 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18970 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18980 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70  ing (%p/%lu)", p
18990 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
189a0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
189b0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
189c0 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
189d0 54 5f 44 49 47 49 54 41 4c 5f 53 49 47 4e 41 54  T_DIGITAL_SIGNAT
189e0 55 52 45 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  URE:....case CKA
189f0 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44  _TRUST_NON_REPUD
18a00 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20  IATION:....case 
18a10 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e  CKA_TRUST_KEY_EN
18a20 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63  CIPHERMENT:....c
18a30 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 41  ase CKA_TRUST_DA
18a40 54 41 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a  TA_ENCIPHERMENT:
18a50 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
18a60 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54  ST_KEY_AGREEMENT
18a70 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
18a80 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47  UST_KEY_CERT_SIG
18a90 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  N:....case CKA_T
18aa0 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09  RUST_CRL_SIGN:..
18ab0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
18ac0 5f 53 45 52 56 45 52 5f 41 55 54 48 3a 0a 09 09  _SERVER_AUTH:...
18ad0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
18ae0 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09  CLIENT_AUTH:....
18af0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43  case CKA_TRUST_C
18b00 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09  ODE_SIGNING:....
18b10 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 45  case CKA_TRUST_E
18b20 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a  MAIL_PROTECTION:
18b30 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18b40 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18b50 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
18b60 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78  KA_TRUST_... (0x
18b70 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
18b80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
18b90 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
18ba0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
18bb0 74 72 75 73 74 65 64 3b 0a 09 09 09 09 75 6c 56  trusted;.....ulV
18bc0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
18bd0 28 63 6b 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09  (ck_trusted);...
18be0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18bf0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
18c00 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
18c10 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
18c20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54 52 55 53  long) *((CK_TRUS
18c30 54 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  T *) pValue), pV
18c40 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
18c50 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18c60 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18c70 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f  ..case CKA_CERT_
18c80 53 48 41 31 5f 48 41 53 48 3a 0a 09 09 09 09 43  SHA1_HASH:.....C
18c90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18ca0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
18cb0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
18cc0 54 5f 53 48 41 31 5f 48 41 53 48 20 28 30 78 25  T_SHA1_HASH (0x%
18cd0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
18ce0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
18cf0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
18d00 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
18d10 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s != CKO_NETSCAP
18d20 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
18d30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18d40 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
18d50 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
18d60 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
18d70 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
18d80 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
18d90 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
18da0 09 09 09 53 48 41 31 52 65 73 65 74 28 26 73 68  ...SHA1Reset(&sh
18db0 61 31 5f 63 74 78 29 3b 0a 09 09 09 09 53 48 41  a1_ctx);.....SHA
18dc0 31 49 6e 70 75 74 28 26 73 68 61 31 5f 63 74 78  1Input(&sha1_ctx
18dd0 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63  , certificate, c
18de0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
18df0 0a 09 09 09 09 53 48 41 31 52 65 73 75 6c 74 28  .....SHA1Result(
18e00 26 73 68 61 31 5f 63 74 78 2c 20 73 68 61 31 5f  &sha1_ctx, sha1_
18e10 68 61 73 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c  hash);......pVal
18e20 75 65 20 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a  ue = sha1_hash;.
18e30 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18e40 20 73 69 7a 65 6f 66 28 73 68 61 31 5f 68 61 73   sizeof(sha1_has
18e50 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  h);......CACKEY_
18e60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18e70 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
18e80 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
18e90 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18ea0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18eb0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18ec0 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48  KA_CERT_MD5_HASH
18ed0 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18ee0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
18ef0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
18f00 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53  CKA_CERT_MD5_HAS
18f10 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  H (0x%08lx) ..."
18f20 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18f30 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
18f40 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
18f50 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
18f60 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
18f70 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18f80 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18f90 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
18fa0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
18fb0 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65  e not a Netscape
18fc0 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
18fd0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
18fe0 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74  ..}......MD5Init
18ff0 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09 09 09 09  (&md5_ctx);.....
19000 4d 44 35 55 70 64 61 74 65 28 26 6d 64 35 5f 63  MD5Update(&md5_c
19010 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65 2c  tx, certificate,
19020 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
19030 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e 61 6c 28  );.....MD5Final(
19040 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63  md5_hash, &md5_c
19050 74 78 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  tx);......pValue
19060 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09   = md5_hash;....
19070 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
19080 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a  zeof(md5_hash);.
19090 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
190a0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
190b0 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
190c0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
190d0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
190e0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
190f0 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  k;....default:..
19100 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
19110 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
19120 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
19130 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
19140 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47  ...if (((CK_LONG
19150 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d  ) ulValueLen) !=
19160 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29   ((CK_LONG) -1))
19170 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68 20 63 75   {..../* Push cu
19180 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20 74 68 65  rr_attr onto the
19190 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72   stack */....cur
191a0 72 5f 61 74 74 72 2e 74 79 70 65 20 3d 20 63 75  r_attr.type = cu
191b0 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 09  rr_attr_type;...
191c0 09 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c  .curr_attr.ulVal
191d0 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c  ueLen = ulValueL
191e0 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74  en;.....curr_att
191f0 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f  r.pValue = mallo
19200 63 28 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61  c(curr_attr.ulVa
19210 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  lueLen);....memc
19220 70 79 28 63 75 72 72 5f 61 74 74 72 2e 70 56 61  py(curr_attr.pVa
19230 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 63 75 72  lue, pValue, cur
19240 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65  r_attr.ulValueLe
19250 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70 56 61 6c  n);.....if (pVal
19260 75 65 5f 66 72 65 65 20 26 26 20 70 56 61 6c 75  ue_free && pValu
19270 65 29 20 7b 0a 09 09 09 09 66 72 65 65 28 70 56  e) {.....free(pV
19280 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  alue);....}.....
19290 69 66 20 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20  if (numattrs >= 
192a0 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a  retval_count) {.
192b0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61  ....retval = rea
192c0 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74  lloc(retval, ret
192d0 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65  val_count * size
192e0 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09  of(*retval));...
192f0 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 26 72  .}.....memcpy(&r
19300 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c  etval[numattrs],
19310 20 26 63 75 72 72 5f 61 74 74 72 2c 20 73 69 7a   &curr_attr, siz
19320 65 6f 66 28 63 75 72 72 5f 61 74 74 72 29 29 3b  eof(curr_attr));
19330 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a  ....numattrs++;.
19340 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d  ..}..}...if (num
19350 61 74 74 72 73 20 21 3d 20 30 29 20 7b 0a 09 09  attrs != 0) {...
19360 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e  retval_count = n
19370 75 6d 61 74 74 72 73 3b 0a 09 09 72 65 74 76 61  umattrs;...retva
19380 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76  l = realloc(retv
19390 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74  al, retval_count
193a0 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
193b0 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  l));..} else {..
193c0 09 66 72 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a  .free(retval);..
193d0 09 09 72 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b  ..retval = NULL;
193e0 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  ..}...*pulCount 
193f0 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41  = numattrs;...CA
19400 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
19410 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c 75  F("Returning %lu
19420 20 6f 62 6a 65 63 74 73 20 28 25 70 29 2e 22 2c   objects (%p).",
19430 20 6e 75 6d 61 74 74 72 73 2c 20 28 76 6f 69 64   numattrs, (void
19440 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72   *) retval);...r
19450 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
19460 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61  ..static void ca
19470 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
19480 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
19490 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
194a0 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
194b0 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65  d long identitie
194c0 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  s_count) {..CK_A
194d0 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
194e0 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ttr;..unsigned l
194f0 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61 74 74 72  ong id_idx, attr
19500 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e  _idx;...if (iden
19510 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c  tities == NULL |
19520 7c 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  | identities_cou
19530 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74  nt == 0) {...ret
19540 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  urn;..}...for (i
19550 64 5f 69 64 78 20 3d 20 30 3b 20 69 64 5f 69 64  d_idx = 0; id_id
19560 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5f 63  x < identities_c
19570 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20  ount; id_idx++) 
19580 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 69  {...if (identiti
19590 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
195a0 62 75 74 65 73 29 20 7b 0a 09 09 09 66 6f 72 20  butes) {....for 
195b0 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61  (attr_idx = 0; a
195c0 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69  ttr_idx < identi
195d0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
195e0 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61  ributes_count; a
195f0 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
19600 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 69 64  .curr_attr = &id
19610 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
19620 2e 61 74 74 72 69 62 75 74 65 73 5b 61 74 74 72  .attributes[attr
19630 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28  _idx];......if (
19640 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
19650 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  e) {......free(c
19660 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
19670 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
19680 09 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73  ..if (identities
19690 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
196a0 74 65 73 29 20 7b 0a 09 09 09 09 66 72 65 65 28  tes) {.....free(
196b0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
196c0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 3b 0a  x].attributes);.
196d0 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
196e0 66 72 65 65 5f 63 65 72 74 73 28 69 64 65 6e 74  free_certs(ident
196f0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
19700 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 31 2c 20  sc_identity, 1, 
19710 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65  1);...}..}...fre
19720 65 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d  e(identities);.}
19730 0a 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e 65  ..static unsigne
19740 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65  d long cackey_re
19750 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
19760 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
19770 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
19780 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  ties, unsigned l
19790 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  ong num_dod_cert
197a0 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  s) {..unsigned l
197b0 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c 20 69 64  ong cert_idx, id
197c0 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28  _idx = 0;...if (
197d0 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
197e0 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e  LL) {...return(n
197f0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 2a 20 33  um_dod_certs * 3
19800 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72  );..}...for (cer
19810 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f  t_idx = 0; cert_
19820 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65  idx < num_dod_ce
19830 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29  rts; cert_idx++)
19840 20 7b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b   {...identities[
19850 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
19860 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
19870 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19880 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
19890 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
198a0 62 75 74 65 73 28 43 4b 4f 5f 43 45 52 54 49 46  butes(CKO_CERTIF
198b0 49 43 41 54 45 2c 20 26 65 78 74 72 61 5f 63 65  ICATE, &extra_ce
198c0 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30  rts[cert_idx], 0
198d0 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78  xf000 | cert_idx
198e0 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
198f0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
19900 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64  _count);...id_id
19910 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69  x++;....identiti
19920 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
19930 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
19940 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
19950 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
19960 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
19970 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 50 55 42  tributes(CKO_PUB
19980 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f  LIC_KEY, &extra_
19990 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c  certs[cert_idx],
199a0 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f 69   0xf000 | cert_i
199b0 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b  dx, &identities[
199c0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
199d0 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f  es_count);...id_
199e0 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69  idx++;....identi
199f0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
19a00 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c  c_identity = NUL
19a10 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  L;...identities[
19a20 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
19a30 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
19a40 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e  attributes(CKO_N
19a50 45 54 53 43 41 50 45 5f 54 52 55 53 54 2c 20 26  ETSCAPE_TRUST, &
19a60 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74  extra_certs[cert
19a70 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20  _idx], 0xf000 | 
19a80 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74  cert_idx, &ident
19a90 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
19aa0 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b  tributes_count);
19ab0 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a  ...id_idx++;..}.
19ac0 0a 09 72 65 74 75 72 6e 28 69 64 5f 69 64 78 29  ..return(id_idx)
19ad0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75  ;.}..static stru
19ae0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
19af0 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
19b00 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75 63  identities(struc
19b10 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
19b20 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  lot, unsigned lo
19b30 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b  ng *ids_found) {
19b40 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
19b50 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
19b60 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
19b70 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
19b80 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
19b90 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ies;..unsigned l
19ba0 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f  ong num_ids, id_
19bb0 69 64 78 2c 20 63 75 72 72 5f 69 64 5f 74 79 70  idx, curr_id_typ
19bc0 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e;..unsigned lon
19bd0 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d  g num_certs, num
19be0 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63 65 72 74  _dod_certs, cert
19bf0 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75  _idx;..int inclu
19c00 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
19c10 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
19c20 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
19c30 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f  d.");...if (ids_
19c40 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b  found == NULL) {
19c50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19c60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
19c70 69 64 73 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c  ids_found is NUL
19c80 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  L");....return(N
19c90 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66  ULL);..}..#ifdef
19ca0 20 43 41 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f   CACKEY_CARD_SLO
19cb0 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f  T_INCLUDE_EXTRA_
19cc0 43 45 52 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65  CERTS..include_e
19cd0 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a  xtra_certs = 1;.
19ce0 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 67 65 74  #endif...if (get
19cf0 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f  env("CACKEY_DOD_
19d00 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54  CERTS_ON_HW_SLOT
19d10 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
19d20 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  .include_extra_c
19d30 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69  erts = 1;..}...i
19d40 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
19d50 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f  Y_NO_DOD_CERTS_O
19d60 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20  N_HW_SLOTS") != 
19d70 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64  NULL) {...includ
19d80 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
19d90 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65  0;..}...if (gete
19da0 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58  nv("CACKEY_NO_EX
19db0 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e  TRA_CERTS") != N
19dc0 55 4c 4c 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64  ULL) {...num_dod
19dd0 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65  _certs = 0;..} e
19de0 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f  lse {...num_dod_
19df0 63 65 72 74 73 20 3d 20 73 69 7a 65 6f 66 28 65  certs = sizeof(e
19e00 78 74 72 61 5f 63 65 72 74 73 29 20 2f 20 73 69  xtra_certs) / si
19e10 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73  zeof(extra_certs
19e20 5b 30 5d 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  [0]);..}...if (s
19e30 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot->internal) {
19e40 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63  ...num_ids = cac
19e50 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
19e60 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75  ntities(NULL, nu
19e70 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09  m_dod_certs);...
19e80 09 69 66 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20  .if (num_ids != 
19e90 30 29 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69  0) {....identiti
19ea0 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f  es = malloc(num_
19eb0 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64  ids * sizeof(*id
19ec0 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 09  entities));.....
19ed0 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
19ee0 69 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74  identities(ident
19ef0 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63  ities, num_dod_c
19f00 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20  erts);...} else 
19f10 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20  {....identities 
19f20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a  = NULL;...}....*
19f30 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f  ids_found = num_
19f40 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69  ids;....return(i
19f50 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a  dentities);..}..
19f60 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  .pcsc_identities
19f70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63   = cackey_read_c
19f80 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c  erts(slot, NULL,
19f90 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69   &num_certs);..i
19fa0 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  f (pcsc_identiti
19fb0 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
19fc0 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65  /* Convert numbe
19fd0 72 20 6f 66 20 43 65 72 74 73 20 74 6f 20 6e 75  r of Certs to nu
19fe0 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
19ff0 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28  */...num_ids = (
1a000 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
1a010 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  - CKO_CERTIFICAT
1a020 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72  E + 1) * num_cer
1a030 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75  ts;....if (inclu
1a040 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20  de_extra_certs) 
1a050 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20  {....num_ids += 
1a060 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
1a070 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c  identities(NULL,
1a080 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1a090 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69  ...}....identiti
1a0a0 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f  es = malloc(num_
1a0b0 69 64 73 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64  ids * sizeof(*id
1a0c0 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f  entities));..../
1a0d0 2a 20 41 64 64 20 63 65 72 74 69 66 69 63 61 74  * Add certificat
1a0e0 65 73 2c 20 70 75 62 6c 69 63 20 6b 65 79 73 2c  es, public keys,
1a0f0 20 61 6e 64 20 70 72 69 76 61 74 65 20 6b 65 79   and private key
1a100 73 20 66 72 6f 6d 20 74 68 65 20 73 6d 61 72 74  s from the smart
1a110 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78  card */...id_idx
1a120 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28 63 65 72   = 0;...for (cer
1a130 74 5f 69 64 78 20 3d 20 30 3b 20 63 65 72 74 5f  t_idx = 0; cert_
1a140 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b  idx < num_certs;
1a150 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09   cert_idx++) {..
1a160 09 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 74  ..for (curr_id_t
1a170 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ype = CKO_CERTIF
1a180 49 43 41 54 45 3b 20 63 75 72 72 5f 69 64 5f 74  ICATE; curr_id_t
1a190 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41  ype <= CKO_PRIVA
1a1a0 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f  TE_KEY; curr_id_
1a1b0 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64  type++) {.....id
1a1c0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1a1d0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
1a1e0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
1a1f0 74 65 73 28 63 75 72 72 5f 69 64 5f 74 79 70 65  tes(curr_id_type
1a200 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69  , &pcsc_identiti
1a210 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 63 65  es[cert_idx], ce
1a220 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
1a230 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a240 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a  ibutes_count);..
1a250 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1a260 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1a270 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
1a280 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
1a290 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1a2a0 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 6d 65  entity));.....me
1a2b0 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
1a2c0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1a2d0 6e 74 69 74 79 2c 20 26 70 63 73 63 5f 69 64 65  ntity, &pcsc_ide
1a2e0 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1a2f0 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74  ], sizeof(*ident
1a300 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1a310 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a  sc_identity));..
1a320 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ....identities[i
1a330 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e  d_idx].pcsc_iden
1a340 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
1a350 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f  e = malloc(pcsc_
1a360 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1a370 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
1a380 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70  _len);.....memcp
1a390 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
1a3a0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1a3b0 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  ty->certificate,
1a3c0 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73   pcsc_identities
1a3d0 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69  [cert_idx].certi
1a3e0 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
1a3f0 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1a400 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
1a410 6e 29 3b 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b  n);......id_idx+
1a420 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  +;....}...}....i
1a430 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61  f (include_extra
1a440 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 43 41 43  _certs) {....CAC
1a450 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a460 28 22 49 6e 63 6c 75 64 69 6e 67 20 55 53 20 47  ("Including US G
1a470 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66  overnment Certif
1a480 69 63 61 74 65 73 20 6f 6e 20 68 61 72 64 77 61  icates on hardwa
1a490 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63  re slot");.....c
1a4a0 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69  ackey_read_dod_i
1a4b0 64 65 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69  dentities(identi
1a4c0 74 69 65 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e  ties + id_idx, n
1a4d0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09  um_dod_certs);..
1a4e0 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65  .}....cackey_fre
1a4f0 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64 65  e_certs(pcsc_ide
1a500 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72  ntities, num_cer
1a510 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f  ts, 1);....*ids_
1a520 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b  found = num_ids;
1a530 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74  ....return(ident
1a540 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a 69  ities);..}....*i
1a550 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72  ds_found = 0;..r
1a560 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a  eturn(NULL);.}..
1a570 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1a580 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
1a590 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f  ialize)(CK_VOID_
1a5a0 50 54 52 20 70 49 6e 69 74 41 72 67 73 29 20 7b  PTR pInitArgs) {
1a5b0 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a  ..CK_C_INITIALIZ
1a5c0 45 5f 41 52 47 53 20 43 4b 5f 50 54 52 20 61 72  E_ARGS CK_PTR ar
1a5d0 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64  gs;..uint32_t id
1a5e0 78 2c 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 3b  x, highest_slot;
1a5f0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74  ..int mutex_init
1a600 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
1a610 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1a620 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
1a630 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1a640 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1a650 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a660 2e 20 20 41 6c 72 65 61 64 79 20 69 6e 69 74 69  .  Already initi
1a670 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1a680 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1a690 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49 54 49 41  I_ALREADY_INITIA
1a6a0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
1a6b0 28 70 49 6e 69 74 41 72 67 73 20 21 3d 20 4e 55  (pInitArgs != NU
1a6c0 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20 3d 20 70  LL) {...args = p
1a6d0 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63  InitArgs;...memc
1a6e0 70 79 28 26 63 61 63 6b 65 79 5f 61 72 67 73 2c  py(&cackey_args,
1a6f0 20 61 72 67 73 2c 20 73 69 7a 65 6f 66 28 63 61   args, sizeof(ca
1a700 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09  ckey_args));....
1a710 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65  if (args->Create
1a720 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
1a730 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75   args->DestroyMu
1a740 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex == NULL || a
1a750 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d  rgs->LockMutex =
1a760 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
1a770 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e  UnlockMutex == N
1a780 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 61 72  ULL) {....if (ar
1a790 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
1a7a0 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
1a7b0 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 21 3d  >DestroyMutex !=
1a7c0 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
1a7d0 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ockMutex != NULL
1a7e0 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
1a7f0 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b  Mutex != NULL) {
1a800 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
1a810 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1a820 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41   Some, but not A
1a830 6c 6c 20 74 68 72 65 61 64 69 6e 67 20 70 72 69  ll threading pri
1a840 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64 65 64  mitives provided
1a850 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
1a860 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1a870 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d  AD);....}...}..}
1a880 20 65 6c 73 65 20 7b 0a 09 09 63 61 63 6b 65 79   else {...cackey
1a890 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65  _args.CreateMute
1a8a0 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
1a8b0 65 79 5f 61 72 67 73 2e 44 65 73 74 72 6f 79 4d  ey_args.DestroyM
1a8c0 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1a8d0 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
1a8e0 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1a8f0 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
1a900 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09  kMutex = NULL;..
1a910 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61  .cackey_args.fla
1a920 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72  gs = 0;..}...for
1a930 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1a940 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1a950 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1a960 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1a970 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20  ns[0])); idx++) 
1a980 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  {...cackey_sessi
1a990 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20  ons[idx].active 
1a9a0 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  = 0;..}...for (i
1a9b0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
1a9c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1a9d0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1a9e0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
1a9f0 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
1aa00 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74  y_slots[idx].act
1aa10 69 76 65 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ive = 0;...cacke
1aa20 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73  y_slots[idx].pcs
1aa30 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b  c_reader = NULL;
1aa40 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1aa50 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  idx].transaction
1aa60 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 63 61  _depth = 0;...ca
1aa70 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1aa80 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
1aa90 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
1aaa0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1aab0 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30  ].slot_reset = 0
1aac0 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1aad0 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  [idx].token_flag
1aae0 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  s = 0;...cackey_
1aaf0 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
1ab00 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
1ab10 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74  y_slots[idx].int
1ab20 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ernal = 0;..}...
1ab30 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1ab40 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54  EY_NO_EXTRA_CERT
1ab50 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
1ab60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ab70 49 4e 54 46 28 22 41 73 6b 65 64 20 6e 6f 74 20  INTF("Asked not 
1ab80 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f 44 20 63  to include DoD c
1ab90 65 72 74 69 66 69 63 61 74 65 73 22 29 3b 0a 09  ertificates");..
1aba0 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69 67 68 65  } else {...highe
1abb0 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69 7a 65 6f  st_slot = (sizeo
1abc0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1abd0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1abe0 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20 31 3b 0a  slots[0])) - 1;.
1abf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ac00 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e  PRINTF("Includin
1ac10 67 20 44 6f 44 20 63 65 72 74 73 20 69 6e 20 73  g DoD certs in s
1ac20 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  lot %lu", (unsig
1ac30 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67 68 65 73  ned long) highes
1ac40 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b  t_slot);....cack
1ac50 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1ac60 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  _slot].active = 
1ac70 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  1;...cackey_slot
1ac80 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e  s[highest_slot].
1ac90 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b 0a 09 09  internal = 1;...
1aca0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67  cackey_slots[hig
1acb0 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c  hest_slot].label
1acc0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
1acd0 72 20 2a 29 20 22 55 53 20 47 6f 76 65 72 6e 6d  r *) "US Governm
1ace0 65 6e 74 20 43 65 72 74 69 66 69 63 61 74 65 73  ent Certificates
1acf0 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  ";...cackey_slot
1ad00 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e  s[highest_slot].
1ad10 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 22 43  pcsc_reader = "C
1ad20 41 43 4b 65 79 22 3b 0a 09 09 63 61 63 6b 65 79  ACKey";...cackey
1ad30 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1ad40 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  lot].token_flags
1ad50 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65   = 0;..}...cacke
1ad60 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
1ad70 31 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  1;...if (!cackey
1ad80 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b  _biglock_init) {
1ad90 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  ...mutex_init_re
1ada0 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  t = cackey_mutex
1adb0 5f 63 72 65 61 74 65 28 26 63 61 63 6b 65 79 5f  _create(&cackey_
1adc0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20  biglock);....if 
1add0 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20  (mutex_init_ret 
1ade0 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45  != 0) {....CACKE
1adf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ae00 45 72 72 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e  Error.  Mutex in
1ae10 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
1ae20 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75  led.");.....retu
1ae30 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b  rn(CKR_CANT_LOCK
1ae40 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
1ae50 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20  _biglock_init = 
1ae60 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  1;..}...CACKEY_D
1ae70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1ae80 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1ae90 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1aea0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1aeb0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1aec0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
1aed0 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44  inalize)(CK_VOID
1aee0 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
1aef0 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
1af00 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1af10 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1af20 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
1af30 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
1af40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1af50 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
1af60 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
1af70 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1af80 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1af90 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1afa0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1afb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1afc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1afd0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1afe0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1aff0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1b000 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1b010 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
1b020 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
1b030 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
1b040 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1b050 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
1b060 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1b070 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1b080 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
1b090 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
1b0a0 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  (idx);...}..}...
1b0b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
1b0c0 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
1b0d0 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1b0e0 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1b0f0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1b100 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1b110 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1b120 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1b130 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
1b140 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b  ) {....continue;
1b150 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
1b160 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1b170 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09  sc_reader) {....
1b180 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
1b190 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
1b1a0 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  er);...}....if (
1b1b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1b1c0 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ].cached_certs) 
1b1d0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65  {....cackey_free
1b1e0 5f 63 65 72 74 73 28 63 61 63 6b 65 79 5f 73 6c  _certs(cackey_sl
1b1f0 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1b200 63 65 72 74 73 2c 20 63 61 63 6b 65 79 5f 73 6c  certs, cackey_sl
1b210 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1b220 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b  certs_count, 1);
1b230 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1b240 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65  s[idx].cached_ce
1b250 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  rts = NULL;...}.
1b260 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70 63 73 63  .}...cackey_pcsc
1b270 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a  _disconnect();..
1b280 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  .cackey_initiali
1b290 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  zed = 0;...CACKE
1b2a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b2b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1b2c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1b2d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1b2e0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1b2f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1b300 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e  C_GetInfo)(CK_IN
1b310 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1b320 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1b330 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
1b340 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
1b350 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
1b360 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6c 69  c CK_UTF8CHAR li
1b370 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1b380 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a  [] = "CACKey";..
1b390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1b3a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1b3b0 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20  ...if (pInfo == 
1b3c0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1b3d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b3e0 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e  rror. pInfo is N
1b3f0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1b400 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1b410 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1b420 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1b430 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1b440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b450 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1b460 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1b470 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1b480 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1b490 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72  ;..}...pInfo->cr
1b4a0 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61  yptokiVersion.ma
1b4b0 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43  jor = ((CACKEY_C
1b4c0 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
1b4d0 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30  CODE) >> 16) & 0
1b4e0 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79  xff;..pInfo->cry
1b4f0 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e  ptokiVersion.min
1b500 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
1b510 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
1b520 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66  ODE) >> 8) & 0xf
1b530 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  f;...memset(pInf
1b540 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1b550 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
1b560 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1b570 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
1b580 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1b590 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
1b5a0 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
1b5b0 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
1b5c0 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  1);...pInfo->fla
1b5d0 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d  gs = 0x00;...mem
1b5e0 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  set(pInfo->libra
1b5f0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  ryDescription, '
1b600 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1b610 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1b620 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28  tion));..memcpy(
1b630 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65  pInfo->libraryDe
1b640 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61  scription, libra
1b650 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  ryDescription, s
1b660 69 7a 65 6f 66 28 6c 69 62 72 61 72 79 44 65 73  izeof(libraryDes
1b670 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a  cription) - 1);.
1b680 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  ..pInfo->library
1b690 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1b6a0 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
1b6b0 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78  on() >> 16) & 0x
1b6c0 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  ff;..pInfo->libr
1b6d0 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  aryVersion.minor
1b6e0 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1b6f0 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20  rsion() >> 8) & 
1b700 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  0xff;...CACKEY_D
1b710 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1b720 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1b730 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1b740 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1b750 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73  }../*. * Process
1b760 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
1b770 2c 20 61 6e 64 20 63 72 65 61 74 65 20 6d 61 70  , and create map
1b780 70 69 6e 67 20 62 65 74 77 65 65 6e 20 72 65 61  ping between rea
1b790 64 65 72 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f  der name and slo
1b7a0 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49  t ID. */.CK_DEFI
1b7b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1b7c0 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  V, C_GetSlotList
1b7d0 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e  )(CK_BBOOL token
1b7e0 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54  Present, CK_SLOT
1b7f0 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73  _ID_PTR pSlotLis
1b800 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
1b810 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61  pulCount) {..sta
1b820 74 69 63 20 69 6e 74 20 66 69 72 73 74 5f 63 61  tic int first_ca
1b830 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  ll = 1;..int mut
1b840 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
1b850 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
1b860 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e  ;..CK_ULONG coun
1b870 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  t, slot_count = 
1b880 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f  0, currslot, slo
1b890 74 5f 69 64 78 3b 0a 09 63 68 61 72 20 2a 70 63  t_idx;..char *pc
1b8a0 73 63 5f 72 65 61 64 65 72 73 2c 20 2a 70 63 73  sc_readers, *pcs
1b8b0 63 5f 72 65 61 64 65 72 73 5f 73 2c 20 2a 70 63  c_readers_s, *pc
1b8c0 73 63 5f 72 65 61 64 65 72 73 5f 65 3b 0a 09 44  sc_readers_e;..D
1b8d0 57 4f 52 44 20 70 63 73 63 5f 72 65 61 64 65 72  WORD pcsc_reader
1b8e0 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  s_len;..LONG sca
1b8f0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1b900 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63 75 72 72  et;..size_t curr
1b910 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e  _reader_len;..in
1b920 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09  t slot_reset;...
1b930 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b940 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1b950 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d  ..if (pulCount =
1b960 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1b970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b980 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74  "Error. pulCount
1b990 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1b9a0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1b9b0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1b9c0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1b9d0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1b9e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b9f0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1ba00 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1ba10 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1ba20 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1ba30 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  IZED);..}...mute
1ba40 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1ba50 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1ba60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1ba70 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1ba80 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1ba90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1baa0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1bab0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1bac0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1bad0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ERROR);..}.../* 
1bae0 43 6c 65 61 72 20 6c 69 73 74 20 6f 66 20 73 6c  Clear list of sl
1baf0 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73  ots */..slot_res
1bb00 65 74 20 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c  et = 0;..if (pSl
1bb10 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69 66 20 28  otList) {...if (
1bb20 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09  first_call) {...
1bb30 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b  .first_call = 0;
1bb40 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20  .....slot_reset 
1bb50 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49  = 1;...}..../* I
1bb60 66 20 61 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f  f any of the slo
1bb70 74 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 73  ts have been res
1bb80 65 74 20 74 68 65 6e 20 70 75 72 67 65 20 61 6c  et then purge al
1bb90 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  l information an
1bba0 64 20 63 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f  d check again */
1bbb0 0a 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74  ...for (currslot
1bbc0 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c   = 0; currslot <
1bbd0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1bbe0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1bbf0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1bc00 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
1bc10 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1bc20 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69  lots[currslot].i
1bc30 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63  nternal) {.....c
1bc40 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
1bc50 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
1bc60 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1bc70 74 69 76 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74  tive) {.....cont
1bc80 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
1bc90 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1bca0 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72  currslot].slot_r
1bcb0 65 73 65 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74  eset) {.....slot
1bcc0 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09  _reset = 1;.....
1bcd0 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
1bce0 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73  ....if (slot_res
1bcf0 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  et) {....CACKEY_
1bd00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 75  DEBUG_PRINTF("Pu
1bd10 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69  rging all slot i
1bd20 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a  nformation.");..
1bd30 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74  .../* Only updat
1bd40 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c  e the list of sl
1bd50 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63  ots if we are ac
1bd60 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 73 75 70  tually being sup
1bd70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66  ply the slot inf
1bd80 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63  ormation */....c
1bd90 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
1bda0 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
1bdb0 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
1bdc0 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
1bdd0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1bde0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1bdf0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1be00 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
1be10 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1be20 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69  lots[currslot].i
1be30 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09  nternal) {......
1be40 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a  continue;.....}.
1be50 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1be60 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1be70 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a 09  pcsc_reader) {..
1be80 09 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
1be90 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1bea0 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09  pcsc_reader);...
1beb0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1bec0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1bed0 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09  reader = NULL;..
1bee0 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61  ...}......if (ca
1bef0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1bf00 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09  lot].label) {...
1bf10 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
1bf20 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1bf30 61 62 65 6c 29 3b 0a 0a 09 09 09 09 09 63 61 63  abel);.......cac
1bf40 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1bf50 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
1bf60 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
1bf70 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1bf80 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  ot].active = 0;.
1bf90 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
1bfa0 09 09 09 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20  ......}..}.../* 
1bfb0 44 65 74 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f  Determine list o
1bfc0 66 20 72 65 61 64 65 72 73 20 2a 2f 0a 09 70 63  f readers */..pc
1bfd0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
1bfe0 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
1bff0 6e 65 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73  nect();..if (pcs
1c000 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
1c010 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
1c020 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
1c030 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e  BUG_PRINTF("Conn
1c040 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20  ection to PC/SC 
1c050 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67  failed, assuming
1c060 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09   no slots");....
1c070 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  slot_count = 0;.
1c080 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70 63 73 63  .} else {...pcsc
1c090 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30  _readers_len = 0
1c0a0 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69 73 74 72  ;....scard_listr
1c0b0 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61  eaders_ret = SCa
1c0c0 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63  rdListReaders(*c
1c0d0 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
1c0e0 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26  e, NULL, NULL, &
1c0f0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1c100 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
1c110 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20  listreaders_ret 
1c120 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f  == SCARD_F_COMM_
1c130 45 52 52 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b  ERROR) {....CACK
1c140 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c150 22 45 72 72 6f 72 2e 20 53 43 61 72 64 4c 69 73  "Error. SCardLis
1c160 74 52 65 61 64 65 72 73 28 29 20 72 65 74 75 72  tReaders() retur
1c170 6e 65 64 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d  ned SCARD_F_COMM
1c180 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67  _ERROR, assuming
1c190 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50   Connection to P
1c1a0 43 2f 53 43 20 77 65 6e 74 20 61 77 61 79 2e 20  C/SC went away. 
1c1b0 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b  Reconnecting.");
1c1c0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  .....cackey_pcsc
1c1d0 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  _disconnect();..
1c1e0 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f  ..cackey_pcsc_co
1c1f0 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09 43 41 43  nnect();.....CAC
1c200 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c210 28 22 54 72 79 69 6e 67 20 53 43 61 72 64 4c 69  ("Trying SCardLi
1c220 73 74 52 65 61 64 65 72 73 28 29 20 61 67 61 69  stReaders() agai
1c230 6e 22 29 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69  n");....scard_li
1c240 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
1c250 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1c260 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
1c270 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
1c280 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
1c290 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  len);...}....if 
1c2a0 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
1c2b0 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
1c2c0 53 5f 53 55 43 43 45 53 53 20 26 26 20 70 63 73  S_SUCCESS && pcs
1c2d0 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d  c_readers_len !=
1c2e0 20 30 29 20 7b 0a 09 09 09 70 63 73 63 5f 72 65   0) {....pcsc_re
1c2f0 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70  aders = malloc(p
1c300 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
1c310 3b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  ;....pcsc_reader
1c320 73 5f 73 20 3d 20 70 63 73 63 5f 72 65 61 64 65  s_s = pcsc_reade
1c330 72 73 3b 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69  rs;.....scard_li
1c340 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
1c350 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1c360 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
1c370 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63  ndle, NULL, pcsc
1c380 5f 72 65 61 64 65 72 73 2c 20 26 70 63 73 63 5f  _readers, &pcsc_
1c390 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09  readers_len);...
1c3a0 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
1c3b0 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
1c3c0 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
1c3d0 0a 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
1c3e0 73 5f 65 20 3d 20 70 63 73 63 5f 72 65 61 64 65  s_e = pcsc_reade
1c3f0 72 73 20 2b 20 70 63 73 63 5f 72 65 61 64 65 72  rs + pcsc_reader
1c400 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53  s_len;....../* S
1c410 74 61 72 74 20 77 69 74 68 20 53 6c 6f 74 20 49  tart with Slot I
1c420 44 20 31 2c 20 74 6f 20 61 76 6f 69 64 20 61 20  D 1, to avoid a 
1c430 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48  bug in GDM on RH
1c440 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67  EL */...../* Bug
1c450 20 35 39 34 39 31 31 3a 20 68 74 74 70 73 3a 2f   594911: https:/
1c460 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74  /bugzilla.redhat
1c470 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67  .com/show_bug.cg
1c480 69 3f 69 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09  i?id=594911 */..
1c490 09 09 09 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b  ...currslot = 1;
1c4a0 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20  .....slot_count 
1c4b0 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c 65 20 28  = 0;.....while (
1c4c0 70 63 73 63 5f 72 65 61 64 65 72 73 20 3c 20 70  pcsc_readers < p
1c4d0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b  csc_readers_e) {
1c4e0 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65  ....../* Find ne
1c4f0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  xt available slo
1c500 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b  t */......for (;
1c510 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
1c520 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1c530 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1c540 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
1c550 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09  rrslot++) {.....
1c560 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c  ..if (!cackey_sl
1c570 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1c580 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09 09 62  tive) {........b
1c590 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09  reak;.......}...
1c5a0 09 09 09 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f  ...}.......curr_
1c5b0 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72  reader_len = str
1c5c0 6c 65 6e 28 70 63 73 63 5f 72 65 61 64 65 72 73  len(pcsc_readers
1c5d0 29 3b 0a 0a 09 09 09 09 09 69 66 20 28 28 70 63  );.......if ((pc
1c5e0 73 63 5f 72 65 61 64 65 72 73 20 2b 20 63 75 72  sc_readers + cur
1c5f0 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20  r_reader_len) > 
1c600 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 29 20  pcsc_readers_e) 
1c610 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  {.......break;..
1c620 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
1c630 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20  curr_reader_len 
1c640 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 62 72  == 0) {.......br
1c650 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09  eak;......}.....
1c660 09 09 69 66 20 28 63 75 72 72 73 6c 6f 74 20 3e  ..if (currslot >
1c670 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1c680 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1c690 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1c6a0 29 29 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  ))) {.......CACK
1c6b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c6c0 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72 65 61 64  "Found more read
1c6d0 65 72 73 20 74 68 61 6e 20 73 6c 6f 74 73 20 61  ers than slots a
1c6e0 72 65 20 61 76 61 69 6c 61 62 6c 65 21 22 29 3b  re available!");
1c6f0 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
1c700 09 09 09 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b  ....}.......CACK
1c710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c720 22 46 6f 75 6e 64 20 72 65 61 64 65 72 3a 20 25  "Found reader: %
1c730 73 22 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73  s", pcsc_readers
1c740 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79  );......./* Only
1c750 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73 74   update the list
1c760 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20   of slots if we 
1c770 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69  are actually bei
1c780 6e 67 20 61 73 6b 65 64 20 73 75 70 70 6c 79 20  ng asked supply 
1c790 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61  the slot informa
1c7a0 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20  tion */......if 
1c7b0 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09  (pSlotList) {...
1c7c0 09 09 09 09 69 66 20 28 73 6c 6f 74 5f 72 65 73  ....if (slot_res
1c7d0 65 74 29 20 7b 0a 09 09 09 09 09 09 09 63 61 63  et) {........cac
1c7e0 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1c7f0 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a  ot].active = 1;.
1c800 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1c810 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e  ots[currslot].in
1c820 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 09 09 09  ternal = 0;.....
1c830 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1c840 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
1c850 65 61 64 65 72 20 3d 20 73 74 72 64 75 70 28 70  eader = strdup(p
1c860 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 09 09  csc_readers);...
1c870 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1c880 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63  s[currslot].pcsc
1c890 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
1c8a0 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  = 0;........cack
1c8b0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1c8c0 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t].transaction_d
1c8d0 65 70 74 68 20 3d 20 30 3b 0a 09 09 09 09 09 09  epth = 0;.......
1c8e0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1c8f0 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74  rrslot].transact
1c900 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
1c910 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
1c920 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1c930 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ot].token_flags 
1c940 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
1c950 49 52 45 44 3b 0a 09 09 09 09 09 09 09 63 61 63  IRED;........cac
1c960 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1c970 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c  ot].label = NULL
1c980 3b 0a 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  ;.........cackey
1c990 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
1c9a0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (&cackey_slots[c
1c9b0 75 72 72 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09  urrslot]);......
1c9c0 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
1c9d0 0a 09 09 09 09 09 09 2f 2a 20 41 72 74 69 66 69  ......./* Artifi
1c9e0 63 69 61 6c 6c 79 20 69 6e 63 72 65 61 73 65 20  cially increase 
1c9f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 63  the number of ac
1ca00 74 69 76 65 20 73 6c 6f 74 73 20 62 79 20 77 68  tive slots by wh
1ca10 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  at will become a
1ca20 63 74 69 76 65 20 2a 2f 0a 09 09 09 09 09 09 73  ctive */.......s
1ca30 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09  lot_count++;....
1ca40 09 09 7d 0a 09 09 09 09 09 63 75 72 72 73 6c 6f  ..}......currslo
1ca50 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f  t++;.......pcsc_
1ca60 72 65 61 64 65 72 73 20 2b 3d 20 63 75 72 72 5f  readers += curr_
1ca70 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a  reader_len + 1;.
1ca80 09 09 09 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28  ....}......for (
1ca90 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75  currslot = 0; cu
1caa0 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1cab0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1cac0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1cad0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
1cae0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  lot++) {......if
1caf0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1cb00 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1cb10 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
1cb20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
1cb30 75 6e 64 20 61 63 74 69 76 65 20 73 6c 6f 74 20  und active slot 
1cb40 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  %lu", (unsigned 
1cb50 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f 74 29 3b  long) currslot);
1cb60 0a 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75  ........slot_cou
1cb70 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09  nt++;......}....
1cb80 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  .}....} else {..
1cb90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cba0 50 52 49 4e 54 46 28 22 53 65 63 6f 6e 64 20 63  PRINTF("Second c
1cbb0 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74  all to SCardList
1cbc0 52 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20  Readers failed, 
1cbd0 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20  return %s/%li", 
1cbe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
1cbf0 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
1cc00 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  R(scard_listread
1cc10 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29  ers_ret), (long)
1cc20 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
1cc30 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09  rs_ret);....}...
1cc40 09 09 66 72 65 65 28 70 63 73 63 5f 72 65 61 64  ..free(pcsc_read
1cc50 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65  ers_s);...} else
1cc60 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1cc70 55 47 5f 50 52 49 4e 54 46 28 22 46 69 72 73 74  UG_PRINTF("First
1cc80 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69   call to SCardLi
1cc90 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65 64  stReaders failed
1cca0 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69 22  , return %s/%li"
1ccb0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
1ccc0 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
1ccd0 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72 65  STR(scard_listre
1cce0 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e  aders_ret), (lon
1ccf0 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61  g) scard_listrea
1cd00 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09  ders_ret);...}..
1cd10 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1cd20 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1cd30 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1cd40 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1cd50 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1cd60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1cd70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1cd80 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
1cd90 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1cda0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1cdb0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c  R);..}...if (pSl
1cdc0 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  otList == NULL) 
1cdd0 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  {...*pulCount = 
1cde0 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43  slot_count;....C
1cdf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ce00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ce10 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e  R_OK (%i).  Foun
1ce20 64 20 25 6c 75 20 72 65 61 64 65 72 73 2c 20 62  d %lu readers, b
1ce30 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49  ut not storing I
1ce40 44 73 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  Ds (pSlotList ==
1ce50 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c   NULL)", CKR_OK,
1ce60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1ce70 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09   slot_count);...
1ce80 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1ce90 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70  ..}...count = *p
1cea0 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f  ulCount;..if (co
1ceb0 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt < slot_count
1cec0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ced0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1cee0 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
1cef0 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
1cf00 74 20 77 65 20 68 61 76 65 20 25 6c 75 20 65 6e  t we have %lu en
1cf10 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20  tries.", count, 
1cf20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  slot_count);....
1cf30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cf40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1cf50 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
1cf60 41 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ALL");....return
1cf70 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f  (CKR_BUFFER_TOO_
1cf80 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75  SMALL);...}...mu
1cf90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1cfa0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1cfb0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1cfc0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1cfd0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1cfe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cff0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1d000 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1d010 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d020 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
1d030 6c 6f 74 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  lot_idx = 0;..fo
1d040 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
1d050 20 28 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69   (currslot < (si
1d060 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d070 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1d080 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20  ey_slots[0]))); 
1d090 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
1d0a0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1d0b0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1d0c0 76 65 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75  ve) {....continu
1d0d0 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c  e;...}....if (sl
1d0e0 6f 74 5f 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29  ot_idx >= count)
1d0f0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1d100 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d110 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61 74 65 64  . User allocated
1d120 20 25 6c 75 20 65 6e 74 72 69 65 73 2c 20 62 75   %lu entries, bu
1d130 74 20 77 65 20 6a 75 73 74 20 74 72 69 65 64 20  t we just tried 
1d140 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1d150 25 6c 75 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e  %lu index -- ign
1d160 6f 72 69 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73  oring", count, s
1d170 6c 6f 74 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f  lot_idx);.....co
1d180 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70  ntinue;...}....p
1d190 53 6c 6f 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64  SlotList[slot_id
1d1a0 78 5d 20 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09  x] = currslot;..
1d1b0 09 73 6c 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a  .slot_idx++;..}.
1d1c0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1d1d0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1d1e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1d1f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1d200 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1d210 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d220 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1d230 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1d240 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1d250 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1d260 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74  ;..}...*pulCount
1d270 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a   = slot_count;..
1d280 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d290 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1d2a0 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f  CKR_OK (%i).  Fo
1d2b0 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73 2e  und %lu readers.
1d2c0 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
1d2d0 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
1d2e0 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  count);...return
1d2f0 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65  (CKR_OK);...toke
1d300 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e  nPresent = token
1d310 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72  Present; /* Supr
1d320 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61  ess unused varia
1d330 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d  ble warning */.}
1d340 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1d350 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1d360 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c  tSlotInfo)(CK_SL
1d370 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1d380 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70  _SLOT_INFO_PTR p
1d390 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20  Info) {..static 
1d3a0 43 4b 5f 55 54 46 38 43 48 41 52 20 73 6c 6f 74  CK_UTF8CHAR slot
1d3b0 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
1d3c0 22 43 41 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09  "CACKey Slot";..
1d3d0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1d3e0 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f  ;..int bytes_to_
1d3f0 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  copy;...CACKEY_D
1d400 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1d410 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1d420 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1d430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1d440 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1d450 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1d460 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1d470 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1d480 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1d490 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1d4a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d4b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1d4c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1d4d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1d4e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1d4f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1d500 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1d510 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1d520 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1d530 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1d540 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1d550 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d560 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1d570 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1d580 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1d590 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1d5a0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1d5b0 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1d5c0 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1d5d0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1d5e0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1d5f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d600 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1d610 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1d620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d630 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1d640 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1d650 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1d660 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1d670 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1d680 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1d690 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1d6a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d6b0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1d6c0 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1d6d0 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1d6e0 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1d6f0 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1d700 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1d710 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d720 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d730 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1d740 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66  );..}...pInfo->f
1d750 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c  lags = CKF_HW_SL
1d760 4f 54 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  OT;...if (!cacke
1d770 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1d780 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49  internal) {...pI
1d790 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b  nfo->flags |= CK
1d7a0 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49  F_REMOVABLE_DEVI
1d7b0 43 45 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  CE;..}...if (cac
1d7c0 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
1d7d0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1d7e0 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b  slotID]) == CACK
1d7f0 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
1d800 52 45 53 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66  RESENT) {...pInf
1d810 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  o->flags |= CKF_
1d820 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09  TOKEN_PRESENT;..
1d830 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  }...bytes_to_cop
1d840 79 20 3d 20 73 74 72 6c 65 6e 28 63 61 63 6b 65  y = strlen(cacke
1d850 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1d860 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 69  pcsc_reader);..i
1d870 66 20 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  f (sizeof(pInfo-
1d880 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1d890 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79   < bytes_to_copy
1d8a0 29 20 7b 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63  ) {...bytes_to_c
1d8b0 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e  opy = sizeof(pIn
1d8c0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1d8d0 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28  ID);..}..memcpy(
1d8e0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1d8f0 72 65 72 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c  rerID, cackey_sl
1d900 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63  ots[slotID].pcsc
1d910 5f 72 65 61 64 65 72 2c 20 62 79 74 65 73 5f 74  _reader, bytes_t
1d920 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78  o_copy);...mutex
1d930 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1d940 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1d950 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1d960 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1d970 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1d980 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d990 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1d9a0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1d9b0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1d9c0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1d9d0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c  memset(pInfo->sl
1d9e0 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 27  otDescription, '
1d9f0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1da00 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
1da10 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  n));..memcpy(pIn
1da20 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74  fo->slotDescript
1da30 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63 72 69 70  ion, slotDescrip
1da40 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f  tion, sizeof(slo
1da50 74 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  tDescription) - 
1da60 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
1da70 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1da80 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  ID, ' ', sizeof(
1da90 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1daa0 72 65 72 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f  rerID));...pInfo
1dab0 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1dac0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1dad0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1dae0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1daf0 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1db00 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1db10 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1db20 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1db30 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
1db40 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1db50 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
1db60 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
1db70 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
1db80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1db90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1dba0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1dbb0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1dbc0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
1dbd0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
1dbe0 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49  _RV, C_GetTokenI
1dbf0 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
1dc00 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e  slotID, CK_TOKEN
1dc10 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
1dc20 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
1dc30 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
1dc40 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
1dc50 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
1dc60 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1dc70 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20   defaultLabel[] 
1dc80 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e  = "Unknown Token
1dc90 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54  ";..static CK_UT
1dca0 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d  F8CHAR model[] =
1dcb0 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73   "CAC Token";..s
1dcc0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
1dcd0 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
1dce0 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e  _identities;..un
1dcf0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f  signed long num_
1dd00 63 65 72 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20  certs;..ssize_t 
1dd10 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20  label_ret;..int 
1dd20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
1dd30 6e 74 20 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c  nt use_default_l
1dd40 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  abel;...CACKEY_D
1dd50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1dd60 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1dd70 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1dd80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1dd90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1dda0 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1ddb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1ddc0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1ddd0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1dde0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1ddf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1de00 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1de10 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1de20 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1de30 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1de40 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
1de50 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
1de60 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
1de70 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1de80 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1de90 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
1dea0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1deb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1dec0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1ded0 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
1dee0 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
1def0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
1df00 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
1df10 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
1df20 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1df30 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1df40 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1df50 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1df60 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1df70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1df80 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1df90 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1dfa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1dfb0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1dfc0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1dfd0 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
1dfe0 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
1dff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e000 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
1e010 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
1e020 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
1e030 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
1e040 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
1e050 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1e060 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1e070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e080 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1e090 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
1e0a0 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
1e0b0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
1e0c0 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45  lotID]) != CACKE
1e0d0 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52  Y_PCSC_S_TOKENPR
1e0e0 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45  ESENT) {...CACKE
1e0f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e100 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70 72 65 73  No token is pres
1e110 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20  ent in slotID = 
1e120 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  %lu", slotID);..
1e130 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1e140 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1e150 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1e160 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50  (CKR_TOKEN_NOT_P
1e170 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75  RESENT);..}...mu
1e180 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1e190 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1e1a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1e1b0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1e1c0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1e1d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e1e0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1e1f0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1e200 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1e210 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1e220 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
1e230 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d  token label from
1e240 20 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f   certificates */
1e250 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1e260 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  label, ' ', size
1e270 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
1e280 29 3b 0a 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  );..use_default_
1e290 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20  label = 1;...if 
1e2a0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1e2b0 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e  otID].label == N
1e2c0 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63 5f 69 64  ULL) {...pcsc_id
1e2d0 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
1e2e0 79 5f 72 65 61 64 5f 63 65 72 74 73 28 26 63 61  y_read_certs(&ca
1e2f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1e300 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63  D], NULL, &num_c
1e310 65 72 74 73 29 3b 0a 09 09 69 66 20 28 70 63 73  erts);...if (pcs
1e320 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
1e330 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e  NULL) {....if (n
1e340 75 6d 5f 63 65 72 74 73 20 3e 20 30 29 20 7b 0a  um_certs > 0) {.
1e350 09 09 09 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20  ....label_ret = 
1e360 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
1e370 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63  tity_to_label(pc
1e380 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 70  sc_identities, p
1e390 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a  Info->label, siz
1e3a0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
1e3b0 29 29 3b 0a 09 09 09 09 69 66 20 28 6c 61 62 65  ));.....if (labe
1e3c0 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a 09 09 09  l_ret > 0) {....
1e3d0 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61  ..use_default_la
1e3e0 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63  bel = 0;.......c
1e3f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1e400 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c  ID].label = mall
1e410 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  oc(sizeof(pInfo-
1e420 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09  >label));.......
1e430 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 6c  memcpy(cackey_sl
1e440 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
1e450 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  l, pInfo->label,
1e460 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1e470 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09  abel));.....}...
1e480 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
1e490 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f 69 64  ee_certs(pcsc_id
1e4a0 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65  entities, num_ce
1e4b0 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20  rts, 1);...}..} 
1e4c0 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28  else {...memcpy(
1e4d0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61  pInfo->label, ca
1e4e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1e4f0 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  D].label, sizeof
1e500 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1e510 0a 0a 09 09 75 73 65 5f 64 65 66 61 75 6c 74 5f  ....use_default_
1e520 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09  label = 0;..}...
1e530 69 66 20 28 75 73 65 5f 64 65 66 61 75 6c 74 5f  if (use_default_
1e540 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70  label) {...memcp
1e550 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  y(pInfo->label, 
1e560 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69  defaultLabel, si
1e570 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c 61 62 65  zeof(defaultLabe
1e580 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65  l) - 1);..}...me
1e590 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  mset(pInfo->manu
1e5a0 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c  facturerID, ' ',
1e5b0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1e5c0 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b  anufacturerID));
1e5d0 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1e5e0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1e5f0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1e600 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75  sizeof(manufactu
1e610 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d  rerID) - 1);...m
1e620 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64  emset(pInfo->mod
1e630 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  el, ' ', sizeof(
1e640 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a  pInfo->model));.
1e650 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d  .memcpy(pInfo->m
1e660 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a  odel, model, siz
1e670 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b  eof(model) - 1);
1e680 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1e690 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27  >serialNumber, '
1e6a0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1e6b0 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72 29 29  ->serialNumber))
1e6c0 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1e6d0 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20 27 2c 20  ->utcTime, ' ', 
1e6e0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74  sizeof(pInfo->ut
1e6f0 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f  cTime));...pInfo
1e700 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f  ->hardwareVersio
1e710 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1e720 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1e730 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1e740 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1e750 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1e760 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1e770 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1e780 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ...pInfo->firmwa
1e790 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  reVersion.major 
1e7a0 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e  = 0x00;..pInfo->
1e7b0 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e  firmwareVersion.
1e7c0 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09  minor = 0x00;...
1e7d0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
1e7e0 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  KF_WRITE_PROTECT
1e7f0 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49  ED | CKF_USER_PI
1e800 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20  N_INITIALIZED | 
1e810 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41  CKF_TOKEN_INITIA
1e820 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65 79 5f 73  LIZED | cackey_s
1e830 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
1e840 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66  en_flags;...pInf
1e850 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43  o->ulMaxSessionC
1e860 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f 66 28 63  ount = (sizeof(c
1e870 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1e880 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1e890 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20  sessions[0])) - 
1e8a0 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73  1;..pInfo->ulSes
1e8b0 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55  sionCount = CK_U
1e8c0 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1e8d0 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
1e8e0 75 6c 4d 61 78 52 77 53 65 73 73 69 6f 6e 43 6f  ulMaxRwSessionCo
1e8f0 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d  unt = 0;..pInfo-
1e900 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e  >ulRwSessionCoun
1e910 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  t = CK_UNAVAILAB
1e920 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
1e930 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e  .pInfo->ulMaxPin
1e940 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66  Len = 128;..pInf
1e950 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d  o->ulMinPinLen =
1e960 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f   0;..pInfo->ulTo
1e970 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  talPublicMemory 
1e980 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1e990 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1e9a0 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c  Info->ulFreePubl
1e9b0 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  icMemory = CK_UN
1e9c0 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1e9d0 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
1e9e0 6c 54 6f 74 61 6c 50 72 69 76 61 74 65 4d 65 6d  lTotalPrivateMem
1e9f0 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
1ea00 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
1ea10 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
1ea20 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
1ea30 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1ea40 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41  NFORMATION;...CA
1ea50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ea60 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1ea70 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1ea80 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1ea90 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1eaa0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1eab0 56 2c 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74  V, C_WaitForSlot
1eac0 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20  Event)(CK_FLAGS 
1ead0 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49  flags, CK_SLOT_I
1eae0 44 5f 50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43  D_PTR pSlotID, C
1eaf0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65  K_VOID_PTR pRese
1eb00 72 76 65 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f  rved) {..CACKEY_
1eb10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1eb20 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1eb30 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c  Reserved != NULL
1eb40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1eb50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1eb60 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20 6e  . pReserved is n
1eb70 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  ot NULL.");....r
1eb80 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1eb90 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1eba0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1ebb0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1ebc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ebd0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1ebe0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1ebf0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1ec00 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1ec10 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58  ZED);..}.../* XX
1ec20 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65  X: TODO: Impleme
1ec30 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43  nt this... */..C
1ec40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ec50 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ec60 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
1ec70 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
1ec80 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1ec90 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
1eca0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
1ecb0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1ecc0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1ecd0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1ece0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
1ecf0 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  st)(CK_SLOT_ID s
1ed00 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
1ed10 49 53 4d 5f 54 59 50 45 5f 50 54 52 20 70 4d 65  ISM_TYPE_PTR pMe
1ed20 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f  chanismList, CK_
1ed30 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
1ed40 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  nt) {..CACKEY_DE
1ed50 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1ed60 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1ed70 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1ed80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ed90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1eda0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1edb0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1edc0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1edd0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1ede0 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e  .}...if (pulCoun
1edf0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
1ee00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ee10 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 43  TF("Error.  pulC
1ee20 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ount is NULL.");
1ee30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1ee40 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1ee50 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
1ee60 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  smList == NULL) 
1ee70 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  {...*pulCount = 
1ee80 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
1ee90 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1eea0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1eeb0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
1eec0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
1eed0 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e  }...if (*pulCoun
1eee0 74 20 3c 20 31 29 20 7b 0a 09 09 43 41 43 4b 45  t < 1) {...CACKE
1eef0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ef00 45 72 72 6f 72 2e 20 20 42 75 66 66 65 72 20 74  Error.  Buffer t
1ef10 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09  oo small.");....
1ef20 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45  return(CKR_BUFFE
1ef30 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d  R_TOO_SMALL);..}
1ef40 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  ...pMechanismLis
1ef50 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50  t[0] = CKM_RSA_P
1ef60 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20  KCS;..*pulCount 
1ef70 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  = 1;...CACKEY_DE
1ef80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1ef90 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1efa0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1efb0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1efc0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1efd0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1efe0 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28  tMechanismInfo)(
1eff0 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1f000 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  D, CK_MECHANISM_
1f010 54 59 50 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45  TYPE type, CK_ME
1f020 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52  CHANISM_INFO_PTR
1f030 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d   pInfo) {..int m
1f040 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
1f050 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f060 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1f070 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
1f080 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1f090 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1f0a0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
1f0b0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1f0c0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1f0d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1f0e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1f0f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f100 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f110 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1f120 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1f130 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1f140 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f150 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
1f160 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1f170 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1f180 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1f190 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1f1a0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1f1b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f1c0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1f1d0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1f1e0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1f1f0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1f200 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f210 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1f220 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1f230 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1f240 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1f250 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1f260 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1f270 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f280 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f290 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1f2a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f2b0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1f2c0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
1f2d0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1f2e0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
1f2f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f300 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1f310 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1f320 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
1f330 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
1f340 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
1f350 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1f360 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1f370 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1f380 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1f390 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1f3a0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1f3b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1f3c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1f3d0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1f3e0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1f3f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f400 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1f410 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1f420 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1f430 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1f440 7d 0a 0a 09 73 77 69 74 63 68 20 28 74 79 70 65  }...switch (type
1f450 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
1f460 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66  SA_PKCS:....pInf
1f470 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20  o->ulMinKeySize 
1f480 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d  = 512;....pInfo-
1f490 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20  >ulMaxKeySize = 
1f4a0 38 31 39 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e  8192;....pInfo->
1f4b0 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c  flags = CKF_HW |
1f4c0 20 43 4b 46 5f 45 4e 43 52 59 50 54 20 7c 20 43   CKF_ENCRYPT | C
1f4d0 4b 46 5f 44 45 43 52 59 50 54 20 7c 20 43 4b 46  KF_DECRYPT | CKF
1f4e0 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49  _SIGN | CKF_VERI
1f4f0 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  FY;....break;..}
1f500 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f510 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1f520 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1f530 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1f540 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
1f550 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72   We don't suppor
1f560 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a  t this method. *
1f570 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
1f580 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e  TION(CK_RV, C_In
1f590 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54  itToken)(CK_SLOT
1f5a0 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55  _ID slotID, CK_U
1f5b0 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e  TF8CHAR_PTR pPin
1f5c0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e  , CK_ULONG ulPin
1f5d0 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  Len, CK_UTF8CHAR
1f5e0 5f 50 54 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09  _PTR pLabel) {..
1f5f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f600 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f610 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f620 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f630 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f640 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f650 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f660 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f670 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f680 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f690 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f6a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f6b0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
1f6c0 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b  TECTED (%i)", CK
1f6d0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1f6e0 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75  OTECTED);...retu
1f6f0 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  rn(CKR_TOKEN_WRI
1f700 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d  TE_PROTECTED);.}
1f710 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
1f720 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
1f730 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
1f740 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f750 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45  C_InitPIN)(CK_SE
1f760 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
1f770 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48  ssion, CK_UTF8CH
1f780 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
1f790 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20  ULONG ulPinLen) 
1f7a0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1f7b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f7c0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1f7d0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1f7e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f7f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1f800 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1f810 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f820 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1f830 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1f840 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f850 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1f860 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
1f870 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c  PROTECTED (%i)",
1f880 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
1f890 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72  _PROTECTED);...r
1f8a0 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
1f8b0 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
1f8c0 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
1f8d0 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
1f8e0 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
1f8f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1f900 56 2c 20 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f  V, C_SetPIN)(CK_
1f910 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
1f920 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38  Session, CK_UTF8
1f930 43 48 41 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e  CHAR_PTR pOldPin
1f940 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64  , CK_ULONG ulOld
1f950 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43  PinLen, CK_UTF8C
1f960 48 41 52 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c  HAR_PTR pNewPin,
1f970 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50   CK_ULONG ulNewP
1f980 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
1f990 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1f9a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1f9b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1f9c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1f9d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f9e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1f9f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1fa00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1fa10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1fa20 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
1fa30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1fa40 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
1fa50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1fa60 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
1fa70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1fa80 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
1fa90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
1faa0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
1fab0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1fac0 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53  N(CK_RV, C_OpenS
1fad0 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f  ession)(CK_SLOT_
1fae0 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c  ID slotID, CK_FL
1faf0 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f  AGS flags, CK_VO
1fb00 49 44 5f 50 54 52 20 70 41 70 70 6c 69 63 61 74  ID_PTR pApplicat
1fb10 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e  ion, CK_NOTIFY n
1fb20 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f  otify, CK_SESSIO
1fb30 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 53  N_HANDLE_PTR phS
1fb40 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67  ession) {..unsig
1fb50 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69  ned long idx;..i
1fb60 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1fb70 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73  ..int found_sess
1fb80 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45  ion = 0;...CACKE
1fb90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fba0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1fbb0 28 28 66 6c 61 67 73 20 26 20 43 4b 46 5f 53 45  ((flags & CKF_SE
1fbc0 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d  RIAL_SESSION) !=
1fbd0 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
1fbe0 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ION) {...return(
1fbf0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41  CKR_SESSION_PARA
1fc00 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  LLEL_NOT_SUPPORT
1fc10 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ED);..}...if (!c
1fc20 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1fc30 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1fc40 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fc50 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1fc60 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1fc70 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1fc80 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1fc90 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ..}...if (slotID
1fca0 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
1fcb0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1fcc0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1fcd0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1fce0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
1fcf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1fd00 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
1fd10 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
1fd20 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
1fd30 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
1fd40 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
1fd50 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
1fd60 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1fd70 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1fd80 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1fd90 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1fda0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1fdb0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1fdc0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fdd0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1fde0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1fdf0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1fe00 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
1fe10 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1fe20 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
1fe30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fe40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fe50 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1fe60 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
1fe70 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
1fe80 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
1fe90 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1fea0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1feb0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1fec0 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
1fed0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
1fee0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1fef0 68 65 20 63 61 72 64 20 69 73 20 61 63 74 75 61  he card is actua
1ff00 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e  lly in the slot.
1ff10 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65   */../* XXX: Che
1ff20 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ck to make sure 
1ff30 74 68 69 73 20 69 73 20 69 6e 20 74 68 65 20 50  this is in the P
1ff40 4b 43 53 23 31 31 20 73 70 65 63 69 66 69 63 61  KCS#11 specifica
1ff50 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63  tion */..if (cac
1ff60 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e  key_token_presen
1ff70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
1ff80 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41 43 4b  slotID]) != CACK
1ff90 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50  EY_PCSC_S_TOKENP
1ffa0 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b  RESENT) {...CACK
1ffb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ffc0 22 45 72 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f  "Error.  Card no
1ffd0 74 20 70 72 65 73 65 6e 74 2e 20 20 52 65 74 75  t present.  Retu
1ffe0 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56 49 43 45  rning CKR_DEVICE
1fff0 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63  _REMOVED");....c
20000 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20010 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20020 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
20030 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44  R_DEVICE_REMOVED
20040 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
20050 20 3d 20 31 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 1; idx < (siz
20060 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
20070 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
20080 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
20090 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
200a0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
200b0 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
200c0 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73 65 73 73   {....found_sess
200d0 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68  ion = 1;.....*ph
200e0 53 65 73 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a  Session = idx;..
200f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
20100 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ns[idx].active =
20110 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65   1;....cackey_se
20120 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74  ssions[idx].slot
20130 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09  ID = slotID;....
20140 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20150 69 64 78 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53  idx].state = CKS
20160 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49  _RO_PUBLIC_SESSI
20170 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ON;....cackey_se
20180 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67  ssions[idx].flag
20190 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09 09 63 61  s = flags;....ca
201a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
201b0 78 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  x].ulDeviceError
201c0 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
201d0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41  sessions[idx].pA
201e0 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20 70 41 70  pplication = pAp
201f0 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61  plication;....ca
20200 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
20210 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69  x].Notify = noti
20220 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  fy;.....cackey_s
20230 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
20240 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a  ntities = NULL;.
20250 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
20260 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
20270 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  es_count = 0;...
20280 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
20290 73 5b 69 64 78 5d 2e 73 65 61 72 63 68 5f 61 63  s[idx].search_ac
202a0 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61  tive = 0;.....ca
202b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
202c0 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  x].sign_active =
202d0 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
202e0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63  essions[idx].dec
202f0 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
20300 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
20310 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
20320 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
20330 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63  ad_identities(&c
20340 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
20350 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73  ID], &cackey_ses
20360 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
20370 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a  ities_count);...
20380 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d  ...break;...}..}
20390 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
203a0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
203b0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
203c0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
203d0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
203e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
203f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20400 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
20410 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20420 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20430 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75  );..}...if (!fou
20440 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09  nd_session) {...
20450 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20460 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20470 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
20480 20 28 25 69 29 22 2c 20 43 4b 52 5f 53 45 53 53   (%i)", CKR_SESS
20490 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72  ION_COUNT);....r
204a0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
204b0 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43  N_COUNT);..}...C
204c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
204d0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
204e0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
204f0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
20500 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
20510 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
20520 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65 73 73 69  RV, C_CloseSessi
20530 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  on)(CK_SESSION_H
20540 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
20550 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
20560 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
20570 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
20580 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
20590 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
205a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
205b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
205c0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
205d0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
205e0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
205f0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
20600 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
20610 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
20620 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
20630 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
20640 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
20650 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
20660 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20670 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
20680 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
20690 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
206a0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
206b0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
206c0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
206d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
206e0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
206f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
20700 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
20710 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20720 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20730 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
20740 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20750 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
20760 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
20770 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20780 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
20790 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
207a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
207b0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
207c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
207d0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
207e0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
207f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
20800 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
20810 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
20820 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
20830 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30  sion].active = 0
20840 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ;..cackey_free_i
20850 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(cackey
20860 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
20870 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
20880 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20890 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
208a0 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d  ties_count);...m
208b0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
208c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
208d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
208e0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
208f0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
20900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20910 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
20920 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
20930 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
20940 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
20950 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
20960 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20970 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
20980 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
20990 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
209a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
209b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65  N(CK_RV, C_Close
209c0 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f  AllSessions)(CK_
209d0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 29 20  SLOT_ID slotID) 
209e0 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 3b  {..uint32_t idx;
209f0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
20a00 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
20a10 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
20a20 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
20a30 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
20a40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20a50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20a60 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
20a70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20a80 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
20a90 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
20aa0 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c  }...if (slotID <
20ab0 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20   0 || slotID >= 
20ac0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
20ad0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
20ae0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
20af0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20b00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20b10 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
20b20 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
20b30 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64  outside of valid
20b40 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29   range", slotID)
20b50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20b60 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
20b70 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
20b80 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20b90 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
20ba0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
20bb0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
20bc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20bd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20be0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
20bf0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20c00 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20c10 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
20c20 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
20c30 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a  .active == 0) {.
20c40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20c50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
20c60 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
20c70 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74  sted (%lu), slot
20c80 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
20c90 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b  ctive", slotID);
20ca0 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
20cb0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
20cc0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75  iglock);....retu
20cd0 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
20ce0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f  NVALID);..}...fo
20cf0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
20d00 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
20d10 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
20d20 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
20d30 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ons[0])); idx++)
20d40 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
20d50 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63  sessions[idx].ac
20d60 74 69 76 65 29 20 7b 0a 09 09 09 69 66 20 28 63  tive) {....if (c
20d70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
20d80 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c  dx].slotID != sl
20d90 6f 74 49 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74  otID) {.....cont
20da0 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63  inue;....}.....c
20db0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20dc0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20dd0 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65  k);....C_CloseSe
20de0 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63  ssion(idx);....c
20df0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
20e00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20e10 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
20e20 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
20e30 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20e40 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20e50 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
20e60 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
20e70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20e80 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
20e90 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
20ea0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
20eb0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
20ec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20ed0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20ee0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
20ef0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
20f00 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
20f10 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
20f20 5f 52 56 2c 20 43 5f 47 65 74 53 65 73 73 69 6f  _RV, C_GetSessio
20f30 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f  nInfo)(CK_SESSIO
20f40 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
20f50 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e  n, CK_SESSION_IN
20f60 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
20f70 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
20f80 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
20f90 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
20fa0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
20fb0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
20fc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20fd0 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
20fe0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
20ff0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
21000 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
21010 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21020 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21030 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21040 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
21050 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
21060 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
21070 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21080 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
21090 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
210a0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
210b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
210c0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
210d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
210e0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
210f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21100 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
21110 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
21120 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
21130 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
21140 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
21150 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21160 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
21170 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21180 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21190 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
211a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
211b0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
211c0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
211d0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
211e0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
211f0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
21200 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
21210 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
21220 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21230 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21240 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21250 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
21260 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
21270 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
21280 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
21290 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
212a0 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20  ..pInfo->slotID 
212b0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
212c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
212d0 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74  ID;..pInfo->stat
212e0 65 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  e = cackey_sessi
212f0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
21300 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61  ate;..pInfo->fla
21310 67 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  gs = cackey_sess
21320 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66  ions[hSession].f
21330 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  lags;..pInfo->ul
21340 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 63 61  DeviceError = ca
21350 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21360 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65  ession].ulDevice
21370 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72  Error;...mutex_r
21380 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21390 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
213a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
213b0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
213c0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
213d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
213e0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
213f0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21400 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21410 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
21420 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21430 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21440 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
21450 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
21460 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
21470 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
21480 56 2c 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f  V, C_GetOperatio
21490 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49  nState)(CK_SESSI
214a0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
214b0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
214c0 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c  pOperationState,
214d0 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
214e0 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c  lOperationStateL
214f0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
21500 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
21510 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
21520 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21530 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21540 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21550 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21560 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21570 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
21580 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
21590 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
215a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
215b0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
215c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
215d0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
215e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
215f0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
21600 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
21610 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
21620 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
21630 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70 65 72 61  K_RV, C_SetOpera
21640 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
21650 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21660 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
21670 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
21680 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f  te, CK_ULONG ulO
21690 70 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e  perationStateLen
216a0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
216b0 4c 45 20 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65  LE hEncryptionKe
216c0 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
216d0 44 4c 45 20 68 41 75 74 68 65 6e 74 69 63 61 74  DLE hAuthenticat
216e0 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  ionKey) {..CACKE
216f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21700 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21710 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21720 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21730 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21740 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21750 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21760 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21770 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21780 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
21790 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
217a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
217b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
217c0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
217d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
217e0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
217f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21800 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
21810 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
21820 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69  ON(CK_RV, C_Logi
21830 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
21840 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
21850 4b 5f 55 53 45 52 5f 54 59 50 45 20 75 73 65 72  K_USER_TYPE user
21860 54 79 70 65 2c 20 43 4b 5f 55 54 46 38 43 48 41  Type, CK_UTF8CHA
21870 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
21880 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b  LONG ulPinLen) {
21890 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
218a0 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
218b0 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69  retval;..int tri
218c0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69  es_remaining;..i
218d0 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09  nt login_ret;...
218e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
218f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21900 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21910 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21920 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21930 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21940 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21950 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21960 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21970 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
21980 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
21990 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
219a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
219b0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
219c0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
219d0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
219e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
219f0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
21a00 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
21a10 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
21a20 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
21a30 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
21a40 66 20 28 75 73 65 72 54 79 70 65 20 21 3d 20 43  f (userType != C
21a50 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09 43 41 43  KU_USER) {...CAC
21a60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21a70 28 22 45 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c  ("Error.  We onl
21a80 79 20 73 75 70 70 6f 72 74 20 55 53 45 52 20 6d  y support USER m
21a90 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f 72 20 25  ode, asked for %
21aa0 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69  lu mode.", (unsi
21ab0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73 65 72 54  gned long) userT
21ac0 79 70 65 29 0a 0a 09 09 72 65 74 75 72 6e 28 43  ype)....return(C
21ad0 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f 49 4e 56  KR_USER_TYPE_INV
21ae0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
21af0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21b00 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
21b10 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
21b20 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
21b30 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
21b40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21b50 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
21b60 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
21b70 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21b80 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21b90 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
21ba0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
21bb0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
21bc0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
21bd0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
21be0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21bf0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
21c00 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
21c10 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
21c20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
21c30 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
21c40 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
21c50 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21c60 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
21c70 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
21c80 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
21c90 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
21ca0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
21cb0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
21cc0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21cd0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
21ce0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
21cf0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
21d00 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
21d10 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
21d20 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
21d30 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
21d40 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
21d50 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
21d60 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
21d70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21d80 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
21d90 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
21da0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
21db0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
21dc0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
21dd0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
21de0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21df0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
21e00 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
21e10 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20  }...login_ret = 
21e20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61  cackey_login(&ca
21e30 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
21e40 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c  D], pPin, ulPinL
21e50 65 6e 2c 20 26 74 72 69 65 73 5f 72 65 6d 61 69  en, &tries_remai
21e60 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69  ning);..if (logi
21e70 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  n_ret != CACKEY_
21e80 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63  PCSC_S_OK) {...c
21e90 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21ea0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21eb0 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e  k);....if (login
21ec0 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
21ed0 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a  CSC_E_LOCKED) {.
21ee0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21ef0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21f00 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e  Token is locked.
21f10 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ");.....cackey_s
21f20 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
21f30 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f  en_flags |= CKF_
21f40 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b  USER_PIN_LOCKED;
21f50 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
21f60 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d  PIN_LOCKED);...}
21f70 20 65 6c 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f   else if (login_
21f80 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
21f90 53 43 5f 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09  SC_E_BADPIN) {..
21fa0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21fb0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 49  RINTF("Error.  I
21fc0 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a  nvalid PIN.");..
21fd0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
21fe0 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
21ff0 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
22000 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a  PIN_COUNT_LOW;..
22010 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  ...if (tries_rem
22020 61 69 6e 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09  aining == 1) {..
22030 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
22040 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
22050 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
22060 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09  PIN_FINAL_TRY;..
22070 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ..}.....return(C
22080 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54  KR_PIN_INCORRECT
22090 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
220a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
220b0 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65  rror.  Unknown e
220c0 72 72 6f 72 20 72 65 74 75 72 6e 65 64 20 66 72  rror returned fr
220d0 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28  om cackey_login(
220e0 29 20 28 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72  ) (%i)", login_r
220f0 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  et);....return(C
22100 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22110 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
22120 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
22130 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b  en_flags &= ~(CK
22140 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45  F_USER_PIN_LOCKE
22150 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e  D | CKF_USER_PIN
22160 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46  _COUNT_LOW | CKF
22170 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 20  _LOGIN_REQUIRED 
22180 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46  | CKF_USER_PIN_F
22190 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63  INAL_TRY);...cac
221a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
221b0 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43  ssion].state = C
221c0 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54  KS_RO_USER_FUNCT
221d0 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  IONS;...mutex_re
221e0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
221f0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
22200 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
22210 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
22220 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
22230 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22240 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
22250 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
22260 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22270 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
22280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22290 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
222a0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
222b0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
222c0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
222d0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
222e0 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53  , C_Logout)(CK_S
222f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
22300 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c  ession) {..CK_SL
22310 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69  OT_ID slotID;..i
22320 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
22330 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22340 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
22350 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
22360 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
22370 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22380 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
22390 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
223a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
223b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
223c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
223d0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
223e0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
223f0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
22400 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
22410 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
22420 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
22430 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22440 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
22450 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
22460 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
22470 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
22480 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
22490 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
224a0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
224b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
224c0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
224d0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
224e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
224f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
22500 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
22510 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22520 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22530 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
22540 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22550 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
22560 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
22570 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22580 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
22590 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
225a0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
225b0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
225c0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
225d0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
225e0 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
225f0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
22600 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
22610 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
22620 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
22630 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
22640 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
22650 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
22660 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
22670 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22680 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
22690 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
226a0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
226b0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
226c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
226d0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
226e0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
226f0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
22700 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
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 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
22730 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
22740 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
22750 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
22760 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
22770 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
22780 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
22790 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
227a0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
227b0 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  OR);..}...cackey
227c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
227d0 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
227e0 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f  RO_PUBLIC_SESSIO
227f0 4e 3b 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  N;..cackey_slots
22800 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66  [slotID].token_f
22810 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e  lags = CKF_LOGIN
22820 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 6d 75 74  _REQUIRED;...mut
22830 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
22840 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
22850 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22860 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
22870 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
22880 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22890 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
228a0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
228b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
228c0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
228d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
228e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
228f0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
22900 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
22910 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
22920 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
22930 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61 74 65 4f  CK_RV, C_CreateO
22940 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
22950 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
22960 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
22970 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
22980 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
22990 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
229a0 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 29 20  E_PTR phObject) 
229b0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
229c0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
229d0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
229e0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
229f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22a00 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
22a10 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
22a20 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22a30 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
22a40 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
22a50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22a60 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22a70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22a80 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
22a90 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
22aa0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
22ab0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
22ac0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22ad0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
22ae0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22af0 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28  , C_CopyObject)(
22b00 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22b10 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
22b20 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
22b30 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
22b40 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
22b50 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
22b60 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
22b70 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65 77 4f 62  NDLE_PTR phNewOb
22b80 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
22b90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
22ba0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
22bb0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
22bc0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
22bd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
22be0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
22bf0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
22c00 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
22c10 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
22c20 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
22c30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22c40 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
22c50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22c60 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
22c70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
22c80 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
22c90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22ca0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
22cb0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
22cc0 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f  (CK_RV, C_Destro
22cd0 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53  yObject)(CK_SESS
22ce0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
22cf0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
22d00 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b  ANDLE hObject) {
22d10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22d20 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
22d30 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
22d40 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22d50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22d60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22d70 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22d80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22d90 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22da0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22db0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22dc0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22dd0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22de0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
22df0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22e00 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
22e10 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
22e20 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
22e30 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
22e40 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22e50 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65   C_GetObjectSize
22e60 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22e70 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
22e80 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
22e90 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Object, CK_ULONG
22ea0 5f 50 54 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a  _PTR pulSize) {.
22eb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22ec0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
22ed0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
22ee0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
22ef0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22f00 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
22f10 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
22f20 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
22f30 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
22f40 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
22f50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22f60 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22f70 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22f80 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
22f90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
22fa0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
22fb0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
22fc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
22fd0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
22fe0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
22ff0 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61  C_GetAttributeVa
23000 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
23010 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
23020 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
23030 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
23040 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
23050 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
23060 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41  ulCount) {..CK_A
23070 54 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61  TTRIBUTE *curr_a
23080 74 74 72 3b 0a 09 73 74 72 75 63 74 20 63 61 63  ttr;..struct cac
23090 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
230a0 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65  entity;..unsigne
230b0 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f  d long identity_
230c0 69 64 78 2c 20 61 74 74 72 5f 69 64 78 2c 20 73  idx, attr_idx, s
230d0 65 73 73 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75  ess_attr_idx, nu
230e0 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65  m_ids;..int mute
230f0 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56  x_retval;..CK_RV
23100 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b   retval = CKR_OK
23110 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
23120 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  Value;..CK_ULONG
23130 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43   ulValueLen;...C
23140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23150 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23160 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23170 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23180 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23190 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
231a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
231b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
231c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
231d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
231e0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
231f0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
23200 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
23210 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
23220 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
23230 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
23240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23250 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
23260 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
23270 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23280 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
23290 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
232a0 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20   (hObject == 0) 
232b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
232c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
232d0 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f   Object handle o
232e0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
232f0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23300 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e  OBJECT_HANDLE_IN
23310 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
23320 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b  (ulCount == 0) {
23330 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63  .../* Short circ
23340 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a  uit, if zero obj
23350 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69 66  ects were specif
23360 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20  ied return zero 
23370 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c  items immediatel
23380 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  y */...CACKEY_DE
23390 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
233a0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
233b0 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
233c0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
233d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
233e0 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61  .}...if (pTempla
233f0 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  te == NULL) {...
23400 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23410 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 54 65  NTF("Error.  pTe
23420 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22  mplate is NULL."
23430 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23440 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
23450 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69  ..}...identity_i
23460 64 78 20 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31  dx = hObject - 1
23470 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
23480 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
23490 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
234a0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
234b0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
234c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
234d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
234e0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
234f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23500 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
23510 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
23520 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
23530 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
23540 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23550 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23560 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
23570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23580 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
23590 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
235a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
235b0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
235c0 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64  ID);..}...num_id
235d0 73 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  s = cackey_sessi
235e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
235f0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a  entities_count;.
23600 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 5f 69  ..if (identity_i
23610 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b  dx >= num_ids) {
23620 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
23630 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23640 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
23650 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23660 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68  Error.  Object h
23670 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
23680 67 65 2e 20 20 69 64 65 6e 74 69 74 79 5f 69 64  ge.  identity_id
23690 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73  x = %lu, num_ids
236a0 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67   = %lu.", (unsig
236b0 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
236c0 74 79 5f 69 64 78 2c 20 28 75 6e 73 69 67 6e 65  ty_idx, (unsigne
236d0 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29  d long) num_ids)
236e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
236f0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e  OBJECT_HANDLE_IN
23700 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65  VALID);..}...ide
23710 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
23720 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23730 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 69 64  n].identities[id
23740 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66  entity_idx];...f
23750 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
23760 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 75 6c 43  ; attr_idx < ulC
23770 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b  ount; attr_idx++
23780 29 20 7b 0a 09 09 63 75 72 72 5f 61 74 74 72 20  ) {...curr_attr 
23790 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b 61 74 74  = &pTemplate[att
237a0 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75  r_idx];....pValu
237b0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61  e = NULL;...ulVa
237c0 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e  lueLen = (CK_LON
237d0 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59  G) -1;....CACKEY
237e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4c  _DEBUG_PRINTF("L
237f0 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69  ooking for attri
23800 62 75 74 65 20 30 78 25 30 38 6c 78 20 28 69 64  bute 0x%08lx (id
23810 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22  entity:%lu) ..."
23820 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
23830 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  ) curr_attr->typ
23840 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
23850 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78 29  g) identity_idx)
23860 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73 73 5f 61  ;....for (sess_a
23870 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73  ttr_idx = 0; ses
23880 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65  s_attr_idx < ide
23890 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
238a0 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74  s_count; sess_at
238b0 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69  tr_idx++) {....i
238c0 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 61 74 74  f (identity->att
238d0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
238e0 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63  r_idx].type == c
238f0 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 20  urr_attr->type) 
23900 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
23910 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
23920 66 6f 75 6e 64 20 69 74 2c 20 70 56 61 6c 75 65  found it, pValue
23930 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65   = %p, ulValueLe
23940 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65 6e 74 69  n = %lu", identi
23950 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
23960 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56  ess_attr_idx].pV
23970 61 6c 75 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e  alue, identity->
23980 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
23990 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75  attr_idx].ulValu
239a0 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09  eLen);..........
239b0 70 56 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74  pValue = identit
239c0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
239d0 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61  ss_attr_idx].pVa
239e0 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lue;.....ulValue
239f0 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  Len = identity->
23a00 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
23a10 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75  attr_idx].ulValu
23a20 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  eLen;....}...}..
23a30 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
23a40 3e 70 56 61 6c 75 65 20 26 26 20 70 56 61 6c 75  >pValue && pValu
23a50 65 29 20 7b 0a 09 09 09 69 66 20 28 63 75 72 72  e) {....if (curr
23a60 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
23a70 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29  n >= ulValueLen)
23a80 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75   {.....memcpy(cu
23a90 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
23aa0 20 70 56 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65   pValue, ulValue
23ab0 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20  Len);....} else 
23ac0 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  {.....ulValueLen
23ad0 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
23ae0 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
23af0 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
23b00 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  ALL;....}...}...
23b10 09 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61  .curr_attr->ulVa
23b20 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65  lueLen = ulValue
23b30 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  Len;..}...mutex_
23b40 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
23b50 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23b60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
23b70 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
23b80 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
23b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23ba0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
23bb0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
23bc0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
23bd0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
23be0 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
23bf0 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f  _ATTRIBUTE_TYPE_
23c00 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09 43 41 43  INVALID) {...CAC
23c10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23c20 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23c30 41 54 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49  ATTRIBUTE_TYPE_I
23c40 4e 56 41 4c 49 44 20 28 25 69 29 22 2c 20 28 69  NVALID (%i)", (i
23c50 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20  nt) retval);..} 
23c60 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c 20  else if (retval 
23c70 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  == CKR_BUFFER_TO
23c80 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43  O_SMALL) {...CAC
23c90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23ca0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23cb0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
23cc0 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
23cd0 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
23ce0 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
23cf0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
23d00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23d10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
23d20 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76  %i)", (int) retv
23d30 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  al);..} else {..
23d40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23d50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23d60 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  %i", (int) retva
23d70 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  l);..}...return(
23d80 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
23d90 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
23da0 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74 74 72 69  K_RV, C_SetAttri
23db0 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45  buteValue)(CK_SE
23dc0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
23dd0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
23de0 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
23df0 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
23e00 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
23e10 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b  ULONG ulCount) {
23e20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23e30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
23e40 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
23e50 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
23e60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23e70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23e80 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
23e90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23ea0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
23eb0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
23ec0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23ed0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23ee0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23ef0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
23f00 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
23f10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
23f20 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
23f30 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23f40 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
23f50 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23f60 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
23f70 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
23f80 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
23f90 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
23fa0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
23fb0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a  LONG ulCount) {.
23fc0 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
23fd0 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64  ID;..CK_ULONG id
23fe0 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  x;..int mutex_re
23ff0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
24000 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
24010 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
24020 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
24030 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
24040 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24050 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
24060 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
24070 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
24080 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
24090 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
240a0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
240b0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
240c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
240d0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
240e0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
240f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24100 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24110 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
24120 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
24130 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
24140 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
24150 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
24160 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
24170 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
24180 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
24190 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
241a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
241b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
241c0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
241d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
241e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
241f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
24200 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24210 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
24220 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
24230 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24240 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
24250 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24260 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
24270 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
24280 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
24290 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
242a0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
242b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
242c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
242d0 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
242e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
242f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24300 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
24310 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24320 2e 20 20 53 65 61 72 63 68 20 61 6c 72 65 61 64  .  Search alread
24330 79 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  y active.");....
24340 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
24350 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
24360 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
24370 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24380 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
24390 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
243a0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
243b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
243c0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
243d0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
243e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
243f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24400 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
24410 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
24420 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
24430 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
24440 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24450 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24460 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
24470 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
24480 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
24490 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
244a0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
244b0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
244c0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
244d0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
244e0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
244f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
24500 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
24510 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
24520 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
24530 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
24540 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
24550 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
24560 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24570 4e 54 46 28 22 54 68 65 20 73 6c 6f 74 20 68 61  NTF("The slot ha
24580 73 20 62 65 65 6e 20 72 65 73 65 74 20 73 69 6e  s been reset sin
24590 63 65 20 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65  ce we last looke
245a0 64 20 66 6f 72 20 69 64 65 6e 74 69 74 69 65 73  d for identities
245b0 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e 67 22 29   -- rescanning")
245c0 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  ;....if (cackey_
245d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
245e0 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 21 3d  n].identities !=
245f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b   NULL) {....cack
24600 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69  ey_free_identiti
24610 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  es(cackey_sessio
24620 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
24630 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f  ntities, cackey_
24640 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24650 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
24660 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  unt);.....cackey
24670 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24680 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  on].identities =
24690 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
246a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
246b0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
246c0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09  ount = 0;...}...
246d0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
246e0 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
246f0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72  != NULL) {....fr
24700 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
24710 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a  slotID].label);.
24720 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
24730 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20  slotID].label = 
24740 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  NULL;...}....cac
24750 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
24760 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  set(&cackey_slot
24770 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61  s[slotID]);...ca
24780 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
24790 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  D].slot_reset = 
247a0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  0;..}...if (cack
247b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
247c0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
247d0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61   == NULL) {...ca
247e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
247f0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
24800 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
24810 5f 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63  _identities(&cac
24820 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
24830 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  ], &cackey_sessi
24840 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
24850 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
24860 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c  ..}...if (pTempl
24870 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate != NULL) {..
24880 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20  .if (ulCount != 
24890 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73  0) {....cackey_s
248a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
248b0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
248c0 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a  ount = ulCount;.
248d0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
248e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
248f0 72 63 68 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c  rch_query = mall
24900 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a  oc(ulCount * siz
24910 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29  eof(*pTemplate))
24920 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ;.....memcpy(cac
24930 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24940 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
24950 65 72 79 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20  ery, pTemplate, 
24960 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
24970 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09  (*pTemplate));..
24980 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
24990 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69  idx < ulCount; i
249a0 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28  dx++) {.....if (
249b0 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
249c0 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20  lValueLen == 0) 
249d0 7b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 65  {......cackey_se
249e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
249f0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
24a00 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  x].pValue = NULL
24a10 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65  ;.......continue
24a20 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63 61 63  ;.....}......cac
24a30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24a40 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
24a50 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20  ery[idx].pValue 
24a60 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61  = malloc(pTempla
24a70 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c  te[idx].ulValueL
24a80 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 63 61  en);......if (ca
24a90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24aa0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
24ab0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
24ac0 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
24ad0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24ae0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
24af0 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
24b00 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64  ue, pTemplate[id
24b10 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
24b20 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
24b30 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09  eLen);.....}....
24b40 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
24b50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24b60 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
24b70 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30  _query_count = 0
24b80 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
24b90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24ba0 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55  earch_query = NU
24bb0 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  LL;...}..} else 
24bc0 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
24bd0 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
24be0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
24bf0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24c00 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
24c10 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24c20 20 53 65 61 72 63 68 20 71 75 65 72 79 20 73 70   Search query sp
24c30 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
24c40 20 62 75 74 20 6e 75 6d 62 65 72 20 6f 66 20 71   but number of q
24c50 75 65 72 79 20 74 65 72 6d 73 20 6e 6f 74 20 73  uery terms not s
24c60 70 65 63 69 66 69 65 64 20 61 73 20 30 2e 22 29  pecified as 0.")
24c70 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
24c80 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
24c90 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
24ca0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24cb0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
24cc0 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b  ount = 0;...cack
24cd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24ce0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
24cf0 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09  ry = NULL;..}...
24d00 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24d10 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
24d20 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 63 61  _active = 1;..ca
24d30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24d40 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
24d50 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75  urr_id = 0;...mu
24d60 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24d70 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24d80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24d90 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
24da0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
24db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24dc0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
24dd0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
24de0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
24df0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
24e00 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24e10 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
24e20 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
24e30 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
24e40 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74  n(CKR_OK);.}..st
24e50 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
24e60 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61  pkcs11_compare_a
24e70 74 74 72 69 62 75 74 65 73 28 43 4b 5f 41 54 54  ttributes(CK_ATT
24e80 52 49 42 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54  RIBUTE *a, CK_AT
24e90 54 52 49 42 55 54 45 20 2a 62 29 20 7b 0a 09 75  TRIBUTE *b) {..u
24ea0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 6d  nsigned char *sm
24eb0 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67 65 62 75  allbuf, *largebu
24ec0 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c  f;..size_t small
24ed0 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75  buf_len, largebu
24ee0 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e  f_len;...if (a->
24ef0 74 79 70 65 20 21 3d 20 62 2d 3e 74 79 70 65 29  type != b->type)
24f00 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a   {...return(0);.
24f10 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
24f20 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 2e 2e  G_PRINTF("    ..
24f30 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67  . found matching
24f40 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43   type ...");...C
24f50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24f60 54 42 55 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75  TBUF("    ... ou
24f70 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56  r value:", a->pV
24f80 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65  alue, a->ulValue
24f90 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70  Len);...if (b->p
24fa0 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
24fb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24fc0 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
24fd0 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64 63 61 72  .. found wildcar
24fe0 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65  d match");....re
24ff0 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66  turn(1);..}...if
25000 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e   (a->pValue == N
25010 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ULL) {...return(
25020 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d  0);..}.. .if (b-
25030 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61  >ulValueLen == a
25040 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20  ->ulValueLen && 
25050 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65  memcmp(a->pValue
25060 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e  , b->pValue, b->
25070 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30  ulValueLen) == 0
25080 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
25090 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
250a0 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63    ... found exac
250b0 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 72 65  t match");....re
250c0 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77  turn(1);..}...sw
250d0 69 74 63 68 20 28 61 2d 3e 74 79 70 65 29 20 7b  itch (a->type) {
250e0 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
250f0 4c 55 53 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75  LUS:....if (a->u
25100 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e  lValueLen == b->
25110 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
25120 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
25130 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65  ..if (a->ulValue
25140 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65  Len > b->ulValue
25150 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c  Len) {.....small
25160 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b  buf = b->pValue;
25170 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65  .....smallbuf_le
25180 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = b->ulValueLe
25190 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66  n;......largebuf
251a0 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = a->pValue;...
251b0 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d  ..largebuf_len =
251c0 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   a->ulValueLen;.
251d0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
251e0 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56  smallbuf = a->pV
251f0 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62  alue;.....smallb
25200 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61  uf_len = a->ulVa
25210 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72  lueLen;......lar
25220 67 65 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75  gebuf = b->pValu
25230 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f  e;.....largebuf_
25240 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65  len = b->ulValue
25250 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f  Len;....}.....fo
25260 72 20 28 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65  r (; largebuf_le
25270 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  n != smallbuf_le
25280 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61  n; largebuf++,la
25290 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a  rgebuf_len--) {.
252a0 09 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 66  ....if (largebuf
252b0 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  [0] != 0) {.....
252c0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
252d0 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 72 67 65  .}.....if (large
252e0 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c  buf_len != small
252f0 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62  buf_len) {.....b
25300 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  reak;....}.....i
25310 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62  f (memcmp(largeb
25320 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d  uf, smallbuf, sm
25330 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30  allbuf_len) == 0
25340 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
25350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
25360 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70      ... found ap
25370 70 72 6f 78 69 6d 61 74 65 20 6d 61 74 63 68 22  proximate match"
25380 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 31  );......return(1
25390 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  );....}.....brea
253a0 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30  k;..}...return(0
253b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
253c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
253d0 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 29 28 43  C_FindObjects)(C
253e0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
253f0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
25400 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
25410 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f  phObject, CK_ULO
25420 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  NG ulMaxObjectCo
25430 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  unt, CK_ULONG_PT
25440 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  R pulObjectCount
25450 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
25460 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72  ey_identity *cur
25470 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42  r_id;..CK_ATTRIB
25480 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
25490 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69  .CK_ULONG curr_i
254a0 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f  d_idx, curr_out_
254b0 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 61 74 74  id_idx, curr_att
254c0 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72  r_idx, sess_attr
254d0 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _idx;..CK_ULONG 
254e0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70  matched_count, p
254f0 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
25500 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
25510 74 76 61 6c 3b 0a 23 69 66 64 65 66 20 43 41 43  tval;.#ifdef CAC
25520 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43 48  KEY_DEBUG_SEARCH
25530 5f 53 50 45 45 44 54 45 53 54 0a 09 73 74 72 75  _SPEEDTEST..stru
25540 63 74 20 74 69 6d 65 76 61 6c 20 73 74 61 72 74  ct timeval start
25550 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36 34 5f 74  , end;..uint64_t
25560 20 73 74 61 72 74 5f 69 6e 74 2c 20 65 6e 64 5f   start_int, end_
25570 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  int;.#endif...CA
25580 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25590 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
255a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
255b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
255c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
255d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
255e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
255f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
25600 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
25610 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
25620 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
25630 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
25640 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25650 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f 62 6a 65  "Error.  pulObje
25660 63 74 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ctCount is NULL.
25670 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25680 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
25690 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a  ;..}...if (phObj
256a0 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  ect == NULL && u
256b0 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20  lMaxObjectCount 
256c0 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
256d0 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a  rt circuit, if z
256e0 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65  ero objects were
256f0 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72   specified retur
25700 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d  n zero items imm
25710 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 2a 70  ediately */...*p
25720 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20  ulObjectCount = 
25730 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  0;....CACKEY_DEB
25740 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
25750 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
25760 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74 29   (short circuit)
25770 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72  ", CKR_OK);....r
25780 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09  eturn(CKR_OK);..
25790 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74  }...if (phObject
257a0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
257b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
257c0 46 28 22 45 72 72 6f 72 2e 20 20 70 68 4f 62 6a  F("Error.  phObj
257d0 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ect is NULL.");.
257e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
257f0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
25800 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f 62 6a 65  ...if (ulMaxObje
25810 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a  ctCount == 0) {.
25820 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25830 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d  RINTF("Error.  M
25840 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
25850 20 6f 62 6a 65 63 74 73 20 73 70 65 63 69 66 69   objects specifi
25860 65 64 20 61 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a  ed as zero.");..
25870 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
25880 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
25890 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
258a0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
258b0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
258c0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
258d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
258e0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
258f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25900 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
25910 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
25920 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
25930 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
25940 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
25950 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
25960 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
25970 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
25980 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
25990 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
259a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
259b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
259c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
259d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
259e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
259f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
25a00 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25a10 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
25a20 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
25a30 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
25a40 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
25a50 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25a60 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
25a70 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
25a80 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
25a90 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
25aa0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
25ab0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25ac0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
25ad0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
25ae0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
25af0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
25b00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25b10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
25b20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76  Search not activ
25b30 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
25b40 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
25b50 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
25b60 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  ;..}..#ifdef CAC
25b70 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43 48  KEY_DEBUG_SEARCH
25b80 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74 74  _SPEEDTEST..gett
25b90 69 6d 65 6f 66 64 61 79 28 26 73 74 61 72 74 2c  imeofday(&start,
25ba0 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 0a   NULL);.#endif..
25bb0 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
25bc0 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72   = 0;..for (curr
25bd0 5f 69 64 5f 69 64 78 20 3d 20 63 61 63 6b 65 79  _id_idx = cackey
25be0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25bf0 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f  on].search_curr_
25c00 69 64 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 20  id; curr_id_idx 
25c10 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  < cackey_session
25c20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
25c30 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 26 26 20  tities_count && 
25c40 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
25c50 3b 20 63 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29  ; curr_id_idx++)
25c60 20 7b 0a 09 09 63 75 72 72 5f 69 64 20 3d 20 26   {...curr_id = &
25c70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25c80 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
25c90 74 69 65 73 5b 63 75 72 72 5f 69 64 5f 69 64 78  ties[curr_id_idx
25ca0 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ];....CACKEY_DEB
25cb0 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 63 65  UG_PRINTF("Proce
25cc0 73 73 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  ssing identity:%
25cd0 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
25ce0 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f 69 64 78  ong) curr_id_idx
25cf0 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f  );....matched_co
25d00 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20  unt = 0;....for 
25d10 28 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3d  (curr_attr_idx =
25d20 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64   0; curr_attr_id
25d30 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x < cackey_sessi
25d40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
25d50 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
25d60 3b 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2b  ; curr_attr_idx+
25d70 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74  +) {....prev_mat
25d80 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74  ched_count = mat
25d90 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09  ched_count;.....
25da0 63 75 72 72 5f 61 74 74 72 20 3d 20 26 63 61 63  curr_attr = &cac
25db0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25dc0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
25dd0 65 72 79 5b 63 75 72 72 5f 61 74 74 72 5f 69 64  ery[curr_attr_id
25de0 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  x];.....CACKEY_D
25df0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 43  EBUG_PRINTF("  C
25e00 68 65 63 6b 69 6e 67 20 66 6f 72 20 61 74 74 72  hecking for attr
25e10 69 62 75 74 65 20 25 73 20 28 30 78 25 30 38 6c  ibute %s (0x%08l
25e20 78 29 20 69 6e 20 69 64 65 6e 74 69 74 79 3a 25  x) in identity:%
25e30 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45  i...", CACKEY_DE
25e40 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
25e50 54 45 5f 54 4f 5f 53 54 52 28 63 75 72 72 5f 61  TE_TO_STR(curr_a
25e60 74 74 72 2d 3e 74 79 70 65 29 2c 20 28 75 6e 73  ttr->type), (uns
25e70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
25e80 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e  _attr->type, (in
25e90 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
25ea0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25eb0 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 56  _PRINTBUF("    V
25ec0 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  alue looking for
25ed0 3a 22 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 70  :", curr_attr->p
25ee0 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74 72  Value, curr_attr
25ef0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ->ulValueLen);..
25f00 09 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74  ...for (sess_att
25f10 72 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f  r_idx = 0; sess_
25f20 61 74 74 72 5f 69 64 78 20 3c 20 63 75 72 72 5f  attr_idx < curr_
25f30 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63  id->attributes_c
25f40 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f  ount; sess_attr_
25f50 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20  idx++) {.....if 
25f60 28 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63  (cackey_pkcs11_c
25f70 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65  ompare_attribute
25f80 73 28 26 63 75 72 72 5f 69 64 2d 3e 61 74 74 72  s(&curr_id->attr
25f90 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72  ibutes[sess_attr
25fa0 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61 74 74 72  _idx], curr_attr
25fb0 29 29 20 7b 0a 09 09 09 09 09 6d 61 74 63 68 65  )) {......matche
25fc0 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09  d_count++;......
25fd0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09  .break;.....}...
25fe0 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20 74 68 65  .}...../* If the
25ff0 20 61 74 74 72 69 62 75 74 65 20 63 6f 75 6c 64   attribute could
26000 20 6e 6f 74 20 62 65 20 6d 61 74 63 68 65 64 2c   not be matched,
26010 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d   do not try to m
26020 61 74 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20  atch additional 
26030 61 74 74 72 69 62 75 74 65 73 20 2a 2f 0a 09 09  attributes */...
26040 09 69 66 20 28 70 72 65 76 5f 6d 61 74 63 68 65  .if (prev_matche
26050 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68  d_count == match
26060 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09  ed_count) {.....
26070 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  break;....}...}.
26080 0a 09 09 69 66 20 28 6d 61 74 63 68 65 64 5f 63  ...if (matched_c
26090 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73  ount == cackey_s
260a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
260b0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
260c0 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  ount) {....CACKE
260d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
260e0 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74    ... All %i att
260f0 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
26100 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e  for found, addin
26110 67 20 69 64 65 6e 74 69 74 79 3a 25 69 20 74 6f  g identity:%i to
26120 20 72 65 74 75 72 6e 65 64 20 6c 69 73 74 22 2c   returned list",
26130 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65   (int) cackey_se
26140 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26150 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
26160 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f  unt, (int) curr_
26170 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f  id_idx);.....phO
26180 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69  bject[curr_out_i
26190 64 5f 69 64 78 5d 20 3d 20 63 75 72 72 5f 69 64  d_idx] = curr_id
261a0 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c  _idx + 1;.....ul
261b0 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d  MaxObjectCount--
261c0 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75 74 5f 69  ;.....curr_out_i
261d0 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73  d_idx++;...} els
261e0 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
261f0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
26200 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e  . Not all %i (on
26210 6c 79 20 66 6f 75 6e 64 20 25 69 29 20 61 74 74  ly found %i) att
26220 72 69 62 75 74 65 73 20 63 68 65 63 6b 65 64 20  ributes checked 
26230 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61  for found, not a
26240 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
26250 69 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  i", (int) cackey
26260 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26270 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
26280 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61  _count, (int) ma
26290 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e  tched_count, (in
262a0 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b  t) curr_id_idx);
262b0 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f  ...}..}..cackey_
262c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
262d0 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
262e0 64 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 3b  d = curr_id_idx;
262f0 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
26300 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f  t = curr_out_id_
26310 69 64 78 3b 0a 0a 23 69 66 64 65 66 20 43 41 43  idx;..#ifdef CAC
26320 4b 45 59 5f 44 45 42 55 47 5f 53 45 41 52 43 48  KEY_DEBUG_SEARCH
26330 5f 53 50 45 45 44 54 45 53 54 0a 09 67 65 74 74  _SPEEDTEST..gett
26340 69 6d 65 6f 66 64 61 79 28 26 65 6e 64 2c 20 4e  imeofday(&end, N
26350 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f 69 6e 74  ULL);..start_int
26360 20 3d 20 28 73 74 61 72 74 2e 74 76 5f 73 65 63   = (start.tv_sec
26370 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20 73 74   * 1000000) + st
26380 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a 09 65 6e  art.tv_usec;..en
26390 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e 74 76 5f  d_int = (end.tv_
263a0 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b  sec * 1000000) +
263b0 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b 0a 09 66   end.tv_usec;..f
263c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
263d0 53 65 61 72 63 68 20 74 6f 6f 6b 20 25 6c 75 20  Search took %lu 
263e0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c 6e 22 2c  microseconds\n",
263f0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
26400 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73 74 61 72   (end_int - star
26410 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64 69 66 0a  t_int));.#endif.
26420 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
26430 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
26440 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26450 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
26460 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
26470 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26480 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
26490 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
264a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
264b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
264c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
264d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
264e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
264f0 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d  ), num objects =
26500 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a   %lu", CKR_OK, *
26510 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b  pulObjectCount);
26520 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
26530 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26540 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26550 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
26560 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  al)(CK_SESSION_H
26570 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
26580 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b  {..CK_ULONG idx;
26590 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
265a0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
265b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
265c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
265d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
265e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
265f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26600 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
26610 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26620 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
26630 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
26640 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
26650 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
26660 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
26670 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
26680 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
26690 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
266a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
266b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
266c0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
266d0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
266e0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
266f0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
26700 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
26710 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
26720 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
26730 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
26740 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
26750 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26760 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26770 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
26780 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26790 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
267a0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
267b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
267c0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
267d0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
267e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
267f0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
26800 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26810 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
26820 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
26830 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
26840 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
26850 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
26860 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26870 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26880 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
26890 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
268a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
268b0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
268c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
268d0 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63 74    Search not act
268e0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
268f0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
26900 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
26910 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
26920 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26930 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
26940 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28 69 64 78   = 0;...for (idx
26950 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 61 63 6b   = 0; idx < cack
26960 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26970 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
26980 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29  ry_count; idx++)
26990 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
269a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
269b0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
269c0 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09  idx].pValue) {..
269d0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65  ..free(cackey_se
269e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
269f0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
26a00 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09 09 7d 0a  x].pValue);...}.
26a10 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
26a20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26a30 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29  n].search_query)
26a40 20 7b 0a 09 09 66 72 65 65 28 63 61 63 6b 65 79   {...free(cackey
26a50 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26a60 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
26a70 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
26a80 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
26a90 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
26aa0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
26ab0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
26ac0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
26ad0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26ae0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
26af0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
26b00 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
26b10 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
26b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26b30 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26b40 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
26b50 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
26b60 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
26b70 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
26b80 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 29  , C_EncryptInit)
26b90 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
26ba0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
26bb0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
26bc0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a  echanism, CK_OBJ
26bd0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
26be0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
26bf0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
26c00 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
26c10 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
26c20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26c30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26c40 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
26c50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26c60 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
26c70 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
26c80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26c90 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
26ca0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26cb0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
26cc0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
26cd0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
26ce0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
26cf0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
26d00 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
26d10 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
26d20 56 2c 20 43 5f 45 6e 63 72 79 70 74 29 28 43 4b  V, C_Encrypt)(CK
26d30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
26d40 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
26d50 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
26d60 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
26d70 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
26d80 63 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f  cryptedData, CK_
26d90 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
26da0 72 79 70 74 65 64 44 61 74 61 4c 65 6e 29 20 7b  ryptedDataLen) {
26db0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26dc0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
26dd0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
26de0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
26df0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26e00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
26e10 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
26e20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26e30 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
26e40 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
26e50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26e60 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26e70 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
26e80 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
26e90 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
26ea0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
26eb0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
26ec0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
26ed0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
26ee0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
26ef0 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65   C_EncryptUpdate
26f00 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
26f10 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
26f20 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
26f30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
26f40 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
26f50 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
26f60 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
26f70 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
26f80 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
26f90 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
26fa0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
26fb0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
26fc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26fd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26fe0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
26ff0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27000 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
27010 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
27020 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
27030 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
27040 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
27050 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
27060 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
27070 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
27080 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
27090 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
270a0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
270b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
270c0 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 46 69  _RV, C_EncryptFi
270d0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
270e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
270f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61   CK_BYTE_PTR pLa
27100 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c  stEncryptedPart,
27110 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
27120 6c 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61  lLastEncryptedPa
27130 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
27140 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27150 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
27160 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
27170 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
27180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27190 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
271a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
271b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
271c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
271d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
271e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
271f0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
27200 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27210 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
27220 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27230 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
27240 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27250 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
27260 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27270 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
27280 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  ptInit)(CK_SESSI
27290 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
272a0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
272b0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
272c0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
272d0 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d  E hKey) {..int m
272e0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68  utex_retval;...h
272f0 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f  Key--;...CACKEY_
27300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
27310 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
27320 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
27330 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
27340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27350 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27360 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27370 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27380 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
27390 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
273a0 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b  anism == NULL) {
273b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
273c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
273d0 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c  Mechanism is NUL
273e0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
273f0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
27400 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
27410 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
27420 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b  sm != CKM_RSA_PK
27430 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CS) {...CACKEY_D
27440 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27450 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  or. pMechanism->
27460 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70  mechanism not sp
27470 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52  ecified as CKM_R
27480 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65  SA_PKCS");....re
27490 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49  turn(CKR_MECHANI
274a0 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44  SM_PARAM_INVALID
274b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
274c0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
274d0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
274e0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
274f0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
27500 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
27510 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27520 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27530 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
27540 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
27550 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
27560 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
27570 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
27580 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
27590 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
275a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
275b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
275c0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
275d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
275e0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
275f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27600 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
27610 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
27620 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27630 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
27640 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
27650 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
27660 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
27670 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27680 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27690 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
276a0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
276b0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
276c0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
276d0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
276e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
276f0 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
27700 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27710 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27720 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
27730 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27740 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 61 6c  ror.  Decrypt al
27750 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73  ready in progres
27760 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  s.");......retur
27770 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
27780 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66  ACTIVE);..}...if
27790 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79   (hKey >= cackey
277a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
277b0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
277c0 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  ount) {...cackey
277d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
277e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
277f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27800 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b  RINTF("Error.  K
27810 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ey handle out of
27820 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74 65   range (requeste
27830 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20  d key %lu, only 
27840 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20 61  %lu identities a
27850 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e  vailable).", (un
27860 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
27870 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y, (unsigned lon
27880 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  g) cackey_sessio
27890 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
278a0 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
278b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45  ...return(CKR_KE
278c0 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  Y_HANDLE_INVALID
278d0 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73  );..}...cackey_s
278e0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
278f0 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
27900 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
27910 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
27920 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e  ].decrypt_mechan
27930 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  ism = pMechanism
27940 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61  ->mechanism;..ca
27950 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27960 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
27970 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63  mech_parm = pMec
27980 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74  hanism->pParamet
27990 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  er;..cackey_sess
279a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
279b0 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
279c0 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  len = pMechanism
279d0 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e  ->ulParameterLen
279e0 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ;..cackey_sessio
279f0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
27a00 72 79 70 74 5f 69 64 65 6e 74 69 74 79 20 3d 20  rypt_identity = 
27a10 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
27a20 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
27a30 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d  ities[hKey];...m
27a40 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
27a50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
27a60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
27a70 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
27a80 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
27a90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27aa0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
27ab0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
27ac0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
27ad0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
27ae0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
27af0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
27b00 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
27b10 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
27b20 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
27b30 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27b40 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
27b50 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  pt)(CK_SESSION_H
27b60 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
27b70 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
27b80 72 79 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55  ryptedData, CK_U
27b90 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
27ba0 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
27bb0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
27bc0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61  LONG_PTR pulData
27bd0 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47  Len) {..CK_ULONG
27be0 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 2c   datalen_update,
27bf0 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a   datalen_final;.
27c00 09 43 4b 5f 52 56 20 64 65 63 72 79 70 74 5f 72  .CK_RV decrypt_r
27c10 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  et;..int mutex_r
27c20 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
27c30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
27c40 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
27c50 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
27c60 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
27c70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27c80 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
27c90 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27ca0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27cb0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
27cc0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61  ;..}...if (pulDa
27cd0 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  taLen == NULL) {
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 70  PRINTF("Error. p
27d00 75 6c 44 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c  ulDataLen is NUL
27d10 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
27d20 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
27d30 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e  D);..}...datalen
27d40 5f 75 70 64 61 74 65 20 3d 20 2a 70 75 6c 44 61  _update = *pulDa
27d50 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74  taLen;...decrypt
27d60 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74  _ret = C_Decrypt
27d70 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c  Update(hSession,
27d80 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
27d90 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61   ulEncryptedData
27da0 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74  Len, pData, &dat
27db0 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69  alen_update);..i
27dc0 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21  f (decrypt_ret !
27dd0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41  = CKR_OK) {...CA
27de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27df0 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
27e00 70 74 55 70 64 61 74 65 28 29 20 72 65 74 75 72  ptUpdate() retur
27e10 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
27e20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
27e30 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70  ned long) decryp
27e40 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 64  t_ret);....if (d
27e50 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b  ecrypt_ret != CK
27e60 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
27e70 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54 65 72 6d  LL) {..../* Term
27e80 69 6e 61 74 65 20 64 65 63 72 79 70 74 69 6f 6e  inate decryption
27e90 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09   operation */...
27ea0 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
27eb0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
27ec0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
27ed0 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
27ee0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27ef0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
27f00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27f10 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
27f20 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
27f30 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
27f40 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  R);....}.....if 
27f50 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
27f60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
27f70 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
27f80 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
27f90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
27fa0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
27fb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27fc0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
27fd0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
27fe0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
27ff0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
28000 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
28010 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28020 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
28030 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09  pt_active) {....
28040 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
28050 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28060 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
28070 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28080 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20  Error.  Decrypt 
28090 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
280a0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
280b0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
280c0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09  NITIALIZED);....
280d0 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  }.....cackey_ses
280e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
280f0 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
28100 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65   0;.....mutex_re
28110 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
28120 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28130 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
28140 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
28150 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
28160 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28170 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
28180 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28190 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
281a0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
281b0 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  .}...}....return
281c0 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09  (decrypt_ret);..
281d0 7d 0a 0a 09 69 66 20 28 70 44 61 74 61 29 20 7b  }...if (pData) {
281e0 0a 09 09 70 44 61 74 61 20 2b 3d 20 64 61 74 61  ...pData += data
281f0 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09  len_update;..}..
28200 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20  datalen_final = 
28210 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61  *pulDataLen - da
28220 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09  talen_update;...
28230 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
28240 44 65 63 72 79 70 74 46 69 6e 61 6c 28 68 53 65  DecryptFinal(hSe
28250 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64  ssion, pData, &d
28260 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09  atalen_final);..
28270 69 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20  if (decrypt_ret 
28280 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43  != CKR_OK) {...C
28290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
282a0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
282b0 79 70 74 46 69 6e 61 6c 28 29 20 72 65 74 75 72  yptFinal() retur
282c0 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
282d0 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
282e0 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63 72 79 70  ned long) decryp
282f0 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  t_ret);....retur
28300 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a  n(decrypt_ret);.
28310 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e  .}...*pulDataLen
28320 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74   = datalen_updat
28330 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61  e + datalen_fina
28340 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
28350 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
28360 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
28370 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
28380 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
28390 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
283a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
283b0 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
283c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
283d0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
283e0 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
283f0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
28400 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
28410 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
28420 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
28430 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73  pulPartLen) {..s
28440 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 62 75  tatic CK_BYTE bu
28450 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65  f[16384];..ssize
28460 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53  _t buflen;..CK_S
28470 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
28480 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43  CK_RV retval = C
28490 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
284a0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
284b0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
284c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
284d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
284e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
284f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28500 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28510 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
28520 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
28530 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
28540 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28550 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
28560 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
28570 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
28580 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
28590 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
285a0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
285b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
285c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
285d0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
285e0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
285f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
28600 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
28610 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
28620 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
28630 20 26 26 20 75 6c 45 6e 63 72 79 70 74 65 64 50   && ulEncryptedP
28640 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
28650 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
28660 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
28670 64 20 74 6f 20 64 65 63 72 79 70 74 20 6e 6f 74  d to decrypt not
28680 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43  hing... */...CAC
28690 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
286a0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
286b0 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
286c0 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
286d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
286e0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
286f0 45 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d  EncryptedPart ==
28700 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
28710 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28720 45 72 72 6f 72 2e 20 70 45 6e 63 72 79 70 74 65  Error. pEncrypte
28730 64 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62  dPart is NULL, b
28740 75 74 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  ut ulEncryptedPa
28750 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22  rtLen is not 0."
28760 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28770 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
28780 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72  ..}...if (ulEncr
28790 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20  yptedPartLen == 
287a0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
287b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
287c0 72 2e 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  r. ulEncryptedPa
287d0 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
287e0 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
287f0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
28800 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
28810 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
28820 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29  PartLen == NULL)
28830 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28840 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28850 20 70 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e   pulPartLen is N
28860 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
28870 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
28880 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
28890 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
288a0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
288b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
288c0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
288d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
288e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
288f0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
28900 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
28910 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
28920 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
28930 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28940 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
28950 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28960 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28970 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
28980 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28990 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
289a0 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
289b0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
289c0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
289d0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
289e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
289f0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28a00 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
28a10 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
28a20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28a30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
28a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28a50 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
28a60 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
28a70 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28a80 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
28a90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28aa0 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79  .slotID = cackey
28ab0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28ac0 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66  on].slotID;...if
28ad0 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
28ae0 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
28af0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
28b00 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
28b10 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
28b20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28b30 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
28b40 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
28b50 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
28b60 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
28b70 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
28b80 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28b90 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
28ba0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
28bb0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
28bc0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28bd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28be0 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
28bf0 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
28c00 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
28c10 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
28c20 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
28c30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28c40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28c50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
28c60 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
28c70 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
28c80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28c90 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
28ca0 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
28cb0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
28cc0 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f  ../* Ask card to
28cd0 20 64 65 63 72 79 70 74 20 2a 2f 0a 09 09 09 62   decrypt */....b
28ce0 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73  uflen = cackey_s
28cf0 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b  igndecrypt(&cack
28d00 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
28d10 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
28d20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
28d30 79 70 74 5f 69 64 65 6e 74 69 74 79 2c 20 70 45  ypt_identity, pE
28d40 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 75 6c  ncryptedPart, ul
28d50 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
28d60 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
28d70 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69  f), 0, 1);.....i
28d80 66 20 28 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  f (buflen < 0) {
28d90 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 69  ...../* Decrypti
28da0 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09  on failed. */...
28db0 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20  ..if (buflen == 
28dc0 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
28dd0 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09  EDLOGIN) {......
28de0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45  retval = CKR_USE
28df0 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b  R_NOT_LOGGED_IN;
28e00 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  .....} else if (
28e10 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
28e20 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
28e30 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76  ENT) {......retv
28e40 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f  al = CKR_DEVICE_
28e50 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65  REMOVED;.....} e
28e60 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61  lse {......retva
28e70 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
28e80 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09  ERROR;.....}....
28e90 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73  } else if (((uns
28ea0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c  igned long) bufl
28eb0 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65  en) > *pulPartLe
28ec0 6e 20 26 26 20 70 50 61 72 74 29 20 7b 0a 09 09  n && pPart) {...
28ed0 09 09 2f 2a 20 44 65 63 72 79 70 74 65 64 20 64  ../* Decrypted d
28ee0 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f  ata too large */
28ef0 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
28f00 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
28f10 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  LL;....} else {.
28f20 09 09 09 09 69 66 20 28 70 50 61 72 74 29 20 7b  ....if (pPart) {
28f30 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 50 61  ......memcpy(pPa
28f40 72 74 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29  rt, buf, buflen)
28f50 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75  ;.....}......*pu
28f60 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65  lPartLen = bufle
28f70 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  n;......retval =
28f80 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09   CKR_OK;....}...
28f90 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75  ..break;..}...mu
28fa0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
28fb0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28fc0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28fd0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
28fe0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
28ff0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29000 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
29010 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
29020 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
29030 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
29040 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29050 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
29060 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
29070 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
29080 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
29090 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
290a0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 46 69  _RV, C_DecryptFi
290b0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
290c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
290d0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4c 61   CK_BYTE_PTR pLa
290e0 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  stPart, CK_ULONG
290f0 5f 50 54 52 20 70 75 6c 4c 61 73 74 50 61 72 74  _PTR pulLastPart
29100 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Len) {..int mute
29110 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74  x_retval;..int t
29120 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74  erminate_decrypt
29130 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 1;...CACKEY_D
29140 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
29150 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
29160 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29170 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29180 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29190 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
291a0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
291b0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
291c0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
291d0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
291e0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
291f0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
29200 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
29210 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
29220 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
29230 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29240 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29250 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
29260 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
29270 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
29280 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
29290 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61  ;..}...if (pulLa
292a0 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c  stPartLen == NUL
292b0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
292c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
292d0 72 2e 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  r. pulLastPartLe
292e0 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
292f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
29300 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
29310 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
29320 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
29330 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
29340 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
29350 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
29360 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29370 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
29380 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
29390 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
293a0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
293b0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
293c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
293d0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
293e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
293f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
29400 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
29410 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29420 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
29430 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
29440 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
29450 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
29460 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
29470 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29480 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
29490 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
294a0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
294b0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
294c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
294d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
294e0 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
294f0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
29500 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f  n(CKR_OPERATION_
29510 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29520 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50  ;..}...*pulLastP
29530 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66  artLen = 0;...if
29540 20 28 70 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e   (pLastPart == N
29550 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61  ULL) {...termina
29560 74 65 5f 64 65 63 72 79 70 74 20 3d 20 30 3b 0a  te_decrypt = 0;.
29570 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61  .}...if (termina
29580 74 65 5f 64 65 63 72 79 70 74 29 20 7b 0a 09 09  te_decrypt) {...
29590 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
295a0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
295b0 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d  t_active = 0;..}
295c0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
295d0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
295e0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
295f0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
29600 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
29610 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29620 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29630 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
29640 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29650 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
29660 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
29670 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29680 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
29690 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
296a0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
296b0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
296c0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
296d0 69 67 65 73 74 49 6e 69 74 29 28 43 4b 5f 53 45  igestInit)(CK_SE
296e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
296f0 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
29700 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
29710 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  sm) {..CACKEY_DE
29720 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29730 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29740 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
29750 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29760 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29770 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29780 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29790 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
297a0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
297b0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
297c0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
297d0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
297e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
297f0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29800 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29810 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
29820 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29830 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
29840 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
29850 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 29 28  K_RV, C_Digest)(
29860 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
29870 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
29880 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
29890 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
298a0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
298b0 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  Digest, CK_ULONG
298c0 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65  _PTR pulDigestLe
298d0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
298e0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
298f0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
29900 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
29910 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29920 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29930 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
29940 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29950 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
29960 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
29970 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
29980 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
29990 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
299a0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
299b0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
299c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
299d0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
299e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
299f0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
29a00 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
29a10 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 55 70 64  _RV, C_DigestUpd
29a20 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
29a30 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
29a40 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
29a50 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
29a60 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
29a70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29a80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
29a90 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
29aa0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
29ab0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29ac0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
29ad0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
29ae0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
29af0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
29b00 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
29b10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
29b20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
29b30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29b40 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
29b50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29b60 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
29b70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29b80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
29b90 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
29ba0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
29bb0 73 74 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  stKey)(CK_SESSIO
29bc0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
29bd0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
29be0 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
29bf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29c00 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
29c10 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
29c20 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
29c30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29c40 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
29c50 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
29c60 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
29c70 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
29c80 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
29c90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29ca0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
29cb0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29cc0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
29cd0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29ce0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
29cf0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
29d00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
29d10 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29d20 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
29d30 67 65 73 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45  gestFinal)(CK_SE
29d40 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
29d50 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
29d60 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55  TR pDigest, CK_U
29d70 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65  LONG_PTR pulDige
29d80 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  stLen) {..CACKEY
29d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
29da0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
29db0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
29dc0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
29dd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29de0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
29df0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
29e00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
29e10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
29e20 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
29e30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29e40 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
29e50 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29e60 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
29e70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29e80 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
29e90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29ea0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
29eb0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
29ec0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49  N(CK_RV, C_SignI
29ed0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
29ee0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
29ef0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
29f00 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
29f10 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
29f20 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Key) {..int mute
29f30 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79  x_retval;...hKey
29f40 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  --;...CACKEY_DEB
29f50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
29f60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
29f70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
29f80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29f90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29fa0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
29fb0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29fc0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
29fd0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
29fe0 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
29ff0 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  sm == NULL) {...
2a000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a010 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
2a020 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22  hanism is NULL."
2a030 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a040 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2a050 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
2a060 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
2a070 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29  != CKM_RSA_PKCS)
2a080 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a090 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a0a0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
2a0b0 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69  hanism not speci
2a0c0 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f  fied as CKM_RSA_
2a0d0 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72  PKCS");....retur
2a0e0 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f  n(CKR_MECHANISM_
2a0f0 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a  PARAM_INVALID);.
2a100 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2a110 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2a120 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2a130 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2a140 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2a150 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[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 20 53  RINTF("Error.  S
2a180 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2a190 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2a1a0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2a1b0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2a1c0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2a1d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2a1e0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2a1f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2a200 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2a210 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a220 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a230 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2a240 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a250 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2a260 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2a270 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a280 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2a290 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2a2a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2a2b0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2a2c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a2d0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2a2e0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2a2f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2a300 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2a310 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2a320 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a330 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2a340 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2a350 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2a360 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2a370 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a380 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a390 53 69 67 6e 20 61 6c 72 65 61 64 79 20 69 6e 20  Sign already in 
2a3a0 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a  progress.");....
2a3b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2a3c0 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
2a3d0 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d  .}...if (hKey >=
2a3e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2a3f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2a400 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
2a410 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2a420 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2a430 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2a440 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a450 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65  ror.  Key handle
2a460 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72   out of range (r
2a470 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75  equested key %lu
2a480 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74  , only %lu ident
2a490 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29  ities available)
2a4a0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2a4b0 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67  ng) hKey, (unsig
2a4c0 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79  ned long) cackey
2a4d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2a4e0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
2a4f0 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
2a500 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f  (CKR_KEY_HANDLE_
2a510 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
2a520 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2a530 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
2a540 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b  tive = 1;...cack
2a550 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a560 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61  sion].sign_mecha
2a570 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  nism = pMechanis
2a580 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09  m->mechanism;...
2a590 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2a5a0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2a5b0 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61  uflen = 128;..ca
2a5c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a5d0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2a5e0 75 73 65 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65  used = 0;..cacke
2a5f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a600 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
2a610 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
2a620 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2a630 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2a640 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73  f) * cackey_sess
2a650 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2a660 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43  ign_buflen);...C
2a670 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a680 54 46 28 22 53 65 73 73 69 6f 6e 20 25 6c 75 20  TF("Session %lu 
2a690 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 69 73  sign_identity is
2a6a0 20 25 70 20 28 69 64 65 6e 74 69 74 79 20 23 25   %p (identity #%
2a6b0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
2a6c0 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 2c 20  long) hSession, 
2a6d0 28 76 6f 69 64 20 2a 29 20 26 63 61 63 6b 65 79  (void *) &cackey
2a6e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2a6f0 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68  on].identities[h
2a700 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20  Key], (unsigned 
2a710 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a 09 63 61  long) hKey);..ca
2a720 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a730 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65  ession].sign_ide
2a740 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f  ntity = &cackey_
2a750 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a760 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b  n].identities[hK
2a770 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ey];...mutex_ret
2a780 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2a790 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2a7a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2a7b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2a7c0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2a7d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a7e0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2a7f0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2a800 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2a810 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
2a820 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a830 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2a840 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2a850 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2a860 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
2a870 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2a880 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53 45 53 53   C_Sign)(CK_SESS
2a890 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2a8a0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2a8b0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2a8c0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
2a8d0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2a8e0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
2a8f0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
2a900 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
2a910 6e 67 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75  ng start_sign_bu
2a920 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69  fused;..CK_RV si
2a930 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  gn_ret;..int mut
2a940 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2a950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a960 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2a970 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2a980 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2a990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a9a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2a9b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2a9c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2a9d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2a9e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2a9f0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2aa00 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2aa10 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2aa20 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2aa30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2aa40 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2aa50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2aa60 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2aa70 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2aa80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2aa90 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2aaa0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72  ALID);..}...star
2aab0 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  t_sign_bufused =
2aac0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2aad0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2aae0 62 75 66 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f  bufused;...sign_
2aaf0 72 65 74 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ret = C_SignUpda
2ab00 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61  te(hSession, pDa
2ab10 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a  ta, ulDataLen);.
2ab20 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d  .if (sign_ret !=
2ab30 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
2ab40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ab50 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 55 70  ("Error.  SignUp
2ab60 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20  date() returned 
2ab70 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c  failure (rv = %l
2ab80 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  u).", (unsigned 
2ab90 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b  long) sign_ret);
2aba0 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74  ....if (sign_ret
2abb0 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   != CKR_BUFFER_T
2abc0 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d  OO_SMALL) {....m
2abd0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2abe0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2abf0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2ac00 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
2ac10 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
2ac20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ac30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2ac40 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2ac50 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2ac60 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2ac70 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
2ac80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2ac90 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2aca0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75   {.....cackey_mu
2acb0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2acc0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
2acd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ace0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2acf0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2ad00 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75  .");........retu
2ad10 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2ad20 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2ad30 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
2ad40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ad50 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
2ad60 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
2ad70 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2ad80 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2ad90 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2ada0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2adb0 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76    Sign not activ
2adc0 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
2add0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2ade0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2adf0 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  D);....}.....cac
2ae00 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2ae10 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
2ae20 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65  ve = 0;.....mute
2ae30 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2ae40 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2ae50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2ae60 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
2ae70 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
2ae80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ae90 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
2aea0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
2aeb0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2aec0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2aed0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
2aee0 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a  turn(sign_ret);.
2aef0 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  .}...sign_ret = 
2af00 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68 53 65 73  C_SignFinal(hSes
2af10 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74 75 72 65  sion, pSignature
2af20 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  , pulSignatureLe
2af30 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65  n);..if (sign_re
2af40 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
2af50 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d  .if (sign_ret ==
2af60 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
2af70 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b  SMALL) {....CACK
2af80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2af90 22 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74  "SignFinal() ret
2afa0 75 72 6e 65 64 20 43 4b 52 5f 42 55 46 46 45 52  urned CKR_BUFFER
2afb0 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d  _TOO_SMALL (rv =
2afc0 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43   %lu), undoing C
2afd0 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 2c 20  _SignUpdate()", 
2afe0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2aff0 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63  sign_ret);.....c
2b000 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b010 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b020 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69  fused = start_si
2b030 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 09  gn_bufused;.....
2b040 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29  return(sign_ret)
2b050 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
2b060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b070 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28  ror.  SignFinal(
2b080 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
2b090 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
2b0a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2b0b0 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72   sign_ret);....r
2b0c0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
2b0d0 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69 67 6e 61  ..}...if (pSigna
2b0e0 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ture == NULL) {.
2b0f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b100 52 49 4e 54 46 28 22 70 53 69 67 6e 61 74 75 72  RINTF("pSignatur
2b110 65 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  e specified as N
2b120 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53  ULL, undoing C_S
2b130 69 67 6e 55 70 64 61 74 65 28 29 22 29 3b 0a 0a  ignUpdate()");..
2b140 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b150 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b160 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74  _bufused = start
2b170 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a  _sign_bufused;..
2b180 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
2b190 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  t);..}...CACKEY_
2b1a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2b1b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2b1c0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
2b1d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2b1e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2b1f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2b200 53 69 67 6e 55 70 64 61 74 65 29 28 43 4b 5f 53  SignUpdate)(CK_S
2b210 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2b220 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2b230 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2b240 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
2b250 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2b260 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
2b270 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2b280 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2b290 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2b2a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2b2b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b2c0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2b2d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2b2e0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2b2f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2b300 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
2b310 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
2b320 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
2b330 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
2b340 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2b350 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
2b360 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b370 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2b380 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
2b390 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
2b3a0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2b3b0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2b3c0 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d  .}...if (pPart =
2b3d0 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50 61 72 74  = NULL && ulPart
2b3e0 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  Len == 0) {.../*
2b3f0 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69   Short circuit i
2b400 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74  f we are asked t
2b410 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e  o sign nothing..
2b420 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  . */...CACKEY_DE
2b430 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2b440 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2b450 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
2b460 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
2b470 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2b480 09 7d 0a 0a 09 69 66 20 28 70 50 61 72 74 20 3d  .}...if (pPart =
2b490 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2b4a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b4b0 22 45 72 72 6f 72 2e 20 70 50 61 72 74 20 69 73  "Error. pPart is
2b4c0 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72   NULL, but ulPar
2b4d0 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29  tLen is not 0.")
2b4e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2b4f0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
2b500 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61 72 74 4c  .}...if (ulPartL
2b510 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  en == 0) {...CAC
2b520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b530 28 22 45 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c  ("Error. ulPartL
2b540 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61  en is 0, but pPa
2b550 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  rt is not NULL."
2b560 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2b570 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
2b580 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2b590 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2b5a0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2b5b0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2b5c0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2b5d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b5e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b5f0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2b600 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2b610 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2b620 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2b630 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b640 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2b650 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2b660 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2b670 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2b680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b690 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
2b6a0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2b6b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2b6c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2b6d0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2b6e0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2b6f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2b700 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2b710 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2b720 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b730 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2b740 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b750 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65   Sign not active
2b760 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2b770 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
2b780 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2b790 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
2b7a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b7b0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63  ession].sign_mec
2b7c0 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65  hanism) {...case
2b7d0 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09   CKM_RSA_PKCS:..
2b7e0 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 20  ../* Accumulate 
2b7f0 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69  directly */....i
2b800 66 20 28 28 63 61 63 6b 65 79 5f 73 65 73 73 69  f ((cackey_sessi
2b810 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2b820 67 6e 5f 62 75 66 75 73 65 64 20 2b 20 75 6c 50  gn_bufused + ulP
2b830 61 72 74 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79  artLen) > cackey
2b840 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b850 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
2b860 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65   {.....cackey_se
2b870 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b880 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20  .sign_buflen *= 
2b890 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  2;......cackey_s
2b8a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b8b0 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20 72 65 61  ].sign_buf = rea
2b8c0 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73 65 73 73  lloc(cackey_sess
2b8d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b8e0 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28  ign_buf, sizeof(
2b8f0 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  *cackey_sessions
2b900 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2b910 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73 65  buf) * cackey_se
2b920 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b930 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09  .sign_buflen);..
2b940 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63  ..}.....memcpy(c
2b950 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b960 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b970 66 20 2b 20 63 61 63 6b 65 79 5f 73 65 73 73 69  f + cackey_sessi
2b980 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2b990 67 6e 5f 62 75 66 75 73 65 64 2c 20 70 50 61 72  gn_bufused, pPar
2b9a0 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a  t, ulPartLen);..
2b9b0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2b9c0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2b9d0 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20 75 6c 50  n_bufused += ulP
2b9e0 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61  artLen;.....brea
2b9f0 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
2ba00 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2ba10 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2ba20 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2ba30 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2ba40 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2ba50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ba60 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2ba70 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2ba80 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2ba90 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2baa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bab0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2bac0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2bad0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2bae0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2baf0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2bb00 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43  , C_SignFinal)(C
2bb10 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2bb20 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2bb30 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
2bb40 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  e, CK_ULONG_PTR 
2bb50 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29  pulSignatureLen)
2bb60 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59   {..static CK_BY
2bb70 54 45 20 73 69 67 62 75 66 5b 31 30 32 34 5d 3b  TE sigbuf[1024];
2bb80 0a 09 73 73 69 7a 65 5f 74 20 73 69 67 62 75 66  ..ssize_t sigbuf
2bb90 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  len;..CK_SLOT_ID
2bba0 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20   slotID;..CK_RV 
2bbb0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
2bbc0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
2bbd0 20 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20   terminate_sign 
2bbe0 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  = 1;..int mutex_
2bbf0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
2bc00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2bc10 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2bc20 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2bc30 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2bc40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2bc50 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2bc60 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2bc70 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2bc80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2bc90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53  );..}...if (pulS
2bca0 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e  ignatureLen == N
2bcb0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2bcc0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2bcd0 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61 74 75 72  ror. pulSignatur
2bce0 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  eLen is NULL.");
2bcf0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2bd00 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2bd10 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
2bd20 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
2bd30 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
2bd40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
2bd50 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2bd60 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
2bd70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2bd80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2bd90 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
2bda0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
2bdb0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2bdc0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2bdd0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2bde0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2bdf0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
2be00 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2be10 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2be20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2be30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2be40 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
2be50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2be60 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2be70 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2be80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2be90 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
2bea0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2beb0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2bec0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2bed0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2bee0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
2bef0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2bf00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
2bf10 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
2bf20 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
2bf30 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bf40 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2bf50 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2bf60 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2bf70 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2bf80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bf90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2bfa0 53 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  Sign not active.
2bfb0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2bfc0 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
2bfd0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2bfe0 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
2bff0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c000 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
2c010 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
2c020 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
2c030 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
2c040 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
2c050 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
2c060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c070 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c080 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2c090 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
2c0a0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
2c0b0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
2c0c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2c0d0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2c0e0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
2c0f0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
2c100 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
2c110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c120 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
2c130 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
2c140 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
2c150 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
2c160 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
2c170 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2c180 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2c190 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
2c1a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2c1b0 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
2c1c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c1d0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
2c1e0 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73  chanism) {...cas
2c1f0 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
2c200 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64 20 74  .../* Ask card t
2c210 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43  o sign */....CAC
2c220 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c230 28 22 41 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e  ("Asking to sign
2c240 20 66 72 6f 6d 20 69 64 65 6e 74 69 74 79 20 25   from identity %
2c250 70 20 69 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75  p in session %lu
2c260 22 2c 20 28 76 6f 69 64 20 2a 29 20 63 61 63 6b  ", (void *) cack
2c270 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c280 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
2c290 69 74 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ity, (unsigned l
2c2a0 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a  ong) hSession);.
2c2b0 09 09 09 73 69 67 62 75 66 6c 65 6e 20 3d 20 63  ...sigbuflen = c
2c2c0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
2c2d0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
2c2e0 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
2c2f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c300 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
2c310 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  , cackey_session
2c320 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2c330 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f 73 65 73  _buf, cackey_ses
2c340 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c350 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 73 69  sign_bufused, si
2c360 67 62 75 66 2c 20 73 69 7a 65 6f 66 28 73 69 67  gbuf, sizeof(sig
2c370 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09  buf), 1, 0);....
2c380 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3c  .if (sigbuflen <
2c390 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67   0) {...../* Sig
2c3a0 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a  ning failed. */.
2c3b0 09 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
2c3c0 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
2c3d0 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a  _E_NEEDLOGIN) {.
2c3e0 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
2c3f0 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45  R_USER_NOT_LOGGE
2c400 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65  D_IN;.....} else
2c410 20 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d   if (sigbuflen =
2c420 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
2c430 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
2c440 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
2c450 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b  _DEVICE_REMOVED;
2c460 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
2c470 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2c480 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
2c490 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69  ...}....} else i
2c4a0 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  f (((unsigned lo
2c4b0 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 29 20 3e  ng) sigbuflen) >
2c4c0 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65   *pulSignatureLe
2c4d0 6e 20 26 26 20 70 53 69 67 6e 61 74 75 72 65 29  n && pSignature)
2c4e0 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 65 64   {...../* Signed
2c4f0 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65 20   data too large 
2c500 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  */.....CACKEY_DE
2c510 42 55 47 5f 50 52 49 4e 54 46 28 22 72 65 74 76  BUG_PRINTF("retv
2c520 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
2c530 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62  TOO_SMALL;  sigb
2c540 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c  uflen = %lu, pul
2c550 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25  SignatureLen = %
2c560 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
2c570 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e 2c 20  ong) sigbuflen, 
2c580 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2c590 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
2c5a0 29 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  );......retval =
2c5b0 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
2c5c0 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d  SMALL;......term
2c5d0 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a  inate_sign = 0;.
2c5e0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
2c5f0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
2c600 20 30 3b 0a 0a 09 09 09 09 69 66 20 28 70 53 69   0;......if (pSi
2c610 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 09  gnature) {......
2c620 6d 65 6d 63 70 79 28 70 53 69 67 6e 61 74 75 72  memcpy(pSignatur
2c630 65 2c 20 73 69 67 62 75 66 2c 20 73 69 67 62 75  e, sigbuf, sigbu
2c640 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72  flen);.......ter
2c650 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b  minate_sign = 1;
2c660 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c  .....}......*pul
2c670 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73  SignatureLen = s
2c680 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72  igbuflen;......r
2c690 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
2c6a0 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
2c6b0 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d 69 6e 61  .}...if (termina
2c6c0 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09 69 66 20  te_sign) {...if 
2c6d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c6e0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2c6f0 62 75 66 29 20 7b 0a 09 09 09 66 72 65 65 28 63  buf) {....free(c
2c700 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c710 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2c720 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  f);...}....cacke
2c730 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c740 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
2c750 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78   = 0;..}...mutex
2c760 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2c770 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2c780 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2c790 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2c7a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2c7b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c7c0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2c7d0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2c7e0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2c7f0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2c800 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c810 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
2c820 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  i", (int) retval
2c830 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
2c840 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
2c850 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2c860 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49  , C_SignRecoverI
2c870 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
2c880 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2c890 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2c8a0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
2c8b0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2c8c0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
2c8d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2c8e0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2c8f0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2c900 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2c910 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c920 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2c930 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2c940 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2c950 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2c960 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2c970 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2c980 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2c990 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2c9a0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2c9b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c9c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2c9d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2c9e0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2c9f0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2ca00 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63  CK_RV, C_SignRec
2ca10 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  over)(CK_SESSION
2ca20 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2ca30 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2ca40 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2ca50 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
2ca60 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
2ca70 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2ca80 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
2ca90 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2caa0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2cab0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2cac0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2cad0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cae0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2caf0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2cb00 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2cb10 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2cb20 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2cb30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cb40 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2cb50 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2cb60 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2cb70 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2cb80 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2cb90 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2cba0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2cbb0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2cbc0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2cbd0 20 43 5f 56 65 72 69 66 79 49 6e 69 74 29 28 43   C_VerifyInit)(C
2cbe0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2cbf0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2cc00 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2cc10 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
2cc20 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
2cc30 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2cc40 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2cc50 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2cc60 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2cc70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cc80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2cc90 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2cca0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2ccb0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2ccc0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2ccd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cce0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2ccf0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2cd00 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2cd10 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2cd20 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2cd30 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2cd40 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2cd50 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2cd60 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2cd70 20 43 5f 56 65 72 69 66 79 29 28 43 4b 5f 53 45   C_Verify)(CK_SE
2cd80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2cd90 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2cda0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
2cdb0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
2cdc0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2cdd0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
2cde0 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
2cdf0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ce00 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2ce10 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2ce20 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2ce30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ce40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2ce50 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2ce60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2ce70 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2ce80 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2ce90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cea0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2ceb0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2cec0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2ced0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2cee0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2cef0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2cf00 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2cf10 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2cf20 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2cf30 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 29   C_VerifyUpdate)
2cf40 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2cf50 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2cf60 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
2cf70 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
2cf80 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2cf90 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2cfa0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2cfb0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2cfc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2cfd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2cfe0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2cff0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2d000 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2d010 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2d020 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2d030 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2d040 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2d050 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2d060 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2d070 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d080 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2d090 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d0a0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2d0b0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2d0c0 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 46 69  K_RV, C_VerifyFi
2d0d0 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
2d0e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2d0f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
2d100 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
2d110 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
2d120 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2d130 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2d140 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2d150 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2d160 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d170 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d180 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2d190 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d1a0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2d1b0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2d1c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d1d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2d1e0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2d1f0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2d200 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2d210 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d220 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2d230 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d240 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2d250 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2d260 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f  RV, C_VerifyReco
2d270 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  verInit)(CK_SESS
2d280 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d290 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2d2a0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2d2b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2d2c0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
2d2d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d2e0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d2f0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d300 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d310 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d320 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d330 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d340 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d350 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d360 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2d370 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d380 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2d390 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d3a0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2d3b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d3c0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2d3d0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2d3e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2d3f0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2d400 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2d410 69 66 79 52 65 63 6f 76 65 72 29 28 43 4b 5f 53  ifyRecover)(CK_S
2d420 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2d430 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2d440 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
2d450 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
2d460 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  tureLen, CK_BYTE
2d470 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
2d480 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 61 74 61  LONG_PTR pulData
2d490 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2d4a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2d4b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2d4c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2d4d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2d4e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2d4f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2d500 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2d510 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2d520 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2d530 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2d540 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2d550 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2d560 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2d570 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2d580 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d590 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2d5a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d5b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2d5c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2d5d0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 45  CK_RV, C_DigestE
2d5e0 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ncryptUpdate)(CK
2d5f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2d600 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2d610 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2d620 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c  ULONG ulPartLen,
2d630 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2d640 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2d650 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63  ULONG_PTR pulEnc
2d660 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b  ryptedPartLen) {
2d670 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d680 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2d690 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2d6a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2d6b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d6c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2d6d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2d6e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d6f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2d700 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2d710 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d720 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d730 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d740 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2d750 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2d760 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2d770 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2d780 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d790 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2d7a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2d7b0 20 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74   C_DecryptDigest
2d7c0 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2d7d0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2d7e0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2d7f0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
2d800 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
2d810 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
2d820 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
2d830 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2d840 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2d850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d860 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d870 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d880 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d890 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d8a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d8b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d8c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d8d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d8e0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2d8f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d900 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2d910 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d920 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2d930 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d940 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2d950 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2d960 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2d970 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2d980 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2d990 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28  nEncryptUpdate)(
2d9a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2d9b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2d9c0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2d9d0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
2d9e0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2d9f0 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
2da00 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45  K_ULONG_PTR pulE
2da10 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
2da20 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2da30 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2da40 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2da50 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2da60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2da70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2da80 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2da90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2daa0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2dab0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2dac0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2dad0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2dae0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2daf0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2db00 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2db10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2db20 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2db30 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2db40 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2db50 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2db60 56 2c 20 43 5f 44 65 63 72 79 70 74 56 65 72 69  V, C_DecryptVeri
2db70 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  fyUpdate)(CK_SES
2db80 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2db90 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2dba0 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2dbb0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63  , CK_ULONG ulEnc
2dbc0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43  ryptedPartLen, C
2dbd0 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2dbe0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2dbf0 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
2dc00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2dc10 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2dc20 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2dc30 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2dc40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2dc50 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2dc60 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2dc70 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2dc80 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2dc90 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2dca0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2dcb0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2dcc0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2dcd0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2dce0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2dcf0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2dd00 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2dd10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2dd20 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2dd30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
2dd40 65 6e 65 72 61 74 65 4b 65 79 29 28 43 4b 5f 53  enerateKey)(CK_S
2dd50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2dd60 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2dd70 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2dd80 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ism, CK_ATTRIBUT
2dd90 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
2dda0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
2ddb0 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
2ddc0 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
2ddd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2dde0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2ddf0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2de00 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2de10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2de20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2de30 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2de40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2de50 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2de60 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2de70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2de80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2de90 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2dea0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2deb0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2dec0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2ded0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2dee0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2def0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2df00 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2df10 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61   C_GenerateKeyPa
2df20 69 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ir)(CK_SESSION_H
2df30 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2df40 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2df50 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2df60 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
2df70 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c 61 74 65  ublicKeyTemplate
2df80 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62  , CK_ULONG ulPub
2df90 6c 69 63 4b 65 79 41 74 74 72 69 62 75 74 65 43  licKeyAttributeC
2dfa0 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ount, CK_ATTRIBU
2dfb0 54 45 5f 50 54 52 20 70 50 72 69 76 61 74 65 4b  TE_PTR pPrivateK
2dfc0 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55  eyTemplate, CK_U
2dfd0 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74 65 4b 65  LONG ulPrivateKe
2dfe0 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  yAttributeCount,
2dff0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2e000 45 5f 50 54 52 20 70 68 50 75 62 6c 69 63 4b 65  E_PTR phPublicKe
2e010 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  y, CK_OBJECT_HAN
2e020 44 4c 45 5f 50 54 52 20 70 68 50 72 69 76 61 74  DLE_PTR phPrivat
2e030 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eKey) {..CACKEY_
2e040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2e050 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2e060 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2e070 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2e080 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e090 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2e0a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2e0b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2e0c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2e0d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2e0e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2e0f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2e100 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2e110 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2e120 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2e130 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2e140 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e150 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2e160 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2e170 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65  (CK_RV, C_WrapKe
2e180 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
2e190 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2e1a0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2e1b0 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2e1c0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 57 72  BJECT_HANDLE hWr
2e1d0 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42  appingKey, CK_OB
2e1e0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2e1f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57  , CK_BYTE_PTR pW
2e200 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c  rappedKey, CK_UL
2e210 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72 61 70 70  ONG_PTR pulWrapp
2e220 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43  edKeyLen) {..CAC
2e230 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e240 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2e250 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2e260 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2e270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e280 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2e290 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2e2a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2e2b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2e2c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2e2d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e2e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2e2f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e300 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2e310 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e320 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2e330 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2e340 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2e350 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2e360 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e  TION(CK_RV, C_Un
2e370 77 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53  wrapKey)(CK_SESS
2e380 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2e390 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2e3a0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2e3b0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2e3c0 4c 45 20 68 55 6e 77 72 61 70 70 69 6e 67 4b 65  LE hUnwrappingKe
2e3d0 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  y, CK_BYTE_PTR p
2e3e0 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55  WrappedKey, CK_U
2e3f0 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65 64 4b 65  LONG ulWrappedKe
2e400 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  yLen, CK_ATTRIBU
2e410 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
2e420 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74  , CK_ULONG ulAtt
2e430 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
2e440 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
2e450 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
2e460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e470 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2e480 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2e490 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2e4a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e4b0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2e4c0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2e4d0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2e4e0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2e4f0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2e500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e510 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2e520 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e530 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2e540 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e550 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2e560 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2e570 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2e580 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e590 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72  ION(CK_RV, C_Der
2e5a0 69 76 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49  iveKey)(CK_SESSI
2e5b0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e5c0 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2e5d0 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2e5e0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2e5f0 45 20 68 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41  E hBaseKey, CK_A
2e600 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
2e610 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
2e620 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e   ulAttributeCoun
2e630 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  t, CK_OBJECT_HAN
2e640 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b  DLE_PTR phKey) {
2e650 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e660 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2e670 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2e680 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2e690 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e6a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2e6b0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2e6c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e6d0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2e6e0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2e6f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e700 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2e710 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e720 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2e730 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e740 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2e750 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2e760 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e770 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2e780 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2e790 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 29 28 43   C_SeedRandom)(C
2e7a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2e7b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2e7c0 54 45 5f 50 54 52 20 70 53 65 65 64 2c 20 43 4b  TE_PTR pSeed, CK
2e7d0 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e  _ULONG ulSeedLen
2e7e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2e7f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2e800 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2e810 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2e820 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e830 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e840 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2e850 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e860 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2e870 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2e880 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e890 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2e8a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2e8b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2e8c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2e8d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e8e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2e8f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e900 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2e910 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2e920 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 52 61  RV, C_GenerateRa
2e930 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
2e940 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2e950 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 52  , CK_BYTE_PTR pR
2e960 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c  andomData, CK_UL
2e970 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29  ONG ulRandomLen)
2e980 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2e990 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2e9a0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2e9b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2e9c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e9d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2e9e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2e9f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ea00 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2ea10 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2ea20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ea30 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2ea40 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ea50 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2ea60 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2ea70 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2ea80 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2ea90 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2eaa0 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72  TED);.}../* Depr
2eab0 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20  ecated Function 
2eac0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
2ead0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
2eae0 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73  etFunctionStatus
2eaf0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2eb00 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a  DLE hSession) {.
2eb10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2eb20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2eb30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2eb40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2eb50 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2eb60 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29  OT_PARALLEL (%i)
2eb70 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2eb80 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
2eb90 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2eba0 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
2ebb0 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d  L);...hSession =
2ebc0 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75   hSession; /* Su
2ebd0 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72  press unused var
2ebe0 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f  iable warning */
2ebf0 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65  .}../* Deprecate
2ec00 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b  d Function */.CK
2ec10 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2ec20 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c  (CK_RV, C_Cancel
2ec30 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53  Function)(CK_SES
2ec40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ec50 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  sion) {..CACKEY_
2ec60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2ec70 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
2ec80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ec90 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2eca0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
2ecb0 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  LEL (%i)", CKR_F
2ecc0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
2ecd0 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  LLEL);...return(
2ece0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ecf0 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53  _PARALLEL);...hS
2ed00 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f  ession = hSessio
2ed10 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  n; /* Supress un
2ed20 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
2ed30 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
2ed40 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ed50 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74  K_RV, C_GetFunct
2ed60 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43  ionList)(CK_FUNC
2ed70 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54  TION_LIST_PTR_PT
2ed80 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  R ppFunctionList
2ed90 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e  ) {..CK_FUNCTION
2eda0 5f 4c 49 53 54 5f 50 54 52 20 70 46 75 6e 63 74  _LIST_PTR pFunct
2edb0 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45  ionList;...CACKE
2edc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2edd0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2ede0 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  (ppFunctionList 
2edf0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2ee00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ee10 28 22 45 72 72 6f 72 2e 20 70 70 46 75 6e 63 74  ("Error. ppFunct
2ee20 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e  ionList is NULL.
2ee30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ee40 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2ee50 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  ;..}...pFunction
2ee60 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  List = malloc(si
2ee70 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c  zeof(*pFunctionL
2ee80 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69  ist));...pFuncti
2ee90 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e  onList->version.
2eea0 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  major = ((CACKEY
2eeb0 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
2eec0 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20 26  N_CODE) >> 16) &
2eed0 20 30 78 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f   0xff;..pFunctio
2eee0 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d  nList->version.m
2eef0 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f  inor = ((CACKEY_
2ef00 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e  CRYPTOKI_VERSION
2ef10 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20 30  _CODE) >> 8) & 0
2ef20 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e  xff;...pFunction
2ef30 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69  List->C_Initiali
2ef40 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a  ze = C_Initializ
2ef50 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2ef60 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20  t->C_Finalize = 
2ef70 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75  C_Finalize;..pFu
2ef80 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2ef90 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66  tInfo = C_GetInf
2efa0 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  o;..pFunctionLis
2efb0 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74  t->C_GetSlotList
2efc0 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74   = C_GetSlotList
2efd0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2efe0 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20  ->C_GetSlotInfo 
2eff0 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b  = C_GetSlotInfo;
2f000 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f010 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20  >C_GetTokenInfo 
2f020 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  = C_GetTokenInfo
2f030 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f040 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45  ->C_WaitForSlotE
2f050 76 65 6e 74 20 3d 20 43 5f 57 61 69 74 46 6f 72  vent = C_WaitFor
2f060 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e  SlotEvent;..pFun
2f070 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2f080 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20  MechanismList = 
2f090 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69  C_GetMechanismLi
2f0a0 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  st;..pFunctionLi
2f0b0 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69  st->C_GetMechani
2f0c0 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65  smInfo = C_GetMe
2f0d0 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46  chanismInfo;..pF
2f0e0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
2f0f0 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69  nitToken = C_Ini
2f100 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69  tToken;..pFuncti
2f110 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49  onList->C_InitPI
2f120 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09  N = C_InitPIN;..
2f130 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f140 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53 65 74 50  _SetPIN = C_SetP
2f150 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  IN;..pFunctionLi
2f160 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f  st->C_OpenSessio
2f170 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f  n = C_OpenSessio
2f180 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
2f190 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f  t->C_CloseSessio
2f1a0 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65 73 73 69  n = C_CloseSessi
2f1b0 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  on;..pFunctionLi
2f1c0 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  st->C_CloseAllSe
2f1d0 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65  ssions = C_Close
2f1e0 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46  AllSessions;..pF
2f1f0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2f200 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20  etSessionInfo = 
2f210 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
2f220 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f230 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  ->C_GetOperation
2f240 53 74 61 74 65 20 3d 20 43 5f 47 65 74 4f 70 65  State = C_GetOpe
2f250 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46  rationState;..pF
2f260 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2f270 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
2f280 20 3d 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f   = C_SetOperatio
2f290 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  nState;..pFuncti
2f2a0 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20  onList->C_Login 
2f2b0 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e  = C_Login;..pFun
2f2c0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
2f2d0 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a  out = C_Logout;.
2f2e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f2f0 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 20 3d  C_CreateObject =
2f300 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 3b   C_CreateObject;
2f310 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f320 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20  >C_CopyObject = 
2f330 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70  C_CopyObject;..p
2f340 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f350 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20  DestroyObject = 
2f360 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b  C_DestroyObject;
2f370 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f380 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65  >C_GetObjectSize
2f390 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63 74 53 69   = C_GetObjectSi
2f3a0 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ze;..pFunctionLi
2f3b0 73 74 2d 3e 43 5f 47 65 74 41 74 74 72 69 62 75  st->C_GetAttribu
2f3c0 74 65 56 61 6c 75 65 20 3d 20 43 5f 47 65 74 41  teValue = C_GetA
2f3d0 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09  ttributeValue;..
2f3e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f3f0 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
2f400 75 65 20 3d 20 43 5f 53 65 74 41 74 74 72 69 62  ue = C_SetAttrib
2f410 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63  uteValue;..pFunc
2f420 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
2f430 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d 20 43 5f  ObjectsInit = C_
2f440 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b  FindObjectsInit;
2f450 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f460 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d  >C_FindObjects =
2f470 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a   C_FindObjects;.
2f480 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f490 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
2f4a0 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  al = C_FindObjec
2f4b0 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  tsFinal;..pFunct
2f4c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
2f4d0 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79  ptInit = C_Encry
2f4e0 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  ptInit;..pFuncti
2f4f0 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70  onList->C_Encryp
2f500 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09  t = C_Encrypt;..
2f510 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f520 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  _EncryptUpdate =
2f530 20 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74 65   C_EncryptUpdate
2f540 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f550 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c  ->C_EncryptFinal
2f560 20 3d 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61   = C_EncryptFina
2f570 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
2f580 74 2d 3e 43 5f 44 65 63 72 79 70 74 49 6e 69 74  t->C_DecryptInit
2f590 20 3d 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74   = C_DecryptInit
2f5a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f5b0 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d 20 43 5f  ->C_Decrypt = C_
2f5c0 44 65 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74  Decrypt;..pFunct
2f5d0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
2f5e0 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63  ptUpdate = C_Dec
2f5f0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
2f600 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
2f610 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44  cryptFinal = C_D
2f620 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46  ecryptFinal;..pF
2f630 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2f640 69 67 65 73 74 49 6e 69 74 20 3d 20 43 5f 44 69  igestInit = C_Di
2f650 67 65 73 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63  gestInit;..pFunc
2f660 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
2f670 73 74 20 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09  st = C_Digest;..
2f680 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f690 5f 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20  _DigestUpdate = 
2f6a0 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a  C_DigestUpdate;.
2f6b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f6c0 43 5f 44 69 67 65 73 74 4b 65 79 20 3d 20 43 5f  C_DigestKey = C_
2f6d0 44 69 67 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e  DigestKey;..pFun
2f6e0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
2f6f0 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67  estFinal = C_Dig
2f700 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  estFinal;..pFunc
2f710 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
2f720 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69  Init = C_SignIni
2f730 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2f740 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69  t->C_Sign = C_Si
2f750 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  gn;..pFunctionLi
2f760 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64 61 74 65  st->C_SignUpdate
2f770 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 3b   = C_SignUpdate;
2f780 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f790 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43  >C_SignFinal = C
2f7a0 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75  _SignFinal;..pFu
2f7b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
2f7c0 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20  gnRecoverInit = 
2f7d0 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
2f7e0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2f7f0 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  t->C_SignRecover
2f800 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
2f810 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f820 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69 74 20 3d  ->C_VerifyInit =
2f830 20 43 5f 56 65 72 69 66 79 49 6e 69 74 3b 0a 09   C_VerifyInit;..
2f840 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f850 5f 56 65 72 69 66 79 20 3d 20 43 5f 56 65 72 69  _Verify = C_Veri
2f860 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fy;..pFunctionLi
2f870 73 74 2d 3e 43 5f 56 65 72 69 66 79 55 70 64 61  st->C_VerifyUpda
2f880 74 65 20 3d 20 43 5f 56 65 72 69 66 79 55 70 64  te = C_VerifyUpd
2f890 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2f8a0 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e  ist->C_VerifyFin
2f8b0 61 6c 20 3d 20 43 5f 56 65 72 69 66 79 46 69 6e  al = C_VerifyFin
2f8c0 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2f8d0 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f  st->C_VerifyReco
2f8e0 76 65 72 49 6e 69 74 20 3d 20 43 5f 56 65 72 69  verInit = C_Veri
2f8f0 66 79 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09  fyRecoverInit;..
2f900 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f910 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 20 3d  _VerifyRecover =
2f920 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
2f930 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f940 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  ->C_DigestEncryp
2f950 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65  tUpdate = C_Dige
2f960 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b  stEncryptUpdate;
2f970 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f980 3e 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74  >C_DecryptDigest
2f990 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79  Update = C_Decry
2f9a0 70 74 44 69 67 65 73 74 55 70 64 61 74 65 3b 0a  ptDigestUpdate;.
2f9b0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f9c0 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
2f9d0 61 74 65 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72  ate = C_SignEncr
2f9e0 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
2f9f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
2fa00 72 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65  ryptVerifyUpdate
2fa10 20 3d 20 43 5f 44 65 63 72 79 70 74 56 65 72 69   = C_DecryptVeri
2fa20 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  fyUpdate;..pFunc
2fa30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
2fa40 72 61 74 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65  rateKey = C_Gene
2fa50 72 61 74 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74  rateKey;..pFunct
2fa60 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72  ionList->C_Gener
2fa70 61 74 65 4b 65 79 50 61 69 72 20 3d 20 43 5f 47  ateKeyPair = C_G
2fa80 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 3b 0a  enerateKeyPair;.
2fa90 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2faa0 43 5f 57 72 61 70 4b 65 79 20 3d 20 43 5f 57 72  C_WrapKey = C_Wr
2fab0 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  apKey;..pFunctio
2fac0 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b  nList->C_UnwrapK
2fad0 65 79 20 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79  ey = C_UnwrapKey
2fae0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2faf0 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79 20 3d 20  ->C_DeriveKey = 
2fb00 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a 09 70 46  C_DeriveKey;..pF
2fb10 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2fb20 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65  eedRandom = C_Se
2fb30 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63  edRandom;..pFunc
2fb40 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65  tionList->C_Gene
2fb50 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47  rateRandom = C_G
2fb60 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09  enerateRandom;..
2fb70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2fb80 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
2fb90 75 73 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69  us = C_GetFuncti
2fba0 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46 75 6e 63  onStatus;..pFunc
2fbb0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63  tionList->C_Canc
2fbc0 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43  elFunction = C_C
2fbd0 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09  ancelFunction;..
2fbe0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2fbf0 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74  _GetFunctionList
2fc00 20 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e   = C_GetFunction
2fc10 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74  List;...*ppFunct
2fc20 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75 6e 63 74  ionList = pFunct
2fc30 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45  ionList;...CACKE
2fc40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2fc50 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2fc60 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
2fc70 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2fc80 29 3b 0a 7d 0a 0a                                );.}..