Hex Artifact Content

Artifact 9baedfd1c942ef18f17a6f15beb1fe3f0cd611e9:


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 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
bfa0: 3d 20 30 78 36 41 38 36 29 20 7b 0a 2f 2a 20 58  = 0x6A86) {./* X
bfb0: 58 58 20 54 4f 44 4f 20 50 49 56 20 2a 2f 0a 09  XX TODO PIV */..
bfc0: 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
bfd0: 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
bfe0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61  y_send_apdu() fa
bff0: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
c000: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
c010: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
c020: 0a 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e  ..offset += coun
c030: 74 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  t;..#ifdef CACKE
c040: 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66  Y_PARANOID.#  if
c050: 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  def _POSIX_SSIZE
c060: 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74  _MAX..if (offset
c070: 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
c080: 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
c090: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66  DEBUG_PRINTF("Of
c0a0: 66 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78  fset exceeds max
c0b0: 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75  imum value, retu
c0c0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
c0d0: 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66  . (max = %li, of
c0e0: 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c  fset = %lu)", (l
c0f0: 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a  ong) _POSIX_SSIZ
c100: 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64  E_MAX, (unsigned
c110: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
c120: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
c130: 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  }.#  endif.#endi
c140: 66 0a 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3c  f...if (offset <
c150: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
c160: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44  EBUG_PRINTF("APD
c170: 55 20 47 45 54 20 44 41 54 41 20 72 65 74 75 72  U GET DATA retur
c180: 6e 65 64 20 25 6c 75 20 62 79 74 65 73 2c 20 77  ned %lu bytes, w
c190: 68 69 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72  hich is too shor
c1a0: 74 20 66 6f 72 20 61 20 42 45 52 2d 54 4c 56 20  t for a BER-TLV 
c1b0: 72 65 73 70 6f 6e 73 65 22 2c 20 28 75 6e 73 69  response", (unsi
c1c0: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65  gned long) offse
c1d0: 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  t);....return(-1
c1e0: 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70  );..}...buffer_p
c1f0: 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 66 20 28   = buffer;..if (
c200: 2a 62 75 66 66 65 72 5f 70 20 21 3d 20 30 78 35  *buffer_p != 0x5
c210: 33 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  3) {...CACKEY_DE
c220: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55  BUG_PRINTF("APDU
c230: 20 47 45 54 20 44 41 54 41 20 64 69 64 20 6e 6f   GET DATA did no
c240: 74 20 72 65 74 75 72 6e 20 61 20 42 45 52 2d 54  t return a BER-T
c250: 4c 56 20 77 69 74 68 20 74 61 67 20 35 33 2e 20  LV with tag 53. 
c260: 20 54 61 67 20 3d 20 25 30 32 78 22 2c 20 28 75   Tag = %02x", (u
c270: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 2a 62 75  nsigned int) *bu
c280: 66 66 65 72 5f 70 29 3b 0a 0a 09 09 72 65 74 75  ffer_p);....retu
c290: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 09 62 75 66 66  rn(-1);..}..buff
c2a0: 65 72 5f 70 2b 2b 3b 0a 0a 09 69 66 20 28 28 2a  er_p++;...if ((*
c2b0: 62 75 66 66 65 72 5f 70 20 26 20 30 78 38 30 29  buffer_p & 0x80)
c2c0: 20 3d 3d 20 30 78 38 30 29 20 7b 0a 09 09 73 69   == 0x80) {...si
c2d0: 7a 65 20 3d 20 30 3b 0a 09 09 69 64 78 20 3d 20  ze = 0;...idx = 
c2e0: 28 2a 62 75 66 66 65 72 5f 70 20 26 20 30 78 37  (*buffer_p & 0x7
c2f0: 66 29 3b 0a 0a 09 09 69 66 20 28 28 28 62 75 66  f);....if (((buf
c300: 66 65 72 5f 70 20 2d 20 62 75 66 66 65 72 29 20  fer_p - buffer) 
c310: 2b 20 69 64 78 29 20 3e 3d 20 6f 66 66 73 65 74  + idx) >= offset
c320: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
c330: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 6c 66  BUG_PRINTF("Malf
c340: 6f 72 6d 65 64 20 42 45 52 20 76 61 6c 75 65 20  ormed BER value 
c350: 2d 2d 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79  -- not enough by
c360: 74 65 73 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  tes available to
c370: 20 72 65 61 64 20 6c 65 6e 67 74 68 22 29 3b 0a   read length");.
c380: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
c390: 09 09 7d 0a 0a 09 09 66 6f 72 20 28 3b 20 69 64  ..}....for (; id
c3a0: 78 20 3e 20 30 3b 20 69 64 78 2d 2d 29 20 7b 0a  x > 0; idx--) {.
c3b0: 09 09 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 09  ...buffer_p++;..
c3c0: 09 09 73 69 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09  ..size <<= 8;...
c3d0: 09 73 69 7a 65 20 7c 3d 20 2a 62 75 66 66 65 72  .size |= *buffer
c3e0: 5f 70 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  _p;...}..} else 
c3f0: 7b 0a 09 09 73 69 7a 65 20 3d 20 2a 62 75 66 66  {...size = *buff
c400: 65 72 5f 70 3b 0a 09 7d 0a 09 62 75 66 66 65 72  er_p;..}..buffer
c410: 5f 70 2b 2b 3b 0a 0a 09 69 66 20 28 28 28 62 75  _p++;...if (((bu
c420: 66 66 65 72 5f 70 20 2d 20 62 75 66 66 65 72 29  ffer_p - buffer)
c430: 20 2b 20 73 69 7a 65 29 20 21 3d 20 6f 66 66 73   + size) != offs
c440: 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  et) {...CACKEY_D
c450: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 6e 74  EBUG_PRINTF("Ent
c460: 69 72 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f  ire buffer is no
c470: 74 20 63 6f 6e 73 75 6d 65 64 21 22 29 3b 0a 0a  t consumed!");..
c480: 09 09 69 66 20 28 28 28 62 75 66 66 65 72 5f 70  ..if (((buffer_p
c490: 20 2d 20 62 75 66 66 65 72 29 20 2b 20 73 69 7a   - buffer) + siz
c4a0: 65 29 20 3e 20 6f 66 66 73 65 74 29 20 7b 0a 09  e) > offset) {..
c4b0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c4c0: 52 49 4e 54 46 28 22 45 6e 63 6f 64 65 64 20 73  RINTF("Encoded s
c4d0: 69 7a 65 20 69 73 20 67 72 65 61 74 65 72 20 74  ize is greater t
c4e0: 68 61 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  han the amount o
c4f0: 66 20 64 61 74 61 20 72 65 61 64 2c 20 64 72 6f  f data read, dro
c500: 70 70 69 6e 67 22 29 3b 0a 0a 09 09 09 72 65 74  pping");.....ret
c510: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a  urn(-1);...}..}.
c520: 0a 09 6d 65 6d 6d 6f 76 65 28 62 75 66 66 65 72  ..memmove(buffer
c530: 2c 20 62 75 66 66 65 72 5f 70 2c 20 73 69 7a 65  , buffer_p, size
c540: 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
c550: 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45 54 20  G_PRINTBUF("GET 
c560: 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20 62 75  DATA result", bu
c570: 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a 09 43  ffer, size);...C
c580: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c590: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
c5a0: 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25   success, read %
c5b0: 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69  lu bytes", (unsi
c5c0: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29  gned long) size)
c5d0: 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a 65 29  ;...return(size)
c5e0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
c5f0: 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a 65  SIS. *     ssize
c600: 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  _t cackey_read_b
c610: 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63  uffer(struct cac
c620: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
c630: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
c640: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
c650: 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  unt, unsigned ch
c660: 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f  ar t_or_v, size_
c670: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
c680: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
c690: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
c6a0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
c6b0: 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c  ot. *         Sl
c6c0: 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61  ot to send comma
c6d0: 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20  nds to. *. *    
c6e0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c6f0: 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20  buffer. *       
c700: 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20    [OUT] Buffer. 
c710: 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20  *. *     size_t 
c720: 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20 20 20  count. *        
c730: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
c740: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 72   to attempt to r
c750: 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  ead. *. *     un
c760: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
c770: 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20 53 65  _v. *         Se
c780: 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66 66 65  lect the T-buffe
c790: 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75 66 66  r (01) or V-buff
c7a0: 65 72 20 28 30 32 29 20 74 6f 20 72 65 61 64 20  er (02) to read 
c7b0: 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20 20 20  from.  . *. *   
c7c0: 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c    size_t initial
c7d0: 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20 20 20  _offset. *      
c7e0: 20 20 20 53 70 65 63 69 66 79 20 74 68 65 20 6f     Specify the o
c7f0: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 74  ffset to begin t
c800: 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20 2a 0a  he read from. *.
c810: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
c820: 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  UE. *     This f
c830: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
c840: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
c850: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
c860: 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f  d, or -1 on erro
c870: 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  r.. *. * NOTES. 
c880: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
c890: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
c8a0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
c8b0: 66 65 72 28 73 74 72 75 63 74 20 63 61 63 6b 65  fer(struct cacke
c8c0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
c8d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
c8e0: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
c8f0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
c900: 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20   t_or_v, size_t 
c910: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 20  initial_offset) 
c920: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
c930: 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b 0a 09   *init_buffer;..
c940: 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f 75 6e  size_t init_coun
c950: 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  t;..size_t init_
c960: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a  initial_offset;.
c970: 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 20  ..size_t offset 
c980: 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65 74 2c  = 0, max_offset,
c990: 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73   max_count;..uns
c9a0: 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 32  igned char cmd[2
c9b0: 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73  ];..uint16_t res
c9c0: 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64  pcode;..int send
c9d0: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
c9e0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
c9f0: 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62  led.");...init_b
ca00: 75 66 66 65 72 20 3d 20 62 75 66 66 65 72 3b 0a  uffer = buffer;.
ca10: 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20 63 6f  .init_count = co
ca20: 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69 74 69  unt;..init_initi
ca30: 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e 69 74  al_offset = init
ca40: 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 6d 61  ial_offset;...ma
ca50: 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75 6e 74  x_offset = count
ca60: 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 43  ;..max_count = C
ca70: 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a  ACKEY_APDU_MTU;.
ca80: 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21 3d 20  ..if (t_or_v != 
ca90: 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d 20 32  1 && t_or_v != 2
caa0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
cab0: 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
cac0: 69 64 20 54 20 6f 72 20 56 20 70 61 72 61 6d 65  id T or V parame
cad0: 74 65 72 20 73 70 65 63 69 66 69 65 64 2c 20 72  ter specified, r
cae0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
caf0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
cb00: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30  (-1);..}...cmd[0
cb10: 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68  ] = t_or_v;...wh
cb20: 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66 20 28  ile (1) {...if (
cb30: 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f 6f 66  offset >= max_of
cb40: 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  fset) {....CACKE
cb50: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cb60: 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c  Buffer too small
cb70: 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68 61 74  , returning what
cb80: 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09   we got...");...
cb90: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
cba0: 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66 66 73  count = max_offs
cbb0: 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09 09 69  et - offset;...i
cbc0: 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78 5f 63  f (count > max_c
cbd0: 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75 6e 74  ount) {....count
cbe0: 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 09   = max_count;...
cbf0: 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20 63 6f  }....cmd[1] = co
cc00: 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74  unt;....send_ret
cc10: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
cc20: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
cc30: 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41  CLASS_GLOBAL_PLA
cc40: 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53  TFORM, GSCIS_INS
cc50: 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 2c 20  TR_READ_BUFFER, 
cc60: 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  ((initial_offset
cc70: 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20 38 29   + offset) >> 8)
cc80: 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74 69 61   & 0xff, (initia
cc90: 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73 65  l_offset + offse
cca0: 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a 65 6f  t) & 0xff, sizeo
ccb0: 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30 78 30  f(cmd), cmd, 0x0
ccc0: 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 62 75  0, &respcode, bu
ccd0: 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c 20 26  ffer + offset, &
cce0: 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20 28 73  count);....if (s
ccf0: 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  end_ret == CACKE
cd00: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 20  Y_PCSC_E_RETRY) 
cd10: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
cd20: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
cd30: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72  ending failed, r
cd40: 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75 66  etrying read buf
cd50: 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  fer");.....retur
cd60: 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75  n(cackey_read_bu
cd70: 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69 74 5f  ffer(slot, init_
cd80: 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63 6f 75  buffer, init_cou
cd90: 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e 69 74  nt, t_or_v, init
cda0: 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 29  _initial_offset)
cdb0: 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 65  );...}....if (se
cdc0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
cdd0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
cde0: 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d  .if (respcode ==
cdf0: 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09 09 69   0x6A86) {.....i
ce00: 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d 3d 20  f (max_count == 
ce10: 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b  1) {......break;
ce20: 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61 78 5f  .....}......max_
ce30: 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e  count = max_coun
ce40: 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f 6e 74  t / 2;......cont
ce50: 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43  inue;....}.....C
ce60: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
ce70: 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f  TF("cackey_send_
ce80: 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72  apdu() failed, r
ce90: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
cea0: 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ure");.....retur
ceb0: 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66  n(-1);...}....of
cec0: 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a  fset += count;..
ced0: 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 6d 61  ..if (count < ma
cee0: 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  x_count) {....CA
cef0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cf00: 46 28 22 53 68 6f 72 74 20 72 65 61 64 20 2d 2d  F("Short read --
cf10: 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63 6d 64   count = %i, cmd
cf20: 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e 74 29  [1] = %i", (int)
cf30: 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 6d   count, (int) cm
cf40: 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65 61 6b  d[1]);.....break
cf50: 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66  ;...}..}..#ifdef
cf60: 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
cf70: 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
cf80: 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
cf90: 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49 58 5f  offset > _POSIX_
cfa0: 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
cfb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
cfc0: 54 46 28 22 4f 66 66 73 65 74 20 65 78 63 65 65  TF("Offset excee
cfd0: 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65  ds maximum value
cfe0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
cff0: 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25  ailure. (max = %
d000: 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25 6c 75  li, offset = %lu
d010: 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49  )", (long) _POSI
d020: 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e  X_SSIZE_MAX, (un
d030: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66  signed long) off
d040: 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  set);....return(
d050: 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66  -1);..}.#  endif
d060: 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59  .#endif...CACKEY
d070: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
d080: 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
d090: 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79  ess, read %lu by
d0a0: 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  tes", (unsigned 
d0b0: 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a  long) offset);..
d0c0: 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74 29 3b  .return(offset);
d0d0: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
d0e0: 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  IS. *     cackey
d0f0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65  _ret cackey_sele
d100: 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74  ct_applet(struct
d110: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
d120: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
d130: 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61  r *aid, size_t a
d140: 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41  id_len);. *. * A
d150: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
d160: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
d170: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
d180: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
d190: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
d1a0: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
d1b0: 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20 20 20  char *aid. *    
d1c0: 20 20 20 20 20 42 75 66 66 65 72 20 63 6f 6e 74       Buffer cont
d1d0: 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20 49 44  aining Applet ID
d1e0: 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a   to select. *. *
d1f0: 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69 64 5f       size_t aid_
d200: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 4e  len. *         N
d210: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
d220: 6e 20 74 68 65 20 22 61 69 64 22 20 28 41 70 70  n the "aid" (App
d230: 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65 74 65  let ID) paramete
d240: 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  r. *. * RETURN V
d250: 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b  ALUE. *     CACK
d260: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20  EY_PCSC_S_OK    
d270: 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a       On success.
d280: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
d290: 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20  SC_E_GENERIC    
d2a0: 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e  On error. *. * N
d2b0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  OTES. *     None
d2c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
d2d0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
d2e0: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
d2f0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
d300: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
d310: 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a  d char *aid, siz
d320: 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b 0a 09  e_t aid_len) {..
d330: 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09  int send_ret;...
d340: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d350: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
d360: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d370: 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63 74 69  RINTBUF("Selecti
d380: 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61 69 64  ng applet:", aid
d390: 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65  , aid_len);...se
d3a0: 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
d3b0: 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
d3c0: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
d3d0: 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54 52  816, GSCIS_INSTR
d3e0: 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53 5f 50  _SELECT, GSCIS_P
d3f0: 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50 50 4c  ARAM_SELECT_APPL
d400: 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f 6c 65  ET, 0x00, aid_le
d410: 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20 4e 55  n, aid, 0x00, NU
d420: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
d430: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
d440: 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
d450: 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41 43 4b  _RETRY) {...CACK
d460: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d470: 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61  "ADPU Sending fa
d480: 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67 20 73  iled, retrying s
d490: 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29 3b 0a  elect applet");.
d4a0: 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65 79  ...return(cackey
d4b0: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
d4c0: 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65  lot, aid, aid_le
d4d0: 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65  n));..}...if (se
d4e0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
d4f0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
d500: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d510: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f  NTF("Failed to o
d520: 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65 74 75  pen applet, retu
d530: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
d540: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
d550: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
d560: 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
d570: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d580: 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c  Successfully sel
d590: 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09  ected file");...
d5a0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
d5b0: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
d5c0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
d5d0: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
d5e0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
d5f0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
d600: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31  lot *slot, uint1
d610: 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a 20 41  6_t ef);. *. * A
d620: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
d630: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
d640: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
d650: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
d660: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
d670: 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f 74 20   *     uint16_t 
d680: 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20 45 6c  ef. *         El
d690: 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74 6f 20  emental File to 
d6a0: 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52 45 54  select. *. * RET
d6b0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
d6c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
d6d0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
d6e0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
d6f0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
d700: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
d710: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
d720: 20 54 68 69 73 20 73 65 6c 65 63 74 73 20 61 6e   This selects an
d730: 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69 6c 65   Elementary File
d740: 20 28 45 46 29 20 75 6e 64 65 72 20 74 68 65 20   (EF) under the 
d750: 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65 63 74  currently select
d760: 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69 63 61  ed. *     Dedica
d770: 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a 20 2a  ted File (DF). *
d780: 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61 6c 6c  . *     Typicall
d790: 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  y this is called
d7a0: 20 61 66 74 65 72 20 73 65 6c 65 63 74 69 6e 67   after selecting
d7b0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 41 70 70   the correct App
d7c0: 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20 20 20  let (using. *   
d7d0: 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f    cackey_select_
d7e0: 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d 20 63  applet) for VM c
d7f0: 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74  ards. *. */.stat
d800: 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
d810: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
d820: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
d830: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e 74 31  lot *slot, uint1
d840: 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73 69 67  6_t ef) {..unsig
d850: 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62 75 66  ned char fid_buf
d860: 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72  [2];..int send_r
d870: 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  et;...CACKEY_DEB
d880: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
d890: 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20  d.");.../* Open 
d8a0: 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79 20 66  the elementary f
d8b0: 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75 66 5b  ile */..fid_buf[
d8c0: 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29 20 26  0] = (ef >> 8) &
d8d0: 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75 66 5b   0xff;..fid_buf[
d8e0: 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66 3b 0a  1] = ef & 0xff;.
d8f0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d900: 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67  RINTF("Selecting
d910: 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c 20 28   file: %04lx", (
d920: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 65  unsigned long) e
d930: 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d  f);...send_ret =
d940: 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64   cackey_send_apd
d950: 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c  u(slot, GSCIS_CL
d960: 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43  ASS_ISO7816, GSC
d970: 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c  IS_INSTR_SELECT,
d980: 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73 69 7a   0x02, 0x0C, siz
d990: 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20 66 69  eof(fid_buf), fi
d9a0: 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e 55 4c  d_buf, 0x00, NUL
d9b0: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
d9c0: 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d  .if (send_ret !=
d9d0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
d9e0: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
d9f0: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c  BUG_PRINTF("Fail
da00: 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 2c  ed to open file,
da10: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
da20: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
da30: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
da40: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
da50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
da60: 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c  NTF("Successfull
da70: 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22  y selected file"
da80: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
da90: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
daa0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
dab0: 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63  . *     void cac
dac0: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72  key_free_tlv(str
dad0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
dae0: 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a  ntity *root);. *
daf0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
db00: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
db10: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72  ey_tlv_entity *r
db20: 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 52  oot. *         R
db30: 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56 20 6c  oot of the TLV l
db40: 69 73 74 20 74 6f 20 73 74 61 72 74 20 66 72 65  ist to start fre
db50: 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54 55 52  eing. *. * RETUR
db60: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e  N VALUE. *     N
db70: 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  one. *. * NOTES.
db80: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
db90: 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65 20 54  tion frees the T
dba0: 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74 65 64  LV linked listed
dbb0: 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 0a 20   returned from. 
dbc0: 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f 72 65  *     "cackey_re
dbd0: 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73  ad_tlv". *. */.s
dbe0: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
dbf0: 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63  y_free_tlv(struc
dc00: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
dc10: 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09 73 74  ity *root) {..st
dc20: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
dc30: 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20 2a 6e  entity *curr, *n
dc40: 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f 74 20  ext;...if (root 
dc50: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
dc60: 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 63  urn;..}...for (c
dc70: 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75 72 72  urr = root; curr
dc80: 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29 20 7b  ; curr = next) {
dc90: 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72 2d 3e  ...next = curr->
dca0: 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74 63 68  _next;....switch
dcb0: 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b 0a 09   (curr->tag) {..
dcc0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
dcd0: 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 63  _ACR_TABLE:....c
dce0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ase GSCIS_TAG_CE
dcf0: 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 69  RTIFICATE:.....i
dd00: 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 20  f (curr->value) 
dd10: 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
dd20: 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a  ->value);.....}.
dd30: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
dd40: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
dd50: 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28 63 75  DURL:.....if (cu
dd60: 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
dd70: 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  l) {......free(c
dd80: 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
dd90: 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62  rl);.....}.....b
dda0: 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66 72 65  reak;...}....fre
ddb0: 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09 72 65  e(curr);..}...re
ddc0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  turn;.}../*. * S
ddd0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
dde0: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
ddf0: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
de00: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
de10: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
de20: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
de30: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
de40: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74   struct cackey_t
de50: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  lv_entity *cacke
de60: 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72 75 63  y_read_tlv(struc
de70: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
de80: 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  lot) {..struct c
de90: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
dea0: 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c 20 2a   *curr_entity, *
deb0: 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61  root = NULL, *la
dec0: 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69  st = NULL;..unsi
ded0: 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e 5f 62  gned char tlen_b
dee0: 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75 66 5b  uf[2], tval_buf[
def0: 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75  1024], *tval;..u
df00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76 6c 65  nsigned char vle
df10: 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c 5f 62  n_buf[2], vval_b
df20: 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61 6c 3b  uf[8192], *vval;
df30: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
df40: 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69 67 6e  *tmpbuf;..unsign
df50: 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66 6c 65  ed long tmpbufle
df60: 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c 65 6e  n;..ssize_t tlen
df70: 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74  , vlen;..ssize_t
df80: 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a 65   read_ret;..size
df90: 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20 30 2c  _t offset_t = 0,
dfa0: 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b 0a 09   offset_v = 0;..
dfb0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61  unsigned char ta
dfc0: 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 67 74  g;..size_t lengt
dfd0: 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c  h;.#ifdef HAVE_L
dfe0: 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d 70 72  IBZ..int uncompr
dff0: 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a  ess_ret;.#endif.
e000: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e010: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
e020: 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63  ;...read_ret = c
e030: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
e040: 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62 75 66  r(slot, tlen_buf
e050: 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75  , sizeof(tlen_bu
e060: 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29  f), 1, offset_t)
e070: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
e080: 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f 62  != sizeof(tlen_b
e090: 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  uf)) {...CACKEY_
e0a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e0b0: 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  ad failed, retur
e0c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
e0d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
e0e0: 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20  L);..}...tlen = 
e0f0: 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20  (tlen_buf[1] << 
e100: 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b 30 5d  8) | tlen_buf[0]
e110: 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20 63  ;...read_ret = c
e120: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
e130: 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62 75 66  r(slot, vlen_buf
e140: 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75  , sizeof(vlen_bu
e150: 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29  f), 2, offset_v)
e160: 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74 20  ;..if (read_ret 
e170: 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f 62  != sizeof(vlen_b
e180: 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  uf)) {...CACKEY_
e190: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
e1a0: 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  ad failed, retur
e1b0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
e1c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
e1d0: 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20  L);..}...vlen = 
e1e0: 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20  (vlen_buf[1] << 
e1f0: 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b 30 5d  8) | vlen_buf[0]
e200: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
e210: 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c 65 6e  _PRINTF("Tag Len
e220: 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c 75 65  gth = %lu, Value
e230: 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20   Length = %lu", 
e240: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
e250: 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20  tlen, (unsigned 
e260: 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f  long) vlen);...o
e270: 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f  ffset_t += 2;..o
e280: 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09  ffset_v += 2;...
e290: 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a 65 6f  if (tlen > sizeo
e2a0: 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09  f(tval_buf)) {..
e2b0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
e2c0: 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67 74 68  INTF("Tag length
e2d0: 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72   is too large, r
e2e0: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
e2f0: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
e300: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
e310: 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 76  (vlen > sizeof(v
e320: 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  val_buf)) {...CA
e330: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e340: 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74 68 20  F("Value length 
e350: 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65  is too large, re
e360: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e370: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e380: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64  NULL);..}...read
e390: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ret = cackey_re
e3a0: 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20  ad_buffer(slot, 
e3b0: 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e 2c 20  tval_buf, tlen, 
e3c0: 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69  1, offset_t);..i
e3d0: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 74  f (read_ret != t
e3e0: 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  len) {...CACKEY_
e3f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
e400: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74  able to read ent
e410: 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20 72 65  ire T-buffer, re
e420: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e430: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e440: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65 61 64  NULL);..}...read
e450: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ret = cackey_re
e460: 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20  ad_buffer(slot, 
e470: 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e 2c 20  vval_buf, vlen, 
e480: 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69  2, offset_v);..i
e490: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 76  f (read_ret != v
e4a0: 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  len) {...CACKEY_
e4b0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
e4c0: 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65 6e 74  able to read ent
e4d0: 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20 72 65  ire V-buffer, re
e4e0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
e4f0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
e500: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c  NULL);..}...tval
e510: 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09 76 76   = tval_buf;..vv
e520: 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b 0a 09  al = vval_buf;..
e530: 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20 30 20  while (tlen > 0 
e540: 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b 0a 09  && vlen > 0) {..
e550: 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a 09 09  .tag = *tval;...
e560: 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d  tval++;...tlen--
e570: 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c 20 3d  ;....if (*tval =
e580: 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c 65 6e  = 0xff) {....len
e590: 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d 20 3c  gth = (tval[2] <
e5a0: 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a  < 8) | tval[1];.
e5b0: 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a 09 09  ...tval += 3;...
e5c0: 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20  .tlen -= 3;...} 
e5d0: 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67 74 68  else {....length
e5e0: 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74 76 61   = *tval;....tva
e5f0: 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a  l++;....tlen--;.
e600: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
e610: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 3a  BUG_PRINTF("Tag:
e620: 20 25 73 20 28 25 30 32 78 29 22 2c 20 43 41 43   %s (%02x)", CAC
e630: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54  KEY_DEBUG_FUNC_T
e640: 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29 2c 20  AG_TO_STR(tag), 
e650: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74  (unsigned int) t
e660: 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f 44 45  ag);...CACKEY_DE
e670: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 61  BUG_PRINTBUF("Va
e680: 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c 65 6e  lue:", vval, len
e690: 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f 65 6e  gth);....curr_en
e6a0: 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73  tity = NULL;...s
e6b0: 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a 09 09  witch (tag) {...
e6c0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
e6d0: 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63 75 72  CARDURL:.....cur
e6e0: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
e6f0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
e700: 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63 75 72  ntity));.....cur
e710: 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f  r_entity->value_
e720: 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63  cardurl = malloc
e730: 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e  (sizeof(*curr_en
e740: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
e750: 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65 6d 63  url));......memc
e760: 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  py(curr_entity->
e770: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72  value_cardurl->r
e780: 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a 09 09  id, vval, 5);...
e790: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
e7a0: 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
e7b0: 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35 5d 3b  ptype = vval[5];
e7c0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
e7d0: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
e7e0: 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76 76 61  >objectid = (vva
e7f0: 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61  l[6] << 8) | vva
e800: 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[7];.....curr_e
e810: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
e820: 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20 28 76  durl->appid = (v
e830: 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c 20 76  val[8] << 8) | v
e840: 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63 75 72  val[9];......cur
e850: 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20  r_entity->tag = 
e860: 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  tag;.....curr_en
e870: 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55  tity->_next = NU
e880: 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  LL;......break;.
e890: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
e8a0: 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09  G_ACR_TABLE:....
e8b0: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
e8c0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
e8d0: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  rr_entity));....
e8e0: 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  .tmpbuf = malloc
e8f0: 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 6d  (length);......m
e900: 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76  emcpy(tmpbuf, vv
e910: 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09  al, length);....
e920: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
e930: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
e940: 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74  rr_entity->lengt
e950: 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  h = length;.....
e960: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c  curr_entity->val
e970: 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09  ue = tmpbuf;....
e980: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e  .curr_entity->_n
e990: 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  ext = NULL;.....
e9a0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
e9b0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
e9c0: 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72 72 5f  ICATE:.....curr_
e9d0: 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28  entity = malloc(
e9e0: 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74  sizeof(*curr_ent
e9f0: 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66 20 48  ity));..#ifdef H
ea00: 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74 6d 70  AVE_LIBZ.....tmp
ea10: 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 20  buflen = length 
ea20: 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75 66 20  * 2;.....tmpbuf 
ea30: 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c  = malloc(tmpbufl
ea40: 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f 6d 70  en);......uncomp
ea50: 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63 6f 6d  ress_ret = uncom
ea60: 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20 26 74  press(tmpbuf, &t
ea70: 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c 2c 20  mpbuflen, vval, 
ea80: 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69 66 20  length);.....if 
ea90: 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20  (uncompress_ret 
eaa0: 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09 09 09  != Z_OK) {......
eab0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
eac0: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 64  NTF("Failed to d
ead0: 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63 6f 6d  ecompress, uncom
eae0: 70 72 65 73 73 28 29 20 72 65 74 75 72 6e 65 64  press() returned
eaf0: 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69 6e 67   %i -- resorting
eb00: 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70 79 22   to direct copy"
eb10: 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  , uncompress_ret
eb20: 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75 66 6c  );.......tmpbufl
eb30: 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09  en = length;....
eb40: 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c  ..memcpy(tmpbuf,
eb50: 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a   vval, length);.
eb60: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
eb70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
eb80: 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64 20 74  ("Decompressed t
eb90: 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70  o:", tmpbuf, tmp
eba0: 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65 0a 09  buflen);.#else..
ebb0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ebc0: 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e 67 20  PRINTF("Missing 
ebd0: 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20 74 68  ZLIB Support, th
ebe0: 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69  is certificate i
ebf0: 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65 73 73  s likely useless
ec00: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d 70 62  ...");......tmpb
ec10: 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a  uflen = length;.
ec20: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
ec30: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
ec40: 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09 63 75  ;.#endif......cu
ec50: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
ec60: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
ec70: 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20  ntity->length = 
ec80: 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09 09 63  tmpbuflen;.....c
ec90: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
eca0: 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09 09 09  e = tmpbuf;.....
ecb0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65  curr_entity->_ne
ecc0: 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09  xt = NULL;......
ecd0: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
ece0: 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 3a  SCIS_TAG_PKCS15:
ecf0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
ed00: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
ed10: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b  (*curr_entity));
ed20: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
ed30: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
ed40: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
ed50: 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76 61 6c  alue_byte = vval
ed60: 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  [0];.....curr_en
ed70: 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55  tity->_next = NU
ed80: 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  LL;......break;.
ed90: 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d 20 6c  ..}....vval += l
eda0: 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d  ength;...vlen -=
edb0: 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66 20 28   length;....if (
edc0: 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d 20 4e  curr_entity != N
edd0: 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28 72 6f  ULL) {....if (ro
ede0: 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ot == NULL) {...
edf0: 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f 65 6e  ..root = curr_en
ee00: 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  tity;....}.....i
ee10: 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c 4c 29  f (last != NULL)
ee20: 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f 6e 65   {.....last->_ne
ee30: 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79  xt = curr_entity
ee40: 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73 74 20  ;....}.....last 
ee50: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
ee60: 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72  .}..}...return(r
ee70: 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  oot);.}../*. * S
ee80: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
ee90: 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
eea0: 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
eeb0: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
eec0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
eed0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
eee0: 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
eef0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
ef00: 65 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63  e_certs(struct c
ef10: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
ef20: 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65  ity *start, size
ef30: 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20 66 72  _t count, int fr
ef40: 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73 69 7a  ee_start) {..siz
ef50: 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73  e_t idx;...if (s
ef60: 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tart == NULL) {.
ef70: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
ef80: 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
ef90: 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29   < count; idx++)
efa0: 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74 5b 69   {...if (start[i
efb0: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29  dx].certificate)
efc0: 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61 72 74   {....free(start
efd0: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
efe0: 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  e);...}..}...if 
eff0: 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09  (free_start) {..
f000: 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a 09 7d  .free(start);..}
f010: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74  ...return;.}..st
f020: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
f030: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
f040: 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65   *cackey_copy_ce
f050: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
f060: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
f070: 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20 63 61  *dest, struct ca
f080: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
f090: 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f  ty *start, size_
f0a0: 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69 7a 65  t count) {..size
f0b0: 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28 73 74  _t idx;...if (st
f0c0: 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  art == NULL) {..
f0d0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
f0e0: 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d 3d 20  }...if (dest == 
f0f0: 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74 20 3d  NULL) {...dest =
f100: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
f110: 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29 3b 0a  dest) * count);.
f120: 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
f130: 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20  0; idx < count; 
f140: 69 64 78 2b 2b 29 20 7b 0a 09 09 73 77 69 74 63  idx++) {...switc
f150: 68 20 28 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f  h (dest[idx].id_
f160: 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
f170: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
f180: 41 43 3a 0a 09 09 09 09 6d 65 6d 63 70 79 28 64  AC:.....memcpy(d
f190: 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61  est[idx].card.ca
f1a0: 63 2e 61 70 70 6c 65 74 2c 20 73 74 61 72 74 5b  c.applet, start[
f1b0: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70  idx].card.cac.ap
f1c0: 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 64 65 73  plet, sizeof(des
f1d0: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e  t[idx].card.cac.
f1e0: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 64 65  applet));.....de
f1f0: 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63  st[idx].card.cac
f200: 2e 66 69 6c 65 20 3d 20 73 74 61 72 74 5b 69 64  .file = start[id
f210: 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65  x].card.cac.file
f220: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
f230: 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
f240: 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 64 65 73  YPE_PIV:.....des
f250: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e  t[idx].card.piv.
f260: 6b 65 79 5f 69 64 20 3d 20 73 74 61 72 74 5b 69  key_id = start[i
f270: 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79  dx].card.piv.key
f280: 5f 69 64 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  _id;.....break;.
f290: 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
f2a0: 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
f2b0: 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
f2c0: 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65 72  ...dest[idx].cer
f2d0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73  tificate_len = s
f2e0: 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  tart[idx].certif
f2f0: 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73  icate_len;...des
f300: 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d  t[idx].keysize =
f310: 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73   start[idx].keys
f320: 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78  ize;....dest[idx
f330: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ].certificate = 
f340: 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d  malloc(dest[idx]
f350: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
f360: 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73 74  );...memcpy(dest
f370: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
f380: 65 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65  e, start[idx].ce
f390: 72 74 69 66 69 63 61 74 65 2c 20 64 65 73 74 5b  rtificate, dest[
f3a0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
f3b0: 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  _len);..}...retu
f3c0: 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  rn(dest);.}../*.
f3d0: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
f3e0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
f3f0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
f400: 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
f410: 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
f420: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
f430: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
f440: 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b  atic struct cack
f450: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
f460: 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65   *cackey_read_ce
f470: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
f480: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74  y_slot *slot, st
f490: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
f4a0: 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74 73  _identity *certs
f4b0: 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
f4c0: 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63  *count) {..struc
f4d0: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
f4e0: 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
f4f0: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
f500: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f  tlv_entity *ccc_
f510: 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20  tlv, *ccc_curr, 
f520: 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63  *app_tlv, *app_c
f530: 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  urr;..unsigned c
f540: 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20  har ccc_aid[] = 
f550: 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d 2c  {GSCIS_AID_CCC},
f560: 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49   piv_aid[] = {NI
f570: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49 56  STSP800_73_3_PIV
f580: 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 64  _AID};..unsigned
f590: 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20   char *piv_oid, 
f5a0: 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b  piv_oid_pivauth[
f5b0: 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f 37  ] = {NISTSP800_7
f5c0: 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d  3_3_OID_PIVAUTH}
f5d0: 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74  , piv_oid_signat
f5e0: 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  ure[] = {NISTSP8
f5f0: 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e  00_73_3_OID_SIGN
f600: 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f  ATURE}, piv_oid_
f610: 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54  keymgt[] = {NIST
f620: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b  SP800_73_3_OID_K
f630: 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65  EYMGT};..unsigne
f640: 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64 5b  d char curr_aid[
f650: 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  7];..unsigned ch
f660: 61 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d 3b  ar buffer[8192];
f670: 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
f680: 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 61 63  outidx = 0;..cac
f690: 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74  key_ret transact
f6a0: 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65 5f  ion_ret;..ssize_
f6b0: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74  t read_ret;..int
f6c0: 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65   certs_resizable
f6d0: 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 2c  ;..int send_ret,
f6e0: 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69 6e   select_ret;..in
f6f0: 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20 3d  t piv_key, piv =
f700: 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09   0;..int idx;...
f710: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f720: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
f730: 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20 4e  ..if (count == N
f740: 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
f750: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 6f  DEBUG_PRINTF("co
f760: 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65 74  unt is NULL, ret
f770: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
f780: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
f790: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ULL);..}...if (c
f7a0: 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  erts != NULL) {.
f7b0: 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d 20  ..if (*count == 
f7c0: 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
f7d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
f7e0: 75 65 73 74 65 64 20 77 65 20 72 65 74 75 72 6e  uested we return
f7f0: 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f 72   0 objects, shor
f800: 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09 09  t-circuit");....
f810: 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a  .return(certs);.
f820: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 73 6c  ..}..}...if (!sl
f830: 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ot->slot_reset) 
f840: 7b 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61  {...if (slot->ca
f850: 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09  ched_certs) {...
f860: 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55  .if (certs == NU
f870: 4c 4c 29 20 7b 0a 09 09 09 09 63 65 72 74 73 20  LL) {.....certs 
f880: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
f890: 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f 74 2d 3e  *certs) * slot->
f8a0: 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
f8b0: 6e 74 29 3b 0a 09 09 09 09 2a 63 6f 75 6e 74 20  nt);.....*count 
f8c0: 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  = slot->cached_c
f8d0: 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09  erts_count;.....
f8e0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20  } else {.....if 
f8f0: 28 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d 3e  (*count > slot->
f900: 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
f910: 6e 74 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75 6e  nt) {......*coun
f920: 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64  t = slot->cached
f930: 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09 09  _certs_count;...
f940: 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
f950: 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 63  key_copy_certs(c
f960: 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68  erts, slot->cach
f970: 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74  ed_certs, *count
f980: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65  );.....return(ce
f990: 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  rts);...}..}...i
f9a0: 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f  f (slot->cached_
f9b0: 63 65 72 74 73 29 20 7b 0a 09 09 63 61 63 6b 65  certs) {...cacke
f9c0: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 6c 6f  y_free_certs(slo
f9d0: 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 2c  t->cached_certs,
f9e0: 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65   slot->cached_ce
f9f0: 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a  rts_count, 1);..
fa00: 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  ..slot->cached_c
fa10: 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  erts = NULL;..}.
fa20: 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d 61  ../* Begin a Sma
fa30: 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74 69  rtCard transacti
fa40: 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74 69  on */..transacti
fa50: 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  on_ret = cackey_
fa60: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
fa70: 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74 72  n(slot);..if (tr
fa80: 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21 3d  ansaction_ret !=
fa90: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
faa0: 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
fab0: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
fac0: 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63  le begin transac
fad0: 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67 20  tion, returning 
fae0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
faf0: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09  .return(NULL);..
fb00: 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d 3d  }...if (certs ==
fb10: 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74 73   NULL) {...certs
fb20: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
fb30: 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a 09  (*certs) * 5);..
fb40: 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09 63  .*count = 5;...c
fb50: 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d  erts_resizable =
fb60: 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   1;..} else {...
fb70: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
fb80: 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c  = 0;..}.../* Sel
fb90: 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70 6c  ect the CCC Appl
fba0: 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20  et */..send_ret 
fbb0: 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  = cackey_select_
fbc0: 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63 63  applet(slot, ccc
fbd0: 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63  _aid, sizeof(ccc
fbe0: 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65 6e  _aid));..if (sen
fbf0: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
fc00: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 2f  PCSC_S_OK) {.../
fc10: 2a 20 54 72 79 20 50 49 56 20 61 70 70 6c 69 63  * Try PIV applic
fc20: 61 74 69 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64 5f  ation */...send_
fc30: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
fc40: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
fc50: 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f 66   piv_aid, sizeof
fc60: 28 70 69 76 5f 61 69 64 29 29 3b 0a 09 09 69 66  (piv_aid));...if
fc70: 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41   (send_ret == CA
fc80: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
fc90: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
fca0: 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61 76  G_PRINTF("We hav
fcb0: 65 20 61 20 50 49 56 20 63 61 72 64 20 2d 2d 20  e a PIV card -- 
fcc0: 6e 6f 74 20 75 73 69 6e 67 20 74 68 65 20 43 43  not using the CC
fcd0: 43 2c 20 70 75 6c 6c 69 6e 67 20 70 72 65 2d 73  C, pulling pre-s
fce0: 65 6c 65 63 74 65 64 20 6b 65 79 73 22 29 3b 0a  elected keys");.
fcf0: 0a 09 09 09 70 69 76 20 3d 20 31 3b 0a 09 09 7d  ....piv = 1;...}
fd00: 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
fd10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
fd20: 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65 63 74  Unable to select
fd30: 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72 65 74   CCC Applet, ret
fd40: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
fd50: 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 54 65 72 6d  e");...../* Term
fd60: 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64 20  inate SmartCard 
fd70: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
fd80: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
fd90: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
fda0: 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
fdb0: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 70  ;...}..}...if (p
fdc0: 69 76 29 20 7b 0a 09 09 66 6f 72 20 28 69 64 78  iv) {...for (idx
fdd0: 20 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b 20 69   = 0; idx < 3; i
fde0: 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69 74 63  dx++) {....switc
fdf0: 68 20 28 69 64 78 29 20 7b 0a 09 09 09 09 63 61  h (idx) {.....ca
fe00: 73 65 20 30 3a 0a 09 09 09 09 09 70 69 76 5f 6f  se 0:......piv_o
fe10: 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70 69 76  id = piv_oid_piv
fe20: 61 75 74 68 3b 0a 09 09 09 09 09 70 69 76 5f 6b  auth;......piv_k
fe30: 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37  ey = NISTSP800_7
fe40: 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54 48 3b  8_3_KEY_PIVAUTH;
fe50: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
fe60: 09 63 61 73 65 20 31 3a 0a 09 09 09 09 09 70 69  .case 1:......pi
fe70: 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f  v_oid = piv_oid_
fe80: 73 69 67 6e 61 74 75 72 65 3b 0a 09 09 09 09 09  signature;......
fe90: 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50  piv_key = NISTSP
fea0: 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47  800_78_3_KEY_SIG
feb0: 4e 41 54 55 52 45 3b 0a 09 09 09 09 09 62 72 65  NATURE;......bre
fec0: 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 32 3a 0a  ak;.....case 2:.
fed0: 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70  .....piv_oid = p
fee0: 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b 0a 09  iv_oid_keymgt;..
fef0: 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49  ....piv_key = NI
ff00: 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59  STSP800_78_3_KEY
ff10: 5f 4b 45 59 4d 47 54 3b 0a 09 09 09 09 09 62 72  _KEYMGT;......br
ff20: 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  eak;....}.....re
ff30: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
ff40: 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c 20 62  get_data(slot, b
ff50: 75 66 66 65 72 2c 20 73 69 7a 65 6f 66 28 62 75  uffer, sizeof(bu
ff60: 66 66 65 72 29 2c 20 70 69 76 5f 6f 69 64 29 3b  ffer), piv_oid);
ff70: 0a 0a 09 09 09 69 66 20 28 72 65 61 64 5f 72 65  .....if (read_re
ff80: 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09 63 6f  t <= 0) {.....co
ff90: 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
ffa0: 09 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74  .curr_id = &cert
ffb0: 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 6f 75  s[outidx];....ou
ffc0: 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 63 75 72 72  tidx++;.....curr
ffd0: 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d  _id->keysize = -
ffe0: 31 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 69  1;....curr_id->i
fff0: 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45 59 5f  d_type = CACKEY_
10000 49 44 5f 54 59 50 45 5f 50 49 56 3b 0a 09 09 09  ID_TYPE_PIV;....
10010 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 70 69  curr_id->card.pi
10020 76 2e 6b 65 79 5f 69 64 20 3d 20 70 69 76 5f 6b  v.key_id = piv_k
10030 65 79 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ey;.....curr_id-
10040 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
10050 20 3d 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09   = read_ret;....
10060 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10070 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75  cate = malloc(cu
10080 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
10090 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63  te_len);....memc
100a0 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  py(curr_id->cert
100b0 69 66 69 63 61 74 65 2c 20 62 75 66 66 65 72 20  ificate, buffer 
100c0 2b 20 34 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65  + 4, curr_id->ce
100d0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 2d 20  rtificate_len - 
100e0 34 29 3b 20 2f 2a 20 58 58 58 20 54 4f 44 4f 20  4); /* XXX TODO 
100f0 50 49 56 20 28 2d 34 20 68 65 61 64 65 72 2c 20  PIV (-4 header, 
10100 2d 35 20 74 72 61 69 6c 65 72 20 3d 3d 20 77 68  -5 trailer == wh
10110 79 20 3f 29 20 2a 2f 0a 09 09 09 63 75 72 72 5f  y ?) */....curr_
10120 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
10130 6c 65 6e 20 2d 3d 20 34 3b 0a 09 09 09 63 75 72  len -= 4;....cur
10140 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
10150 65 5f 6c 65 6e 20 2d 3d 20 35 3b 0a 09 09 7d 0a  e_len -= 5;...}.
10160 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52  .} else {.../* R
10170 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c  ead all the appl
10180 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43  ets from the CCC
10190 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f  's TLV */...ccc_
101a0 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
101b0 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
101c0 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44  /* Look for CARD
101d0 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73  URLs that coores
101e0 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c  pond to PKI appl
101f0 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63  ets */...for (cc
10200 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76  c_curr = ccc_tlv
10210 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f  ; ccc_curr; ccc_
10220 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d  curr = ccc_curr-
10230 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43  >_next) {....CAC
10240 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10250 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20  ("Found tag: %s 
10260 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45  ... ", CACKEY_DE
10270 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
10280 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61  STR(ccc_curr->ta
10290 67 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63  g));.....if (ccc
102a0 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53  _curr->tag != GS
102b0 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29  CIS_TAG_CARDURL)
102c0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
102d0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
102e0 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
102f0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
10300 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a  t CARDURLs)");..
10310 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10320 09 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f  .}.....if ((ccc_
10330 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10340 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43  url->apptype & C
10350 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
10360 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56  I) != CACKEY_TLV
10370 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09  _APP_PKI) {.....
10380 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10390 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
103a0 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
103b0 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
103c0 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
103d0 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
103e0 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
103f0 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
10400 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
10410 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10420 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
10430 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
10440 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10450 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
10460 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10470 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
10480 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
10490 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
104a0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
104b0 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
104c0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
104d0 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43  l->rid));....CAC
104e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
104f0 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34  ("AppID = %s/%04
10500 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  lx", CACKEY_DEBU
10510 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
10520 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
10530 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
10540 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
10550 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
10560 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
10570 70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  pid);....CACKEY_
10580 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62  DEBUG_PRINTF("Ob
10590 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c  jectID = %s/%04l
105a0 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
105b0 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
105c0 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
105d0 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
105e0 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64  ctid), (unsigned
105f0 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d   long) ccc_curr-
10600 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10610 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d  objectid);.....m
10620 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20  emcpy(curr_aid, 
10630 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10640 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69  cardurl->rid, si
10650 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76  zeof(ccc_curr->v
10660 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
10670 64 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64  d));....curr_aid
10680 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
10690 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75  ) - 2] = (ccc_cu
106a0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
106b0 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26  l->appid >> 8) &
106c0 20 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61   0xff;....curr_a
106d0 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
106e0 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63  id) - 1] = ccc_c
106f0 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10700 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66  rl->appid & 0xff
10710 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
10720 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e  found applet ...
10730 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65   */....select_re
10740 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
10750 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
10760 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  urr_aid, sizeof(
10770 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69  curr_aid));....i
10780 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
10790 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
107a0 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
107b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
107c0 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61  iled to select a
107d0 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  pplet, skipping 
107e0 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
107f0 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
10800 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
10810 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20  ...../* ... and 
10820 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f  object (file) */
10830 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
10840 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
10850 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
10860 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10870 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
10880 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20  .if (select_ret 
10890 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
108a0 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
108b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
108c0 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74  Failed to select
108d0 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20   file, skipping 
108e0 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
108f0 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
10900 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
10910 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20  ...../* Process 
10920 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20  this file's TLV 
10930 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74  looking for cert
10940 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61  ificates */....a
10950 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  pp_tlv = cackey_
10960 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
10970 09 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75  .....for (app_cu
10980 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70  rr = app_tlv; ap
10990 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72  p_curr; app_curr
109a0 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65   = app_curr->_ne
109b0 78 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  xt) {.....CACKEY
109c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
109d0 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43  ound tag: %s", C
109e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
109f0 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f  _TAG_TO_STR(app_
10a00 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09  curr->tag));....
10a10 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74  .if (app_curr->t
10a20 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
10a30 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
10a40 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10a50 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
10a60 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
10a70 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
10a80 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a  ERTIFICATEs)");.
10a90 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
10aa0 09 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f  ....}......curr_
10ab0 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69  id = &certs[outi
10ac0 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b  dx];.....outidx+
10ad0 2b 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  +;......curr_id-
10ae0 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45  >id_type = CACKE
10af0 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09  Y_ID_TYPE_CAC;..
10b00 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
10b10 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
10b20 65 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  et, curr_aid, si
10b30 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61  zeof(curr_id->ca
10b40 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
10b50 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61  .....curr_id->ca
10b60 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 63 63  rd.cac.file = cc
10b70 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10b80 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b  rdurl->objectid;
10b90 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65  .....curr_id->ke
10ba0 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09  ysize = -1;.....
10bb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10bc0 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75  INTF("Filling cu
10bd0 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
10be0 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 68  applet (%p) with
10bf0 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75   %lu bytes:", cu
10c00 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
10c10 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65  applet, (unsigne
10c20 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63  d long) sizeof(c
10c30 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
10c40 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43  .applet));.....C
10c50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10c60 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72  TBUF("VAL:", cur
10c70 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
10c80 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75  pplet, sizeof(cu
10c90 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
10ca0 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63  applet));......c
10cb0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10cc0 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75  ate_len = app_cu
10cd0 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09  rr->length;.....
10ce0 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
10cf0 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63  icate = malloc(c
10d00 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10d10 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
10d20 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65  mcpy(curr_id->ce
10d30 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63  rtificate, app_c
10d40 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72  urr->value, curr
10d50 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10d60 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  _len);......if (
10d70 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74  outidx >= *count
10d80 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63 65 72  ) {......if (cer
10d90 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
10da0 09 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20  ......*count *= 
10db0 32 3b 0a 09 09 09 09 09 09 63 65 72 74 73 20 3d  2;.......certs =
10dc0 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
10dd0 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
10de0 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09   (*count));.....
10df0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
10e00 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09  break;......}...
10e10 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
10e20 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70  key_free_tlv(app
10e30 5f 74 6c 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f  _tlv);.....if (o
10e40 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
10e50 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
10e60 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  .}...}....cackey
10e70 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c  _free_tlv(ccc_tl
10e80 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20  v);..}...*count 
10e90 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28  = outidx;...if (
10ea0 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
10eb0 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61   {...certs = rea
10ec0 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
10ed0 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
10ee0 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  ount));..}...slo
10ef0 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20  t->cached_certs 
10f00 3d 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65  = cackey_copy_ce
10f10 72 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c  rts(NULL, certs,
10f20 20 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d   *count);..slot-
10f30 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
10f40 75 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09  unt = *count;...
10f50 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61  /* Terminate Sma
10f60 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtCard Transacti
10f70 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
10f80 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
10f90 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65  ot);...return(ce
10fa0 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  rts);.}../*. * S
10fb0 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
10fc0 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
10fd0 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
10fe0 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
10ff0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
11000 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
11010 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
11020 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
11030 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75  signdecrypt(stru
11040 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
11050 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
11060 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
11070 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
11080 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65   char *buf, size
11090 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67  _t buflen, unsig
110a0 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66  ned char *outbuf
110b0 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c  , size_t outbufl
110c0 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74  en, int padInput
110d0 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75  , int unpadOutpu
110e0 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73  t) {..cackey_pcs
110f0 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70  c_id_type id_typ
11100 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  e;..unsigned cha
11110 72 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  r dyn_auth_templ
11120 61 74 65 5b 31 30 5d 3b 0a 09 75 6e 73 69 67 6e  ate[10];..unsign
11130 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c  ed char *tmpbuf,
11140 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74   *tmpbuf_s, *out
11150 62 75 66 5f 73 3b 0a 09 75 6e 73 69 67 6e 65 64  buf_s;..unsigned
11160 20 63 68 61 72 20 62 79 74 65 73 5f 74 6f 5f 73   char bytes_to_s
11170 65 6e 64 2c 20 70 31 2c 20 63 6c 61 73 73 3b 0a  end, p1, class;.
11180 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
11190 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63 6b 65  locktype;..cacke
111a0 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74 3b 0a  y_ret send_ret;.
111b0 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f  .uint16_t respco
111c0 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 74  de;..ssize_t ret
111d0 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64 6f 66  val = 0, unpadof
111e0 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20 74 6d  fset;..size_t tm
111f0 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c  pbuflen, padlen,
11200 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
11210 69 6e 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20  int free_tmpbuf 
11220 3d 20 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09  = 0;..int le;...
11230 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
11240 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
11250 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55  ..if (slot == NU
11260 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
11270 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
11280 6f 72 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c  or.  slot is NUL
11290 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
112a0 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66  1);..}...if (buf
112b0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
112c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
112d0 46 28 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69  F("Error.  buf i
112e0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
112f0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
11300 20 28 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c   (outbuf == NULL
11310 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11320 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11330 2e 20 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c  .  outbuf is NUL
11340 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
11350 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65  1);..}...if (ide
11360 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
11370 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11380 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
11390 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c  identity is NULL
113a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31  ");....return(-1
113b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e  );..}...if (iden
113c0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
113d0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
113e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
113f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
11400 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
11410 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b  ntity is NULL");
11420 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
11430 09 7d 0a 0a 09 69 64 5f 74 79 70 65 20 3d 20 69  .}...id_type = i
11440 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
11450 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 3b  entity->id_type;
11460 0a 09 69 66 20 28 69 64 5f 74 79 70 65 20 3d 3d  ..if (id_type ==
11470 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
11480 43 45 52 54 5f 4f 4e 4c 59 29 20 7b 0a 09 09 43  CERT_ONLY) {...C
11490 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
114a0 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
114b0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
114c0 69 74 79 20 69 73 20 43 41 43 4b 45 59 5f 49 44  ity is CACKEY_ID
114d0 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 2c  _TYPE_CERT_ONLY,
114e0 20 77 68 69 63 68 20 63 61 6e 6e 6f 74 20 62 65   which cannot be
114f0 20 75 73 65 64 20 66 6f 72 20 73 69 67 6e 2f 64   used for sign/d
11500 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 72 65 74  ecrypt");....ret
11510 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 77  urn(-1);..}...sw
11520 69 74 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b  itch (id_type) {
11530 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
11540 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 63 61  D_TYPE_PIV:...ca
11550 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
11560 45 5f 43 41 43 3a 0a 09 09 09 62 72 65 61 6b 3b  E_CAC:....break;
11570 0a 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43  ...default:....C
11580 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11590 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
115a0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
115b0 69 74 79 20 69 73 20 6e 6f 74 20 61 20 73 75 70  ity is not a sup
115c0 70 6f 72 74 65 64 20 76 61 6c 75 65 2e 22 29 3b  ported value.");
115d0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
115e0 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
115f0 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79 20  ne identity Key 
11600 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64 65  size */..if (ide
11610 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
11620 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20  tity->keysize < 
11630 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d  0) {...identity-
11640 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
11650 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f 74  keysize = x509_t
11660 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74 69  o_keysize(identi
11670 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11680 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20  y->certificate, 
11690 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
116a0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
116b0 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  cate_len);..}...
116c0 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20 74  /* Pad message t
116d0 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69  o key size */..i
116e0 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a 09  f (padInput) {..
116f0 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70  .if (identity->p
11700 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
11710 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09  ysize > 0) {....
11720 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69 64  if (buflen != id
11730 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
11740 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20  ntity->keysize) 
11750 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e  {.....if (buflen
11760 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63   > (identity->pc
11770 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
11780 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09 09 09  size + 3)) {....
11790 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
117a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d  RINTF("Error.  M
117b0 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61  essage is too la
117c0 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63 72  rge to sign/decr
117d0 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65 74  ypt");.......ret
117e0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a  urn(-1);.....}..
117f0 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ....tmpbuflen = 
11800 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
11810 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
11820 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
11830 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29  alloc(tmpbuflen)
11840 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75  ;.....free_tmpbu
11850 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c  f = 1;......padl
11860 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d  en = tmpbuflen -
11870 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09   buflen - 3;....
11880 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31 20  ../* RSA PKCS#1 
11890 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20  EMSA-PKCS1-v1_5 
118a0 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74  Padding */.....t
118b0 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b  mpbuf[0] = 0x00;
118c0 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d  .....tmpbuf[1] =
118d0 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65   0x01;.....memse
118e0 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78  t(&tmpbuf[2], 0x
118f0 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09  FF, padlen);....
11900 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b  .tmpbuf[padlen +
11910 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d   2]= 0x00;.....m
11920 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70 61  emcpy(&tmpbuf[pa
11930 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20  dlen + 3], buf, 
11940 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41  buflen);......CA
11950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
11960 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c  BUF("Unpadded:",
11970 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09   buf, buflen);..
11980 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11990 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64  PRINTBUF("Padded
119a0 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62  :", tmpbuf, tmpb
119b0 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73  uflen);....} els
119c0 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  e {.....tmpbuf =
119d0 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75 66   buf;.....tmpbuf
119e0 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
119f0 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  ..free_tmpbuf = 
11a00 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20  0;.....padlen = 
11a10 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  0;....}...} else
11a20 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
11a30 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
11a40 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b  e to determine k
11a50 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20  ey size, hoping 
11a60 74 68 65 20 6d 65 73 73 61 67 65 20 69 73 20 70  the message is p
11a70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21 22  roperly padded!"
11a80 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d 20  );.....tmpbuf = 
11a90 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65  buf;....tmpbufle
11aa0 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66  n = buflen;....f
11ab0 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a  ree_tmpbuf = 0;.
11ac0 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09  ...padlen = 0;..
11ad0 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74  .}..} else {...t
11ae0 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 74  mpbuf = buf;...t
11af0 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
11b00 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75 66  n;...free_tmpbuf
11b10 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d   = 0;...padlen =
11b20 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69   0;..}.../* Begi
11b30 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  n transaction */
11b40 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  ..cackey_begin_t
11b50 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
11b60 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f  ;.../* Select co
11b70 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a  rrect applet */.
11b80 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65  .switch (id_type
11b90 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  ) {...case CACKE
11ba0 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09  Y_ID_TYPE_CAC:..
11bb0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11bc0 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67  RINTF("Selecting
11bd0 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74   applet found at
11be0 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69   %p ...", identi
11bf0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11c00 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  y->card.cac.appl
11c10 65 74 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  et);....cackey_s
11c20 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
11c30 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  t, identity->pcs
11c40 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
11c50 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a  .cac.applet, siz
11c60 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  eof(identity->pc
11c70 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72  sc_identity->car
11c80 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a  d.cac.applet));.
11c90 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f  ..../* Select co
11ca0 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 09  rrect file */...
11cb0 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66  .cackey_select_f
11cc0 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69  ile(slot, identi
11cd0 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11ce0 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65  y->card.cac.file
11cf0 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63  );....break;...c
11d00 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
11d10 50 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e 5f 61  PE_PIV:....dyn_a
11d20 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30 5d 20  uth_template[0] 
11d30 3d 20 30 78 37 43 3b 0a 09 09 09 64 79 6e 5f 61  = 0x7C;....dyn_a
11d40 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 5d 20  uth_template[1] 
11d50 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61  = 0x82;....dyn_a
11d60 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32 5d 20  uth_template[2] 
11d70 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20  = ((tmpbuflen + 
11d80 36 29 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20  6) & 0xff00) >> 
11d90 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74  8;....dyn_auth_t
11da0 65 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28 74 6d  emplate[3] = (tm
11db0 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30  pbuflen + 6) & 0
11dc0 78 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f 61 75  x00ff;....dyn_au
11dd0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20 3d  th_template[4] =
11de0 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75   0x82;....dyn_au
11df0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20 3d  th_template[5] =
11e00 20 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f 61 75   0x00;....dyn_au
11e10 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20 3d  th_template[6] =
11e20 20 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f 61 75   0x81;....dyn_au
11e30 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20 3d  th_template[7] =
11e40 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75   0x82;....dyn_au
11e50 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d  th_template[8] =
11e60 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78   (tmpbuflen & 0x
11e70 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64  ff00) >> 8;....d
11e80 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
11e90 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20  [9] = tmpbuflen 
11ea0 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 09 73 65  & 0x00ff;.....se
11eb0 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  nd_ret = cackey_
11ec0 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20  send_apdu(slot, 
11ed0 30 78 31 30 2c 20 4e 49 53 54 53 50 38 30 30 5f  0x10, NISTSP800_
11ee0 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55  73_3_INSTR_GENAU
11ef0 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38  TH, NISTSP800_78
11f00 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c  _3_ALGO_RSA2048,
11f10 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f   identity->pcsc_
11f20 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70  identity->card.p
11f30 69 76 2e 6b 65 79 5f 69 64 2c 20 73 69 7a 65 6f  iv.key_id, sizeo
11f40 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  f(dyn_auth_templ
11f50 61 74 65 29 2c 20 64 79 6e 5f 61 75 74 68 5f 74  ate), dyn_auth_t
11f60 65 6d 70 6c 61 74 65 2c 20 30 78 30 30 2c 20 4e  emplate, 0x00, N
11f70 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
11f80 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
11f90 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
11fa0 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09  E_CERT_ONLY:....
11fb0 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70 62  break;..}...tmpb
11fc0 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09  uf_s = tmpbuf;..
11fd0 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75  outbuf_s = outbu
11fe0 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75  f;..while (tmpbu
11ff0 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75 74  flen) {...tmpout
12000 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c  buflen = outbufl
12010 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62 75  en;....if (tmpbu
12020 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50  flen > CACKEY_AP
12030 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79 74  DU_MTU) {....byt
12040 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41 43  es_to_send = CAC
12050 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09  KEY_APDU_MTU;...
12060 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65  } else {....byte
12070 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62  s_to_send = tmpb
12080 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65  uflen;...}....se
12090 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b 45 59 5f  nd_ret = CACKEY_
120a0 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b 0a  PCSC_E_GENERIC;.
120b0 09 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
120c0 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43  e) {....case CAC
120d0 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
120e0 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c  .....if (tmpbufl
120f0 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55  en > CACKEY_APDU
12100 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 70 31 20  _MTU) {......p1 
12110 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 6c 65 20  = 0x80;......le 
12120 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c  = 0x00;.....} el
12130 73 65 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30  se {......p1 = 0
12140 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30  x00;......le = 0
12150 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  x00;.....}......
12160 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
12170 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
12180 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c  , GSCIS_CLASS_GL
12190 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47  OBAL_PLATFORM, G
121a0 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44  SCIS_INSTR_SIGND
121b0 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30  ECRYPT, p1, 0x00
121c0 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  , bytes_to_send,
121d0 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65   tmpbuf, le, &re
121e0 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20  spcode, outbuf, 
121f0 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a  &tmpoutbuflen);.
12200 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
12210 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
12220 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 20 28 74  E_PIV:.....if (t
12230 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45  mpbuflen > CACKE
12240 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09  Y_APDU_MTU) {...
12250 09 09 09 63 6c 61 73 73 20 3d 20 30 78 31 30 3b  ...class = 0x10;
12260 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b  ......le = 0x00;
12270 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
12280 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49 53  ...class = GSCIS
12290 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a  _CLASS_ISO7816;.
122a0 09 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09  .....le = 256;..
122b0 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72  ...}......send_r
122c0 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
122d0 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61 73  _apdu(slot, clas
122e0 73 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  s, NISTSP800_73_
122f0 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c  3_INSTR_GENAUTH,
12300 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
12310 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64  ALGO_RSA2048, id
12320 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
12330 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e  ntity->card.piv.
12340 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 5f 74 6f  key_id, bytes_to
12350 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c  _send, tmpbuf, l
12360 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75  e, &respcode, ou
12370 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66  tbuf, &tmpoutbuf
12380 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b  len);.....break;
12390 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
123a0 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
123b0 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  Y:.....break;...
123c0 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65  }....if (send_re
123d0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
123e0 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b  _S_OK) {....CACK
123f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12400 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61  "ADPU Sending Fa
12410 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e  iled -- returnin
12420 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a  g in error.");..
12430 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62  ...if (free_tmpb
12440 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74 6d  uf) {.....if (tm
12450 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09 66  pbuf_s) {......f
12460 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09  ree(tmpbuf_s);..
12470 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ...}....}...../*
12480 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   End transaction
12490 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e   */....cackey_en
124a0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
124b0 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73  ot);.....if (res
124c0 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 29  pcode == 0x6982)
124d0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
124e0 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75  BUG_PRINTF("Secu
124f0 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20  rity status not 
12500 73 61 74 69 73 69 66 69 65 64 2e 20 20 52 65 74  satisified.  Ret
12510 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e  urning NEEDLOGIN
12520 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f  ");......cackey_
12530 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
12540 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f 74 2d  slot);.....slot-
12550 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  >token_flags = C
12560 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
12570 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  D;......return(C
12580 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
12590 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09  DLOGIN);....}...
125a0 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
125b0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
125c0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09  TOKENABSENT) {..
125d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
125e0 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62  PRINTF("Token ab
125f0 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  sent.  Returning
12600 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a   TOKENABSENT");.
12610 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  .....cackey_mark
12620 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
12630 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43  );......return(C
12640 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
12650 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a  ENABSENT);....}.
12660 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
12670 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d  ..}....tmpbuf +=
12680 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a   bytes_to_send;.
12690 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62  ..tmpbuflen -= b
126a0 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09  ytes_to_send;...
126b0 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75  .outbuf += tmpou
126c0 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75  tbuflen;...outbu
126d0 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75  flen -= tmpoutbu
126e0 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b  flen;...retval +
126f0 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a  = tmpoutbuflen;.
12700 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d  .}...if (free_tm
12710 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d  pbuf) {...if (tm
12720 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65  pbuf_s) {....fre
12730 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d  e(tmpbuf_s);...}
12740 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f  ..}...outbuf = o
12750 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e  utbuf_s;.../* En
12760 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d transaction */
12770 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
12780 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
12790 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
127a0 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66  ARANOID.#  ifdef
127b0 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
127c0 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e  X..if (outbuflen
127d0 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
127e0 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
127f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75  DEBUG_PRINTF("Ou
12800 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20  tbuflen exceeds 
12810 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
12820 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
12830 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
12840 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75   outbuflen = %lu
12850 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49  )", (long) _POSI
12860 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e  X_SSIZE_MAX, (un
12870 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74  signed long) out
12880 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75  buflen);....retu
12890 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
128a0 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  dif.#endif.../* 
128b0 57 65 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74  We must remove t
128c0 68 65 20 22 37 43 22 20 74 61 67 20 74 6f 20 67  he "7C" tag to g
128d0 65 74 20 74 6f 20 74 68 65 20 73 69 67 6e 61 74  et to the signat
128e0 75 72 65 20 2a 2f 0a 09 73 77 69 74 63 68 20 28  ure */..switch (
128f0 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73  id_type) {...cas
12900 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
12910 5f 50 49 56 3a 0a 09 09 09 69 66 20 28 6f 75 74  _PIV:....if (out
12920 62 75 66 5b 30 5d 20 21 3d 20 30 78 37 43 29 20  buf[0] != 0x7C) 
12930 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
12940 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f  UG_PRINTF("Respo
12950 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72  nse from PIV for
12960 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e   GENERATE AUTHEN
12970 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74  TICATION was not
12980 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74   a 0x7C tag, ret
12990 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
129a0 65 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  e");......return
129b0 28 2d 31 29 3b 0a 0a 09 09 09 2f 2a 20 58 58 58  (-1);...../* XXX
129c0 20 54 4f 44 4f 20 50 49 56 20 2a 2f 0a 09 09 09   TODO PIV */....
129d0 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c 20  memmove(outbuf, 
129e0 6f 75 74 62 75 66 20 2b 20 38 2c 20 72 65 74 76  outbuf + 8, retv
129f0 61 6c 20 2d 20 38 29 3b 0a 09 09 09 72 65 74 76  al - 8);....retv
12a00 61 6c 20 2d 3d 20 38 3b 0a 09 09 7d 0a 09 09 63  al -= 8;...}...c
12a10 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
12a20 50 45 5f 43 41 43 3a 0a 09 09 63 61 73 65 20 43  PE_CAC:...case C
12a30 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
12a40 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61  RT_ONLY:....brea
12a50 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61 64  k;..}.../* Unpad
12a60 20 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28 75   reply */..if (u
12a70 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 09  npadOutput) {...
12a80 69 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29 20  if (retval < 3) 
12a90 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
12aa0 47 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79 20  G_PRINTF("Reply 
12ab0 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77 65  is too small, we
12ac0 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74 6f   are not able to
12ad0 20 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69 6e   unpad -- passin
12ae0 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69 6e  g back and hopin
12af0 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21 22  g for the best!"
12b00 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
12b10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
12b20 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
12b30 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28  , retval = %li (
12b40 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20  bytes)", (long) 
12b50 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74 75  retval);....retu
12b60 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d 0a  rn(retval);...}.
12b70 0a 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30 5d  ...if (outbuf[0]
12b80 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 43   != 0x00) {....C
12b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12ba0 54 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65 64  TF("Unrecognized
12bb0 20 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65 20   padding scheme 
12bc0 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20  -- passing back 
12bd0 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74  and hoping for t
12be0 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09  he best!");.....
12bf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12c00 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
12c10 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61  n success, retva
12c20 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22  l = %li (bytes)"
12c30 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29  , (long) retval)
12c40 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76  ;....return(retv
12c50 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f 63  al);...}....bloc
12c60 6b 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b 31  ktype = outbuf[1
12c70 5d 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65 74  ];...unpadoffset
12c80 20 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68 20   = 0;....switch 
12c90 28 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09 09  (blocktype) {...
12ca0 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 09  .case 0x00:.....
12cb0 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d  /* Padding Schem
12cc0 65 20 31 2c 20 74 68 65 20 66 69 72 73 74 20 6e  e 1, the first n
12cd0 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73 20  on-zero byte is 
12ce0 74 68 65 20 73 74 61 72 74 20 6f 66 20 64 61 74  the start of dat
12cf0 61 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e  a */.....for (un
12d00 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20 75  padoffset = 2; u
12d10 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65 74  npadoffset < ret
12d20 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  val; unpadoffset
12d30 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 6f  ++) {......if (o
12d40 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65  utbuf[unpadoffse
12d50 74 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09  t] != 0x00) {...
12d60 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
12d70 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  }.....}.....brea
12d80 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31 3a  k;....case 0x01:
12d90 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
12da0 53 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62 79  Scheme 2, pad by
12db0 74 65 73 20 61 72 65 20 30 78 46 46 20 66 6f 6c  tes are 0xFF fol
12dc0 6c 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a 2f  lowed by 0x00 */
12dd0 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f  .....for (unpado
12de0 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64  ffset = 2; unpad
12df0 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b  offset < retval;
12e00 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20   unpadoffset++) 
12e10 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75  {......if (outbu
12e20 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21  f[unpadoffset] !
12e30 3d 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09 09  = 0xFF) {.......
12e40 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64  if (outbuf[unpad
12e50 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29  offset] == 0x00)
12e60 20 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64 6f   {........unpado
12e70 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09  ffset++;........
12e80 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d 20  .break;.......} 
12e90 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43 41  else {........CA
12ea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12eb0 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64 69  F("Invalid paddi
12ec0 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20 72  ng data found, r
12ed0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
12ee0 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76 65  ure, should have
12ef0 20 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e 64   been 0x00 found
12f00 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69 67   0x%02x", (unsig
12f10 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66 5b  ned int) outbuf[
12f20 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a 0a  unpadoffset]);..
12f30 09 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31  .......return(-1
12f40 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  );.......}......
12f50 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 43  } else {.......C
12f60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12f70 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64  TF("Invalid padd
12f80 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20  ing data found, 
12f90 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
12fa0 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76  lure, should hav
12fb0 65 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75 6e  e been 0xFF foun
12fc0 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69  d 0x%02x", (unsi
12fd0 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66  gned int) outbuf
12fe0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a  [unpadoffset]);.
12ff0 0a 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31  .......return(-1
13000 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  );......}.....}.
13010 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
13020 73 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a 20  se 0x02:...../* 
13030 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 33  Padding Scheme 3
13040 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20  , pad bytes are 
13050 6e 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20 7a  non-zero first z
13060 65 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20 69  ero byte found i
13070 73 20 74 68 65 20 73 65 70 65 72 61 74 6f 72 20  s the seperator 
13080 62 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72 20  byte */.....for 
13090 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32  (unpadoffset = 2
130a0 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20  ; unpadoffset < 
130b0 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66  retval; unpadoff
130c0 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66  set++) {......if
130d0 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66   (outbuf[unpadof
130e0 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20 7b  fset] == 0x00) {
130f0 0a 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66 73  .......unpadoffs
13100 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72 65  et++;........bre
13110 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  ak;......}.....}
13120 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
13130 0a 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66 73  ...if (unpadoffs
13140 65 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a 09  et > retval) {..
13150 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13160 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67 72  RINTF("Offset gr
13170 65 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c 79  eater than reply
13180 20 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67 2e   size, aborting.
13190 20 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d    (unpadoffset =
131a0 20 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20 25   %lu, retval = %
131b0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
131c0 6c 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73 65  long) unpadoffse
131d0 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  t, (unsigned lon
131e0 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  g) retval);.....
131f0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
13200 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13210 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64  PRINTBUF("Padded
13220 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74 76  :", outbuf, retv
13230 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 2d  al);....retval -
13240 3d 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a 09  = unpadoffset;..
13250 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66 2c  .memmove(outbuf,
13260 20 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64 6f   outbuf + unpado
13270 66 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b 0a  ffset, retval);.
13280 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13290 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
132a0 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65  ed:", outbuf, re
132b0 74 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41 43  tval);..}....CAC
132c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
132d0 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
132e0 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20 3d  uccess, retval =
132f0 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20 28   %li (bytes)", (
13300 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a  long) retval);..
13310 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
13320 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
13330 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  IS. *     .... *
13340 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
13350 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52       .... *. * R
13360 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
13370 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54     .... *. * NOT
13380 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  ES. *     .... *
13390 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
133a0 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c 6f  ey_ret cackey_lo
133b0 67 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  gin(struct cacke
133c0 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
133d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69 6e  signed char *pin
133e0 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
133f0 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74 72  pin_len, int *tr
13400 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29  ies_remaining_p)
13410 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
13420 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20 7b  r cac_pin[8] = {
13430 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
13440 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
13450 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d 3b  FF, 0xFF, 0xFF};
13460 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70 6f  ..uint16_t respo
13470 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20 74  nse_code;..int t
13480 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a  ries_remaining;.
13490 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09  .int send_ret;..
134a0 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e 63  int key_referenc
134b0 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20 49  e = 0x00;.../* I
134c0 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65 20  ndicate that we 
134d0 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f 75  do not know abou
134e0 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65 73  t how many tries
134f0 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20 2a   are remaining *
13500 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  /..if (tries_rem
13510 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a 74  aining_p) {...*t
13520 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
13530 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20 41   = -1;..}.../* A
13540 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20 50  pparently, CAC P
13550 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c 59  INs are *EXACTLY
13560 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20 2d  * 8 bytes long -
13570 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46 20  - pad with 0xFF 
13580 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f 0a  if too short */.
13590 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d 20  .if (pin_len >= 
135a0 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61  8) {...memcpy(ca
135b0 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b 0a  c_pin, pin, 8);.
135c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63  .} else {...memc
135d0 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c  py(cac_pin, pin,
135e0 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09   pin_len);..}...
135f0 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65 72  /* Issue PIN Ver
13600 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  ify */..send_ret
13610 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
13620 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
13630 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
13640 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
13650 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65 66  Y, 0x00, key_ref
13660 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28 63  erence, sizeof(c
13670 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e  ac_pin), cac_pin
13680 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73  , 0x00, &respons
13690 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55  e_code, NULL, NU
136a0 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  LL);..if (send_r
136b0 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
136c0 43 5f 53 5f 4f 4b 20 26 26 20 72 65 73 70 6f 6e  C_S_OK && respon
136d0 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 41 38  se_code == 0x6A8
136e0 38 29 20 7b 0a 09 09 6b 65 79 5f 72 65 66 65 72  8) {...key_refer
136f0 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 0a 09 09  ence = 0x80;....
13700 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
13710 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
13720 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
13730 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
13740 54 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c  TR_VERIFY, 0x00,
13750 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20   key_reference, 
13760 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c  sizeof(cac_pin),
13770 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20   cac_pin, 0x00, 
13780 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
13790 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a  NULL, NULL);..}.
137a0 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21  ..if (send_ret !
137b0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
137c0 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65 73  OK) {...if ((res
137d0 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78 36  ponse_code & 0x6
137e0 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29 20  3C0) == 0x63C0) 
137f0 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61 69  {....tries_remai
13800 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73 65  ning = (response
13810 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a 09  _code & 0xF);...
13820 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13830 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69 66  RINTF("PIN Verif
13840 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20  ication failed, 
13850 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e 69  %i tries remaini
13860 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61 69  ng", tries_remai
13870 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28 74  ning);.....if (t
13880 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
13890 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f 72  ) {.....*tries_r
138a0 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72 69  emaining_p = tri
138b0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 09  es_remaining;...
138c0 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  .}.....return(CA
138d0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
138e0 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  IN);...}....if (
138f0 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d  response_code ==
13900 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43 41   0x6983) {....CA
13910 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13920 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
13930 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76 69  ion failed, devi
13940 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b 0a  ce is locked");.
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 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
13970 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  ;...}....return(
13980 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
13990 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
139a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
139b0 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69  ("PIN Verificati
139c0 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b 0a  on succeeded");.
139d0 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
139e0 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
139f0 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
13a00 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41       .... *. * A
13a10 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
13a20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  .... *. * RETURN
13a30 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e   VALUE. *     ..
13a40 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  .. *. * NOTES. *
13a50 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a       .... *. */.
13a60 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
13a70 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70  t cackey_token_p
13a80 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63 61  resent(struct ca
13a90 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
13aa0 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20 70   {..cackey_ret p
13ab0 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b  csc_connect_ret;
13ac0 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f 6c  ..DWORD reader_l
13ad0 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20 3d 20  en = 0, state = 
13ae0 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c  0, protocol = 0,
13af0 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45 20   atr_len;..BYTE 
13b00 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a 45  atr[MAX_ATR_SIZE
13b10 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73 5f  ];..LONG status_
13b20 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f 6e  ret, scard_recon
13b30 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  n_ret;...CACKEY_
13b40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
13b50 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73  lled.");...if (s
13b60 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b  lot->internal) {
13b70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13b80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
13b90 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 20  g token present 
13ba0 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65 6e 29  (internal token)
13bb0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
13bc0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
13bd0 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09  NPRESENT);..}...
13be0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
13bf0 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
13c00 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69  t_card(slot);..i
13c10 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  f (pcsc_connect_
13c20 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
13c30 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
13c40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13c50 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
13c60 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
13c70 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
13c80 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ent");....return
13c90 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
13ca0 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a  OKENABSENT);..}.
13cb0 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a 65  ..atr_len = size
13cc0 6f 66 28 61 74 72 29 3b 0a 09 73 74 61 74 75 73  of(atr);..status
13cd0 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74  _ret = SCardStat
13ce0 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  us(slot->pcsc_ca
13cf0 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65  rd, NULL, &reade
13d00 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
13d10 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
13d20 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28  atr_len);...if (
13d30 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43  status_ret == SC
13d40 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41  ARD_E_INVALID_HA
13d50 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45 59  NDLE) {...CACKEY
13d60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
13d70 43 61 72 64 53 74 61 74 75 73 28 29 20 72 65 74  CardStatus() ret
13d80 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49 4e  urned SCARD_E_IN
13d90 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d 61  VALID_HANDLE, ma
13da0 72 6b 69 6e 67 20 69 73 20 6e 6f 74 20 61 6c 72  rking is not alr
13db0 65 61 64 79 20 63 6f 6e 6e 65 63 74 65 64 20 61  eady connected a
13dc0 6e 64 20 74 72 79 69 6e 67 20 61 67 61 69 6e 22  nd trying again"
13dd0 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  );...cackey_mark
13de0 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74  _slot_reset(slot
13df0 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e 65  );....pcsc_conne
13e00 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ct_ret = cackey_
13e10 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f  connect_card(slo
13e20 74 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 63  t);...if (pcsc_c
13e30 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
13e40 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
13e50 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
13e60 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
13e70 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63   to connect to c
13e80 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  ard, returning t
13e90 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a  oken absent");..
13ea0 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
13eb0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
13ec0 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 61 74 72  ENT);...}....atr
13ed0 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74  _len = sizeof(at
13ee0 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72 65 74  r);...status_ret
13ef0 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28 73   = SCardStatus(s
13f00 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
13f10 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65  NULL, &reader_le
13f20 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74  n, &state, &prot
13f30 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f  ocol, atr, &atr_
13f40 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  len);..}...if (s
13f50 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43 41  tatus_ret != SCA
13f60 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
13f70 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
13f80 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
13f90 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
13fa0 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45 53  t == SCARD_W_RES
13fb0 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43 41  ET_CARD) {....CA
13fc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13fd0 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72 65  F("Reset require
13fe0 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e 2e  d, please hold..
13ff0 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 72  .");.....scard_r
14000 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  econn_ret = cack
14010 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
14020 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50 52  d(slot, SCARD_PR
14030 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
14040 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
14050 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69 66  protocol);....if
14060 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72   (scard_reconn_r
14070 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55  et == SCARD_S_SU
14080 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a 20  CCESS) {...../* 
14090 55 70 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c 20  Update protocol 
140a0 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72 6f  */.....slot->pro
140b0 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c  tocol = protocol
140c0 3b 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74  ;....../* Re-est
140d0 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69  ablish transacti
140e0 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72  on, if it was pr
140f0 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20  esent */.....if 
14100 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  (slot->transacti
14110 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a  on_depth > 0) {.
14120 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
14130 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
14140 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .....slot->trans
14150 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
14160 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61  ock = 1;......ca
14170 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73  ckey_begin_trans
14180 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09  action(slot);...
14190 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
141a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
141b0 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20  set successful, 
141c0 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09 09  requerying");...
141d0 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53  ..status_ret = S
141e0 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d  CardStatus(slot-
141f0 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c  >pcsc_card, NULL
14200 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26  , &reader_len, &
14210 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c  state, &protocol
14220 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29  , atr, &atr_len)
14230 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74 75 73  ;.....if (status
14240 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
14250 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 09  SUCCESS) {......
14260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14270 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62 6c  NTF("Still unabl
14280 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20  e to query card 
14290 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e  status, returnin
142a0 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
142b0 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d   SCardStatus() =
142c0 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
142d0 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
142e0 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72  _TO_STR(status_r
142f0 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  et));.......retu
14300 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
14310 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
14320 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 7b  ...}....} else {
14330 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14340 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
14350 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74 6f   to reconnect to
14360 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
14370 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20   token absent.  
14380 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
14390 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44   = %s", CACKEY_D
143a0 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
143b0 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
143c0 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09  reconn_ret));...
143d0 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
143e0 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
143f0 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65  ENT);....}...} e
14400 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
14410 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
14420 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61  able to query ca
14430 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75 72  rd status, retur
14440 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e  ning token absen
14450 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73 28  t.  SCardStatus(
14460 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ) = %s", CACKEY_
14470 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
14480 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75  ERR_TO_STR(statu
14490 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65 74  s_ret));.....ret
144a0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
144b0 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
144c0 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73 74  ..}..}...if ((st
144d0 61 74 65 20 26 20 53 43 41 52 44 5f 41 42 53 45  ate & SCARD_ABSE
144e0 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42 53  NT) == SCARD_ABS
144f0 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
14500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
14510 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72 65  rd is absent, re
14520 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
14530 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72  sent");....retur
14540 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
14550 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d  TOKENABSENT);..}
14560 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14570 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
14580 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74 2e  g token present.
14590 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
145a0 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
145b0 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a  PRESENT);.}../*.
145c0 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
145d0 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
145e0 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
145f0 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
14600 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
14610 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
14620 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
14630 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
14640 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
14650 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75 63  y_to_label(struc
14660 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
14670 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
14680 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
14690 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73 69  *label_buf, unsi
146a0 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f  gned long label_
146b0 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73 69  buf_len) {..unsi
146c0 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69 66  gned long certif
146d0 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64  icate_len;..void
146e0 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09 76   *label_asn1;..v
146f0 6f 69 64 20 2a 63 65 72 74 69 66 69 63 61 74 65  oid *certificate
14700 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61 64  ;..int x509_read
14710 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69 63  _ret;...certific
14720 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ate = identity->
14730 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65  certificate;..ce
14740 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
14750 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
14760 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20  icate_len;...if 
14770 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
14780 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e   < 0) {...return
14790 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f  (-1);..}...x509_
147a0 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f  read_ret = x509_
147b0 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74 69  to_subject(certi
147c0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
147d0 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20 2a  ate_len, (void *
147e0 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29 3b  *) &label_asn1);
147f0 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
14800 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65 74  ret < 0) {...ret
14810 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35  urn(-1);..}...x5
14820 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
14830 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28  09_dn_to_string(
14840 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39  label_asn1, x509
14850 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72  _read_ret, (char
14860 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c   *) label_buf, l
14870 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22 43  abel_buf_len, "C
14880 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f 72  N");..if (x509_r
14890 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
148a0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
148b0 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72  = x509_dn_to_str
148c0 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20  ing(label_asn1, 
148d0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20 28  x509_read_ret, (
148e0 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75  char *) label_bu
148f0 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e  f, label_buf_len
14900 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20 28  , NULL);....if (
14910 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 3d  x509_read_ret <=
14920 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e 28   0) {....return(
14930 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66  -1);...}..}..#if
14940 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e  def CACKEY_PARAN
14950 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f  OID.#  ifdef _PO
14960 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69  SIX_SSIZE_MAX..i
14970 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74  f (x509_read_ret
14980 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f   > _POSIX_SSIZE_
14990 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  MAX) {...CACKEY_
149a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78 35  DEBUG_PRINTF("x5
149b0 30 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63 65  09_read_ret exce
149c0 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75  eds maximum valu
149d0 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
149e0 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20  failure. (max = 
149f0 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f 72  %li, x509_read_r
14a00 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e  et = %lu)", (lon
14a10 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  g) _POSIX_SSIZE_
14a20 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  MAX, (unsigned l
14a30 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f 72  ong) x509_read_r
14a40 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  et);....return(-
14a50 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a  1);..}.#  endif.
14a60 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28  #endif...return(
14a70 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a  x509_read_ret);.
14a80 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20  }../* Returns 0 
14a90 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74  on success */.st
14aa0 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
14ab0 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f 69  mutex_create(voi
14ac0 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74  d **mutex) {..pt
14ad0 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70  hread_mutex_t *p
14ae0 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69  thread_mutex;..i
14af0 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  nt pthread_retva
14b00 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d  l;..CK_RV custom
14b10 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
14b20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
14b30 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
14b40 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c  ((cackey_args.fl
14b50 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43  ags & CKF_OS_LOC
14b60 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f  KING_OK) == CKF_
14b70 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b  OS_LOCKING_OK) {
14b80 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ...pthread_mutex
14b90 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
14ba0 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  (*pthread_mutex)
14bb0 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65 61  );...if (!pthrea
14bc0 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43 41  d_mutex) {....CA
14bd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14be0 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c 6c  F("Failed to all
14bf0 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29 3b  ocate memory.");
14c00 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14c10 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64 5f  ...}....pthread_
14c20 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64  retval = pthread
14c30 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68 72  _mutex_init(pthr
14c40 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c 29  ead_mutex, NULL)
14c50 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f  ;...if (pthread_
14c60 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
14c70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14c80 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d  RINTF("pthread_m
14c90 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74 75  utex_init() retu
14ca0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e  rned error (%i).
14cb0 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  ", pthread_retva
14cc0 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
14cd0 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74 65  1);...}....*mute
14ce0 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65  x = pthread_mute
14cf0 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  x;..} else {...i
14d00 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 43  f (cackey_args.C
14d10 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09 09  reateMutex) {...
14d20 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d  .custom_retval =
14d30 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65   cackey_args.Cre
14d40 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29 3b  ateMutex(mutex);
14d50 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d 5f  .....if (custom_
14d60 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b  retval != CKR_OK
14d70 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
14d80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
14d90 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
14da0 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
14db0 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
14dc0 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
14dd0 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
14de0 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
14df0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
14e00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
14e10 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
14e20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
14e30 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  0);.}../* Return
14e40 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
14e50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
14e60 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 76  key_mutex_lock(v
14e70 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70  oid *mutex) {..p
14e80 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
14e90 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
14ea0 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
14eb0 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
14ec0 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
14ed0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14ee0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
14ef0 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
14f00 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
14f10 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
14f20 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
14f30 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
14f40 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74  x = mutex;....pt
14f50 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20 70  hread_retval = p
14f60 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
14f70 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  k(pthread_mutex)
14f80 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f  ;...if (pthread_
14f90 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
14fa0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14fb0 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d  RINTF("pthread_m
14fc0 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74 75  utex_lock() retu
14fd0 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e  rned error (%i).
14fe0 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61  ", pthread_retva
14ff0 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
15000 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
15010 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61  {...if (cackey_a
15020 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20 7b  rgs.LockMutex) {
15030 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61  ....custom_retva
15040 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e  l = cackey_args.
15050 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78 29  LockMutex(mutex)
15060 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d  ;.....if (custom
15070 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f  _retval != CKR_O
15080 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
15090 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
150a0 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
150b0 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20 65  tex() returned e
150c0 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c  rror (%li).", (l
150d0 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74 76  ong) custom_retv
150e0 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  al);......return
150f0 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09  (-1);....}...}..
15100 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
15110 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
15120 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20 28  ng sucessfully (
15130 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30  0)");...return(0
15140 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73  );.}../* Returns
15150 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f   0 on success */
15160 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
15170 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
15180 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09  void *mutex) {..
15190 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
151a0 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a  *pthread_mutex;.
151b0 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
151c0 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74  val;..CK_RV cust
151d0 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  om_retval;...CAC
151e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
151f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
15200 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  f ((cackey_args.
15210 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c  flags & CKF_OS_L
15220 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b  OCKING_OK) == CK
15230 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
15240 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
15250 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70  ex = mutex;....p
15260 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20  thread_retval = 
15270 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e  pthread_mutex_un
15280 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74  lock(pthread_mut
15290 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65  ex);...if (pthre
152a0 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ad_retval != 0) 
152b0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
152c0 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65 61  G_PRINTF("pthrea
152d0 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 29  d_mutex_unlock()
152e0 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
152f0 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64 5f  (%i).", pthread_
15300 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74  retval);.....ret
15310 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20  urn(-1);...}..} 
15320 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
15330 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d  key_args.UnlockM
15340 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
15350 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
15360 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74  y_args.UnlockMut
15370 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69  ex(mutex);.....i
15380 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  f (custom_retval
15390 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
153a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
153b0 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72  RINTF("cackey_ar
153c0 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 29  gs.UnlockMutex()
153d0 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
153e0 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
153f0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
15400 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
15410 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
15420 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15430 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
15440 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
15450 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
15460 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52 49  .static CK_ATTRI
15470 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79 5f  BUTE_PTR cackey_
15480 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43  get_attributes(C
15490 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20 6f  K_OBJECT_CLASS o
154a0 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72 75  bjectclass, stru
154b0 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
154c0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
154d0 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  y, unsigned long
154e0 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20 43   identity_num, C
154f0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43  K_ULONG_PTR pulC
15500 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20  ount) {..static 
15510 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75 65  CK_BBOOL ck_true
15520 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43 4b   = 1;..static CK
15530 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65 20  _BBOOL ck_false 
15540 3d 20 30 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  = 0;..static CK_
15550 54 52 55 53 54 20 63 6b 5f 74 72 75 73 74 65 64  TRUST ck_trusted
15560 20 3d 20 43 4b 5f 54 52 55 53 54 45 44 5f 44 45   = CK_TRUSTED_DE
15570 4c 45 47 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f  LEGATOR;..CK_ULO
15580 4e 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30 2c  NG numattrs = 0,
15590 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09   retval_count;..
155a0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50  CK_ATTRIBUTE_TYP
155b0 45 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  E curr_attr_type
155c0 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  ;..CK_ATTRIBUTE 
155d0 63 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74 76  curr_attr, *retv
155e0 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52  al;..CK_VOID_PTR
155f0 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f   pValue;..CK_ULO
15600 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09  NG ulValueLen;..
15610 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20  CK_OBJECT_CLASS 
15620 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 3b  ck_object_class;
15630 0a 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ..CK_CERTIFICATE
15640 5f 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66 69  _TYPE ck_certifi
15650 63 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b  cate_type;..CK_K
15660 45 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f 74  EY_TYPE ck_key_t
15670 79 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48 41  ype;..CK_UTF8CHA
15680 52 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34 5d  R ucTmpBuf[1024]
15690 3b 0a 09 53 48 41 31 43 6f 6e 74 65 78 74 20 73  ;..SHA1Context s
156a0 68 61 31 5f 63 74 78 3b 0a 09 4d 44 35 5f 43 54  ha1_ctx;..MD5_CT
156b0 58 20 6d 64 35 5f 63 74 78 3b 0a 09 75 69 6e 74  X md5_ctx;..uint
156c0 38 5f 74 20 73 68 61 31 5f 68 61 73 68 5b 53 48  8_t sha1_hash[SH
156d0 41 31 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 69  A1HashSize];..ui
156e0 6e 74 38 5f 74 20 6d 64 35 5f 68 61 73 68 5b 4d  nt8_t md5_hash[M
156f0 44 35 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75 6e  D5HashSize];..un
15700 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
15710 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a 65  tificate;..ssize
15720 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  _t certificate_l
15730 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72 65  en = -1, x509_re
15740 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56 61  ad_ret;..int pVa
15750 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43 4b  lue_free;...CACK
15760 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15770 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74 43  "Called (objectC
15780 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65 6e  lass = %lu, iden
15790 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e  tity_num = %lu).
157a0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
157b0 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20  g) objectclass, 
157c0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a  identity_num);..
157d0 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a  .*pulCount = 0;.
157e0 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
157f0 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49  s != CKO_CERTIFI
15800 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63 6c  CATE && objectcl
15810 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass != CKO_PUBLI
15820 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63  C_KEY && objectc
15830 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56  lass != CKO_PRIV
15840 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63  ATE_KEY && objec
15850 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
15860 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
15870 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15880 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
15890 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c   0 objects (NULL
158a0 29 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65 63  ), invalid objec
158b0 74 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72 65  t class");....re
158c0 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
158d0 09 2f 2a 20 47 65 74 20 43 65 72 74 20 2a 2f 0a  ./* Get Cert */.
158e0 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d  .if (identity ==
158f0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
15900 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15910 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65  Returning 0 obje
15920 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61  cts (NULL), inva
15930 6c 69 64 20 69 64 65 6e 74 69 79 20 70 72 6f 76  lid identiy prov
15940 69 64 65 64 22 29 3b 0a 0a 09 09 72 65 74 75 72  ided");....retur
15950 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65  n(NULL);..}...ce
15960 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65 6e  rtificate = iden
15970 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
15980 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65 5f  e;..certificate_
15990 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  len = identity->
159a0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b  certificate_len;
159b0 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
159c0 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20  te_len == -1 || 
159d0 63 65 72 74 69 66 69 63 61 74 65 20 3d 3d 20 4e  certificate == N
159e0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
159f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15a00 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74  turning 0 object
15a10 73 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20 69  s (NULL), this i
15a20 64 65 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f 74  dentity does not
15a30 20 68 61 76 65 20 61 6e 20 58 2e 35 30 39 20 63   have an X.509 c
15a40 65 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63  ertificate assoc
15a50 69 61 74 65 64 20 77 69 74 68 20 69 74 20 61 6e  iated with it an
15a60 64 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22  d will not work"
15a70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
15a80 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69  L);..}.../* Veri
15a90 66 79 20 74 68 61 74 20 63 65 72 74 69 66 69 63  fy that certific
15aa0 61 74 65 20 69 73 20 41 53 4e 2e 31 20 65 6e 63  ate is ASN.1 enc
15ab0 6f 64 65 64 20 58 2e 35 30 39 20 63 65 72 74 69  oded X.509 certi
15ac0 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28 78  ficate */..if (x
15ad0 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65  509_to_serial(ce
15ae0 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
15af0 66 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c  ficate_len, NULL
15b00 29 20 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b 45  ) < 0) {...CACKE
15b10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
15b20 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65  Returning 0 obje
15b30 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65 20  cts (NULL), the 
15b40 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74  X.509 certificat
15b50 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
15b60 68 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20  h this identity 
15b70 69 73 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b 0a  is not valid");.
15b80 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
15b90 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f 75  ..}...retval_cou
15ba0 6e 74 20 3d 20 36 34 3b 0a 09 72 65 74 76 61 6c  nt = 64;..retval
15bb0 20 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61 6c   = malloc(retval
15bc0 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  _count * sizeof(
15bd0 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f 72  *retval));...for
15be0 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65   (curr_attr_type
15bf0 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72 5f   = 0; curr_attr_
15c00 74 79 70 65 20 3c 20 30 78 63 65 35 33 36 33 62  type < 0xce5363b
15c10 66 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  f; curr_attr_typ
15c20 65 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 75 72  e++) {...if (cur
15c30 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d 20 30  r_attr_type == 0
15c40 78 38 30 30 29 20 7b 0a 09 09 09 63 75 72 72 5f  x800) {....curr_
15c50 61 74 74 72 5f 74 79 70 65 20 3d 20 30 78 63 65  attr_type = 0xce
15c60 35 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09 70  536300;...}....p
15c70 56 61 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b 0a  Value_free = 0;.
15c80 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
15c90 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
15ca0 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09  (CK_LONG) -1;...
15cb0 09 73 77 69 74 63 68 20 28 63 75 72 72 5f 61 74  .switch (curr_at
15cc0 74 72 5f 74 79 70 65 29 20 7b 0a 09 09 09 63 61  tr_type) {....ca
15cd0 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09 09  se CKA_CLASS:...
15ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
15cf0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
15d00 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
15d10 43 4c 41 53 53 20 28 30 78 25 30 38 6c 78 29 20  CLASS (0x%08lx) 
15d20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
15d30 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
15d40 74 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f  type);......ck_o
15d50 62 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f 62  bject_class = ob
15d60 6a 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09 09  jectclass;......
15d70 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62 6a  pValue = &ck_obj
15d80 65 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09 75  ect_class;.....u
15d90 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
15da0 6f 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61  of(ck_object_cla
15db0 73 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ss);......CACKEY
15dc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
15dd0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
15de0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
15df0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
15e00 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20  CK_OBJECT_CLASS 
15e10 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
15e20 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
15e30 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
15e40 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
15e50 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a  case CKA_TOKEN:.
15e60 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15e70 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
15e80 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
15e90 41 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c 78  A_TOKEN (0x%08lx
15ea0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
15eb0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
15ec0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
15ed0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
15ee0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
15ef0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
15f00 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
15f10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
15f20 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
15f30 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
15f40 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
15f50 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
15f60 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
15f70 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
15f80 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
15f90 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
15fa0 50 52 49 56 41 54 45 3a 0a 09 09 09 09 43 41 43  PRIVATE:.....CAC
15fb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15fc0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
15fd0 72 69 62 75 74 65 20 43 4b 41 5f 50 52 49 56 41  ribute CKA_PRIVA
15fe0 54 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  TE (0x%08lx) ...
15ff0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16000 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
16010 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
16020 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
16030 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
16040 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
16050 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
16060 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
16070 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
16080 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70  re not a Netscap
16090 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
160a0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
160b0 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75 65  ...}......pValue
160c0 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09   = &ck_false;...
160d0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
160e0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
160f0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
16100 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
16110 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
16120 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
16130 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
16140 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
16150 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
16160 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
16170 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
16180 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  ;....case CKA_TR
16190 55 53 54 45 44 3a 0a 09 09 09 09 43 41 43 4b 45  USTED:.....CACKE
161a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
161b0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
161c0 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 45 44  bute CKA_TRUSTED
161d0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
161e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
161f0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
16200 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
16210 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
16220 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
16230 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16240 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
16250 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
16260 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
16270 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
16280 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
16290 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
162a0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
162b0 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _true;.....ulVal
162c0 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
162d0 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43 41  k_true);......CA
162e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
162f0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16300 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
16310 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16320 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
16330 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
16340 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16350 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16360 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
16370 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45  e CKA_MODIFIABLE
16380 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
16390 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
163a0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
163b0 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20 28  CKA_MODIFIABLE (
163c0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
163d0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
163e0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
163f0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
16400 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56  k_false;.....ulV
16410 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
16420 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09  (ck_false);.....
16430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16440 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
16450 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
16460 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
16470 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
16480 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
16490 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
164a0 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
164b0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
164c0 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a  case CKA_LABEL:.
164d0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
164e0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
164f0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
16500 41 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c 78  A_LABEL (0x%08lx
16510 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
16520 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
16530 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 2f 2a  r_type);....../*
16540 20 58 58 58 3a 20 44 65 74 65 72 6d 69 6e 65 20   XXX: Determine 
16550 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 75 6c 56 61  name */.....ulVa
16560 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 6e 74  lueLen = snprint
16570 66 28 28 63 68 61 72 20 2a 29 20 75 63 54 6d 70  f((char *) ucTmp
16580 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54 6d  Buf, sizeof(ucTm
16590 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69 74 79  pBuf), "Identity
165a0 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65   #%lu", (unsigne
165b0 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79  d long) identity
165c0 5f 6e 75 6d 29 3b 0a 09 09 09 09 70 56 61 6c 75  _num);.....pValu
165d0 65 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a 0a 09  e = ucTmpBuf;...
165e0 09 09 09 69 66 20 28 75 6c 56 61 6c 75 65 4c 65  ...if (ulValueLe
165f0 6e 20 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54 6d  n >= sizeof(ucTm
16600 70 42 75 66 29 29 20 7b 0a 09 09 09 09 09 75 6c  pBuf)) {......ul
16610 56 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09 09  ValueLen = 0;...
16620 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
16630 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
16640 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16650 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
16660 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
16670 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
16680 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
16690 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
166a0 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a 0a  case CKA_VALUE:.
166b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
166c0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
166d0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
166e0 41 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c 78  A_VALUE (0x%08lx
166f0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
16700 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
16710 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73 77  r_type);......sw
16720 69 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61 73  itch (objectclas
16730 73 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20 43  s) {......case C
16740 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a 0a  KO_PRIVATE_KEY:.
16750 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
16760 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
16770 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
16780 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
16790 65 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 2e  e a private key.
167a0 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
167b0 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f  ;......case CKO_
167c0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 3a 0a  NETSCAPE_TRUST:.
167d0 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
167e0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
167f0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
16800 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
16810 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
16820 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
16830 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
16840 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43 5f  case CKO_PUBLIC_
16850 4b 45 59 3a 0a 09 09 09 09 09 09 69 66 20 28 63  KEY:.......if (c
16860 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
16870 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 78 35  = 0) {........x5
16880 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
16890 30 39 5f 74 6f 5f 70 75 62 6b 65 79 28 63 65 72  09_to_pubkey(cer
168a0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
168b0 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
168c0 75 65 29 3b 0a 09 09 09 09 09 09 09 69 66 20 28  ue);........if (
168d0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
168e0 30 29 20 7b 20 0a 09 09 09 09 09 09 09 09 70 56  0) { .........pV
168f0 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
16900 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
16910 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
16920 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
16930 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09  ........}.......
16940 7d 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  }........break;.
16950 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43 45  .....case CKO_CE
16960 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09 09  RTIFICATE:......
16970 09 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69 66  .pValue = certif
16980 69 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c 56  icate;.......ulV
16990 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69 66  alueLen = certif
169a0 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09 09  icate_len;......
169b0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
169c0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
169d0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
169e0 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
169f0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
16a00 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
16a10 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
16a20 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 53  ;....case CKA_IS
16a30 53 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59  SUER:.....CACKEY
16a40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16a50 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
16a60 75 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20 28  ute CKA_ISSUER (
16a70 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
16a80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
16a90 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
16aa0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
16ab0 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
16ac0 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63  IFICATE && objec
16ad0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45  tclass != CKO_NE
16ae0 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
16af0 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16b00 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
16b10 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
16b20 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
16b30 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61   not a certifica
16b40 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74  te or Netscape t
16b50 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
16b60 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
16b70 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69  }......if (certi
16b80 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29  ficate_len >= 0)
16b90 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61   {......x509_rea
16ba0 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
16bb0 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63 61  issuer(certifica
16bc0 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
16bd0 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
16be0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
16bf0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
16c00 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
16c10 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
16c20 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
16c30 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
16c40 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
16c50 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16c60 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
16c70 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c  turning %p/%lu",
16c80 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
16c90 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
16ca0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
16cb0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45  ;....case CKA_SE
16cc0 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09  RIAL_NUMBER:....
16cd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16ce0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
16cf0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
16d00 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30 78  ERIAL_NUMBER (0x
16d10 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
16d20 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
16d30 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
16d40 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
16d50 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
16d60 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63  ICATE && objectc
16d70 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
16d80 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
16d90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16da0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
16db0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
16dc0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
16dd0 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
16de0 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72 75   or Netscape tru
16df0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
16e00 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
16e10 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
16e20 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
16e30 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
16e40 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 65  ret = x509_to_se
16e50 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74 65  rial(certificate
16e60 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
16e70 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
16e80 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
16e90 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
16ea0 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
16eb0 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
16ec0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
16ed0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
16ee0 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
16ef0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16f00 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
16f10 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
16f20 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
16f30 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
16f40 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
16f50 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 55  ;....case CKA_SU
16f60 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b 45  BJECT:.....CACKE
16f70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16f80 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
16f90 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43 54  bute CKA_SUBJECT
16fa0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
16fb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16fc0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
16fd0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
16fe0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
16ff0 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09  RTIFICATE) {....
17000 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17010 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
17020 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
17030 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f  ecause we are no
17040 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65 22  t a certificate"
17050 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
17060 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
17070 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
17080 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
17090 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
170a0 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74  _to_subject(cert
170b0 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
170c0 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75  cate_len, &pValu
170d0 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30  e);......if (x50
170e0 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20  9_read_ret < 0) 
170f0 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  {.......pValue =
17100 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c   NULL;......} el
17110 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c  se {.......ulVal
17120 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61  ueLen = x509_rea
17130 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09  d_ret;......}...
17140 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ..}......CACKEY_
17150 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17160 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
17170 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
17180 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
17190 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
171a0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
171b0 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b 45  KA_ID:.....CACKE
171c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
171d0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
171e0 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78 25  bute CKA_ID (0x%
171f0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
17200 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
17210 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
17220 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
17230 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
17240 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
17250 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17260 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
17270 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
17280 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
17290 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
172a0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
172b0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 75  ak;.....}......u
172c0 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28 69  cTmpBuf[0] = ((i
172d0 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29  dentity_num + 1)
172e0 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09   >> 8) & 0xff;..
172f0 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20 3d  ...ucTmpBuf[1] =
17300 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20    (identity_num 
17310 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09 09  + 1) & 0xff;....
17320 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54 6d  ..pValue = &ucTm
17330 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c 75  pBuf;.....ulValu
17340 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09 43  eLen = 2;......C
17350 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17360 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
17370 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c  ng %p/%lu", pVal
17380 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
17390 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
173a0 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
173b0 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46 49  case CKA_CERTIFI
173c0 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09 43  CATE_TYPE:.....C
173d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
173e0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
173f0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52  ttribute CKA_CER
17400 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 28 30  TIFICATE_TYPE (0
17410 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
17420 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
17430 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
17440 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
17450 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
17460 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09 43  FICATE) {......C
17470 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17480 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
17490 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
174a0 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
174b0 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29 3b   certificate.");
174c0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
174d0 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f  ..}....../* We o
174e0 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20  nly support one 
174f0 63 65 72 74 69 66 69 63 61 74 65 20 74 79 70 65  certificate type
17500 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74 69   */.....ck_certi
17510 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43 4b  ficate_type = CK
17520 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70 56  C_X_509;......pV
17530 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74 69  alue = &ck_certi
17540 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09 09  ficate_type;....
17550 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
17560 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69 63  zeof(ck_certific
17570 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ate_type);......
17580 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17590 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
175a0 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28 25  ing CKC_X_509 (%
175b0 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  lu) (%p/%lu)", (
175c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
175d0 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45  ((CK_CERTIFICATE
175e0 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29  _TYPE *) pValue)
175f0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
17600 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
17610 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
17620 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4b  k;....case CKA_K
17630 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41 43  EY_TYPE:.....CAC
17640 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17650 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
17660 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f 54  ribute CKA_KEY_T
17670 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  YPE (0x%08lx) ..
17680 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
17690 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
176a0 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
176b0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
176c0 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26 20  _PRIVATE_KEY && 
176d0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
176e0 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20 7b  KO_PUBLIC_KEY) {
176f0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17700 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17710 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
17720 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
17730 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b 0a  e not a key.");.
17740 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17750 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f 6e  .}....../* We on
17760 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20 6b  ly support one k
17770 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09 63  ey type */.....c
17780 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b 4b  k_key_type = CKK
17790 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c 75  _RSA;......pValu
177a0 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70 65  e = &ck_key_type
177b0 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
177c0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65 79   = sizeof(ck_key
177d0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41 43  _type);......CAC
177e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
177f0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
17800 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20 28   CKK_RSA (%lu) (
17810 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
17820 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
17830 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
17840 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
17850 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17860 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17870 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
17880 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a  .case CKA_SIGN:.
17890 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
178a0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
178b0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
178c0 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78 29  A_SIGN (0x%08lx)
178d0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
178e0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
178f0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
17900 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
17910 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
17920 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
17930 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17940 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
17950 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
17960 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
17970 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
17980 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
17990 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
179a0 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
179b0 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
179c0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
179d0 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
179e0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
179f0 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d  (ck_true);.....}
17a00 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61   else {......pVa
17a10 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
17a20 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
17a30 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
17a40 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
17a50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17a60 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
17a70 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
17a80 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
17a90 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
17aa0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
17ab0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
17ac0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
17ad0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
17ae0 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43  ase CKA_SIGN_REC
17af0 4f 56 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59  OVER:.....CACKEY
17b00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17b10 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
17b20 75 74 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45 43  ute CKA_SIGN_REC
17b30 4f 56 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  OVER (0x%08lx) .
17b40 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
17b50 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
17b60 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
17b70 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
17b80 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
17b90 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
17ba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17bb0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
17bc0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
17bd0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
17be0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
17bf0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17c00 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63 75  .}....../* We cu
17c10 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75 70  rrently only sup
17c20 70 6f 72 74 20 22 53 69 67 6e 20 77 69 74 68 20  port "Sign with 
17c30 41 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09 09  Appendix" */....
17c40 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
17c50 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lse;.....ulValue
17c60 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
17c70 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43  false);......CAC
17c80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17c90 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
17ca0 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
17cb0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17cc0 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
17cd0 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
17ce0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17cf0 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
17d00 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
17d10 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09   CKA_DECRYPT:...
17d20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17d30 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
17d40 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
17d50 44 45 43 52 59 50 54 20 28 30 78 25 30 38 6c 78  DECRYPT (0x%08lx
17d60 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
17d70 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
17d80 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
17d90 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
17da0 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
17db0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
17dc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17dd0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
17de0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
17df0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
17e00 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
17e10 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
17e20 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
17e30 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
17e40 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c 7c  O_PRIVATE_KEY ||
17e50 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20   objectclass == 
17e60 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20  CKO_PUBLIC_KEY) 
17e70 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
17e80 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
17e90 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
17ea0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
17eb0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
17ec0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
17ed0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
17ee0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
17ef0 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
17f00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17f10 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
17f20 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
17f30 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
17f40 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
17f50 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
17f60 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17f70 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17f80 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
17f90 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49 54  .case CKA_SENSIT
17fa0 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  IVE:.....CACKEY_
17fb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
17fc0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
17fd0 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45  te CKA_SENSITIVE
17fe0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
17ff0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18000 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
18010 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
18020 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
18030 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
18040 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18050 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
18060 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
18070 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
18080 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
18090 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
180a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
180b0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
180c0 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
180d0 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
180e0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
180f0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
18100 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
18110 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
18120 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
18130 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
18140 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
18150 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
18160 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
18170 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18180 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
18190 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
181a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
181b0 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
181c0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
181d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
181e0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
181f0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
18200 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09  A_EXTRACTABLE:..
18210 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18220 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18230 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18240 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28 30 78  _EXTRACTABLE (0x
18250 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
18260 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
18270 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
18280 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
18290 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
182a0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
182b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
182c0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
182d0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
182e0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
182f0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
18300 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
18310 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
18320 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20  if (objectclass 
18330 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  == CKO_PRIVATE_K
18340 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
18350 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
18360 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18370 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29   sizeof(ck_true)
18380 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ;.....} else {..
18390 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
183a0 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61  _true;......ulVa
183b0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
183c0 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
183d0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
183e0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
183f0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
18400 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
18410 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
18420 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
18430 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
18440 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
18450 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
18460 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
18470 44 55 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b 45  DULUS:.....CACKE
18480 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18490 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
184a0 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  bute CKA_MODULUS
184b0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
184c0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
184d0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
184e0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
184f0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
18500 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
18510 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18520 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
18530 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
18540 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
18550 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
18560 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
18570 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
18580 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
18590 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
185a0 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
185b0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f 64  et = x509_to_mod
185c0 75 6c 75 73 28 63 65 72 74 69 66 69 63 61 74 65  ulus(certificate
185d0 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
185e0 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
185f0 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
18600 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09  ret < 0) {......
18610 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a  .pValue = NULL;.
18620 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
18630 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18640 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
18650 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09  .....}.....}....
18660 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18670 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
18680 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c  rning (%p/%lu)",
18690 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
186a0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
186b0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
186c0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50 55  ;....case CKA_PU
186d0 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a 09  BLIC_EXPONENT:..
186e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
186f0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18700 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18710 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
18720 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
18730 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18740 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
18750 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
18760 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
18770 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
18780 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18790 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
187a0 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
187b0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
187c0 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
187d0 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
187e0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
187f0 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63  ....if (certific
18800 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a  ate_len >= 0) {.
18810 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72  .....x509_read_r
18820 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78 70  et = x509_to_exp
18830 6f 6e 65 6e 74 28 63 65 72 74 69 66 69 63 61 74  onent(certificat
18840 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
18850 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
18860 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
18870 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
18880 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
18890 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
188a0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
188b0 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
188c0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
188d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
188e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
188f0 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
18900 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
18910 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
18920 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
18930 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
18940 52 55 53 54 5f 44 49 47 49 54 41 4c 5f 53 49 47  RUST_DIGITAL_SIG
18950 4e 41 54 55 52 45 3a 0a 09 09 09 63 61 73 65 20  NATURE:....case 
18960 43 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52 45  CKA_TRUST_NON_RE
18970 50 55 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63 61  PUDIATION:....ca
18980 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59  se CKA_TRUST_KEY
18990 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09  _ENCIPHERMENT:..
189a0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
189b0 5f 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d 45  _DATA_ENCIPHERME
189c0 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NT:....case CKA_
189d0 54 52 55 53 54 5f 4b 45 59 5f 41 47 52 45 45 4d  TRUST_KEY_AGREEM
189e0 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ENT:....case CKA
189f0 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45 52 54 5f  _TRUST_KEY_CERT_
18a00 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b  SIGN:....case CK
18a10 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49 47 4e  A_TRUST_CRL_SIGN
18a20 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
18a30 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48 3a  UST_SERVER_AUTH:
18a40 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
18a50 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a 0a  ST_CLIENT_AUTH:.
18a60 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
18a70 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a 0a  T_CODE_SIGNING:.
18a80 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
18a90 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54 49  T_EMAIL_PROTECTI
18aa0 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ON:.....CACKEY_D
18ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18ac0 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18ad0 65 20 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e 20  e CKA_TRUST_... 
18ae0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
18af0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
18b00 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
18b10 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
18b20 63 6b 5f 74 72 75 73 74 65 64 3b 0a 09 09 09 09  ck_trusted;.....
18b30 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
18b40 65 6f 66 28 63 6b 5f 74 72 75 73 74 65 64 29 3b  eof(ck_trusted);
18b50 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18b60 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18b70 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
18b80 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
18b90 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 54  ed long) *((CK_T
18ba0 52 55 53 54 20 2a 29 20 70 56 61 6c 75 65 29 2c  RUST *) pValue),
18bb0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
18bc0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
18bd0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
18be0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
18bf0 52 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09 09  RT_SHA1_HASH:...
18c00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18c10 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
18c20 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
18c30 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 20 28  CERT_SHA1_HASH (
18c40 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
18c50 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
18c60 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
18c70 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
18c80 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
18c90 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
18ca0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18cb0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
18cc0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
18cd0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
18ce0 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  ot a Netscape tr
18cf0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
18d00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
18d10 0a 0a 09 09 09 09 53 48 41 31 52 65 73 65 74 28  ......SHA1Reset(
18d20 26 73 68 61 31 5f 63 74 78 29 3b 0a 09 09 09 09  &sha1_ctx);.....
18d30 53 48 41 31 49 6e 70 75 74 28 26 73 68 61 31 5f  SHA1Input(&sha1_
18d40 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74 65  ctx, certificate
18d50 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
18d60 6e 29 3b 0a 09 09 09 09 53 48 41 31 52 65 73 75  n);.....SHA1Resu
18d70 6c 74 28 26 73 68 61 31 5f 63 74 78 2c 20 73 68  lt(&sha1_ctx, sh
18d80 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 70  a1_hash);......p
18d90 56 61 6c 75 65 20 3d 20 73 68 61 31 5f 68 61 73  Value = sha1_has
18da0 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  h;.....ulValueLe
18db0 6e 20 3d 20 73 69 7a 65 6f 66 28 73 68 61 31 5f  n = sizeof(sha1_
18dc0 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b  hash);......CACK
18dd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18de0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
18df0 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
18e00 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18e10 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18e20 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18e30 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f 48  e CKA_CERT_MD5_H
18e40 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ASH:.....CACKEY_
18e50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18e60 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
18e70 74 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f  te CKA_CERT_MD5_
18e80 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e  HASH (0x%08lx) .
18e90 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18ea0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18eb0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
18ec0 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
18ed0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
18ee0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
18ef0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18f00 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
18f10 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
18f20 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63   are not a Netsc
18f30 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
18f40 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
18f50 0a 09 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35 49  .....}......MD5I
18f60 6e 69 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a 09  nit(&md5_ctx);..
18f70 09 09 09 4d 44 35 55 70 64 61 74 65 28 26 6d 64  ...MD5Update(&md
18f80 35 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63 61  5_ctx, certifica
18f90 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
18fa0 6c 65 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69 6e  len);.....MD5Fin
18fb0 61 6c 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d 64  al(md5_hash, &md
18fc0 35 5f 63 74 78 29 3b 0a 0a 09 09 09 09 70 56 61  5_ctx);......pVa
18fd0 6c 75 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b 0a  lue = md5_hash;.
18fe0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18ff0 20 73 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73 68   sizeof(md5_hash
19000 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
19010 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
19020 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
19030 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
19040 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
19050 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
19060 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c 74  reak;....default
19070 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  :.....pValue = N
19080 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ULL;.....ulValue
19090 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
190a0 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  -1;.....break;..
190b0 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f 4c  .}....if (((CK_L
190c0 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ONG) ulValueLen)
190d0 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20 2d   != ((CK_LONG) -
190e0 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73 68  1)) {..../* Push
190f0 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f 20   curr_attr onto 
19100 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09 09  the stack */....
19110 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20 3d  curr_attr.type =
19120 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 3b   curr_attr_type;
19130 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75 6c  ....curr_attr.ul
19140 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61 6c  ValueLen = ulVal
19150 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72 5f  ueLen;.....curr_
19160 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d 61  attr.pValue = ma
19170 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e 75  lloc(curr_attr.u
19180 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 6d  lValueLen);....m
19190 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2e  emcpy(curr_attr.
191a0 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20  pValue, pValue, 
191b0 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75  curr_attr.ulValu
191c0 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28 70  eLen);.....if (p
191d0 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70 56  Value_free && pV
191e0 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65 65  alue) {.....free
191f0 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a 0a  (pValue);....}..
19200 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73 20  ...if (numattrs 
19210 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 29  >= retval_count)
19220 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20   {.....retval = 
19230 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20  realloc(retval, 
19240 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73  retval_count * s
19250 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b  izeof(*retval));
19260 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70 79  ....}.....memcpy
19270 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74 72  (&retval[numattr
19280 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72 2c 20  s], &curr_attr, 
19290 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74 74 72  sizeof(curr_attr
192a0 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73 2b  ));....numattrs+
192b0 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  +;...}..}...if (
192c0 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29 20 7b  numattrs != 0) {
192d0 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20  ...retval_count 
192e0 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72 65  = numattrs;...re
192f0 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72  tval = realloc(r
19300 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f  etval, retval_co
19310 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65  unt * sizeof(*re
19320 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65 20  tval));..} else 
19330 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61 6c 29  {...free(retval)
19340 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e 55  ;....retval = NU
19350 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f 75  LL;..}...*pulCou
19360 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 0a  nt = numattrs;..
19370 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19380 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
19390 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25 70 29  %lu objects (%p)
193a0 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20 28 76  .", numattrs, (v
193b0 6f 69 64 20 2a 29 20 72 65 74 76 61 6c 29 3b 0a  oid *) retval);.
193c0 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
193d0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
193e0 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65   cackey_free_ide
193f0 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
19400 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
19410 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69  identities, unsi
19420 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69  gned long identi
19430 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 43  ties_count) {..C
19440 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
19450 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e 65  r_attr;..unsigne
19460 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20 61  d long id_idx, a
19470 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28 69  ttr_idx;...if (i
19480 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c  dentities == NUL
19490 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73 5f  L || identities_
194a0 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  count == 0) {...
194b0 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72  return;..}...for
194c0 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69 64   (id_idx = 0; id
194d0 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65  _idx < identitie
194e0 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78 2b  s_count; id_idx+
194f0 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74  +) {...if (ident
19500 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
19510 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 66  tributes) {....f
19520 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20 30  or (attr_idx = 0
19530 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64 65  ; attr_idx < ide
19540 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
19550 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
19560 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  ; attr_idx++) {.
19570 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
19580 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  &identities[id_i
19590 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b 61  dx].attributes[a
195a0 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09 69  ttr_idx];......i
195b0 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  f (curr_attr->pV
195c0 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65  alue) {......fre
195d0 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  e(curr_attr->pVa
195e0 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  lue);.....}....}
195f0 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69 74  .....if (identit
19600 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
19610 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66 72  ibutes) {.....fr
19620 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ee(identities[id
19630 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
19640 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  );....}.....cack
19650 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69 64  ey_free_certs(id
19660 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
19670 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20  .pcsc_identity, 
19680 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  1, 1);...}..}...
19690 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 29  free(identities)
196a0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  ;.}..static unsi
196b0 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79  gned long cackey
196c0 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
196d0 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63 6b  ties(struct cack
196e0 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
196f0 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e 65  ntities, unsigne
19700 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f 63  d long num_dod_c
19710 65 72 74 73 29 20 7b 0a 09 75 6e 73 69 67 6e 65  erts) {..unsigne
19720 64 20 6c 6f 6e 67 20 63 65 72 74 5f 69 64 78 2c  d long cert_idx,
19730 20 69 64 5f 69 64 78 20 3d 20 30 3b 0a 0a 09 69   id_idx = 0;...i
19740 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d  f (identities ==
19750 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
19760 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20  n(num_dod_certs 
19770 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  * 3);..}...for (
19780 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65  cert_idx = 0; ce
19790 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 64 6f 64  rt_idx < num_dod
197a0 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78  _certs; cert_idx
197b0 2b 2b 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 69  ++) {...identiti
197c0 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
197d0 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b  identity = NULL;
197e0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
197f0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
19800 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74   = cackey_get_at
19810 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 43 45 52  tributes(CKO_CER
19820 54 49 46 49 43 41 54 45 2c 20 26 65 78 74 72 61  TIFICATE, &extra
19830 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d  _certs[cert_idx]
19840 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f  , 0xf000 | cert_
19850 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
19860 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
19870 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64  tes_count);...id
19880 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74  _idx++;....ident
19890 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
198a0 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55  sc_identity = NU
198b0 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73  LL;...identities
198c0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
198d0 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74  tes = cackey_get
198e0 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f  _attributes(CKO_
198f0 50 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78 74  PUBLIC_KEY, &ext
19900 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64  ra_certs[cert_id
19910 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72  x], 0xf000 | cer
19920 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69  t_idx, &identiti
19930 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
19940 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  butes_count);...
19950 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65  id_idx++;....ide
19960 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
19970 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20  pcsc_identity = 
19980 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69  NULL;...identiti
19990 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
199a0 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
199b0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  et_attributes(CK
199c0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
199d0 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63  , &extra_certs[c
199e0 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30  ert_idx], 0xf000
199f0 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64   | cert_idx, &id
19a00 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
19a10 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
19a20 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  t);...id_idx++;.
19a30 09 7d 0a 0a 09 72 65 74 75 72 6e 28 69 64 5f 69  .}...return(id_i
19a40 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73  dx);.}..static s
19a50 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
19a60 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
19a70 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74  ad_identities(st
19a80 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
19a90 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
19aa0 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e 64   long *ids_found
19ab0 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  ) {..struct cack
19ac0 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
19ad0 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   *pcsc_identitie
19ae0 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  s;..struct cacke
19af0 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e  y_identity *iden
19b00 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
19b10 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c 20  d long num_ids, 
19b20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69 64 5f  id_idx, curr_id_
19b30 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20  type;..unsigned 
19b40 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c 20  long num_certs, 
19b50 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 2c 20 63  num_dod_certs, c
19b60 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74 20 69 6e  ert_idx;..int in
19b70 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
19b80 73 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f  s = 0;...CACKEY_
19b90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
19ba0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 69  lled.");...if (i
19bb0 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c 4c  ds_found == NULL
19bc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
19bd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
19be0 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73 20  .  ids_found is 
19bf0 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
19c00 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69 66  n(NULL);..}..#if
19c10 64 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44 5f  def CACKEY_CARD_
19c20 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58 54  SLOT_INCLUDE_EXT
19c30 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75 64  RA_CERTS..includ
19c40 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20  e_extra_certs = 
19c50 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28  1;.#endif...if (
19c60 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
19c70 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53  OD_CERTS_ON_HW_S
19c80 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  LOTS") != NULL) 
19c90 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  {...include_extr
19ca0 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a  a_certs = 1;..}.
19cb0 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41  ..if (getenv("CA
19cc0 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52 54  CKEY_NO_DOD_CERT
19cd0 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20  S_ON_HW_SLOTS") 
19ce0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
19cf0 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
19d00 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67   = 0;..}...if (g
19d10 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f  etenv("CACKEY_NO
19d20 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
19d30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6e 75 6d 5f  = NULL) {...num_
19d40 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09  dod_certs = 0;..
19d50 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f 64  } else {...num_d
19d60 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65 6f  od_certs = sizeo
19d70 66 28 65 78 74 72 61 5f 63 65 72 74 73 29 20 2f  f(extra_certs) /
19d80 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65   sizeof(extra_ce
19d90 72 74 73 5b 30 5d 29 3b 0a 09 7d 0a 0a 09 69 66  rts[0]);..}...if
19da0 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c   (slot->internal
19db0 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d 20  ) {...num_ids = 
19dc0 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f  cackey_read_dod_
19dd0 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c  identities(NULL,
19de0 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
19df0 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73 20  ....if (num_ids 
19e00 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e 74  != 0) {....ident
19e10 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e  ities = malloc(n
19e20 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28  um_ids * sizeof(
19e30 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a  *identities));..
19e40 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  ...cackey_read_d
19e50 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64  od_identities(id
19e60 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64 6f  entities, num_do
19e70 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65 6c  d_certs);...} el
19e80 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74 69  se {....identiti
19e90 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a  es = NULL;...}..
19ea0 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e  ..*ids_found = n
19eb0 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72  um_ids;....retur
19ec0 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09  n(identities);..
19ed0 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69 74  }...pcsc_identit
19ee0 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
19ef0 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e 55  d_certs(slot, NU
19f00 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b  LL, &num_certs);
19f10 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74  ..if (pcsc_ident
19f20 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  ities != NULL) {
19f30 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e 75  .../* Convert nu
19f40 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 74 6f  mber of Certs to
19f50 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
19f60 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73 20  ts */...num_ids 
19f70 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  = (CKO_PRIVATE_K
19f80 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46 49  EY - CKO_CERTIFI
19f90 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d 5f  CATE + 1) * num_
19fa0 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69 6e  certs;....if (in
19fb0 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
19fc0 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73 20  s) {....num_ids 
19fd0 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  += cackey_read_d
19fe0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55  od_identities(NU
19ff0 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  LL, num_dod_cert
1a000 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e 74  s);...}....ident
1a010 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28 6e  ities = malloc(n
1a020 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66 28  um_ids * sizeof(
1a030 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a 0a  *identities));..
1a040 09 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66 69  ../* Add certifi
1a050 63 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b 65  cates, public ke
1a060 79 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65 20  ys, and private 
1a070 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73 6d  keys from the sm
1a080 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64 5f  artcard */...id_
1a090 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20 28  idx = 0;...for (
1a0a0 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63 65  cert_idx = 0; ce
1a0b0 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65 72  rt_idx < num_cer
1a0c0 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20  ts; cert_idx++) 
1a0d0 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f 69  {....for (curr_i
1a0e0 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45 52  d_type = CKO_CER
1a0f0 54 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f 69  TIFICATE; curr_i
1a100 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50 52  d_type <= CKO_PR
1a110 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72 5f  IVATE_KEY; curr_
1a120 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09 09  id_type++) {....
1a130 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1a140 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d  dx].attributes =
1a150 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
1a160 69 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f 74  ibutes(curr_id_t
1a170 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e 74  ype, &pcsc_ident
1a180 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c  ities[cert_idx],
1a190 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
1a1a0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1a1b0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
1a1c0 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
1a1d0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1a1e0 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63  dentity = malloc
1a1f0 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74  (sizeof(*identit
1a200 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1a210 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09 09  _identity));....
1a220 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69  .memcpy(identiti
1a230 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1a240 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63 5f  identity, &pcsc_
1a250 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1a260 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69 64  idx], sizeof(*id
1a270 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1a280 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29  .pcsc_identity))
1a290 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65  ;......identitie
1a2a0 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
1a2b0 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69  dentity->certifi
1a2c0 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 63  cate = malloc(pc
1a2d0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1a2e0 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1a2f0 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
1a300 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73 5b  mcpy(identities[
1a310 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1a320 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
1a330 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74  te, pcsc_identit
1a340 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65  ies[cert_idx].ce
1a350 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f  rtificate, 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 0a 09 09 09 09 69 64 5f 69  _len);......id_i
1a390 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  dx++;....}...}..
1a3a0 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78  ..if (include_ex
1a3b0 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  tra_certs) {....
1a3c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a3d0 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 55  NTF("Including U
1a3e0 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72  S Government Cer
1a3f0 74 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61 72  tificates on har
1a400 64 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a 09  dware slot");...
1a410 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  ..cackey_read_do
1a420 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64 65  d_identities(ide
1a430 6e 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64 78  ntities + id_idx
1a440 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1a450 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
1a460 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63 5f  free_certs(pcsc_
1a470 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f  identities, num_
1a480 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a 69  certs, 1);....*i
1a490 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69  ds_found = num_i
1a4a0 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64  ds;....return(id
1a4b0 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 0a  entities);..}...
1a4c0 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30 3b  .*ids_found = 0;
1a4d0 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
1a4e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1a4f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
1a500 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56 4f  nitialize)(CK_VO
1a510 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67 73  ID_PTR pInitArgs
1a520 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49 41  ) {..CK_C_INITIA
1a530 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54 52  LIZE_ARGS CK_PTR
1a540 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f 74   args;..uint32_t
1a550 20 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73 6c   idx, highest_sl
1a560 6f 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 69  ot;..int mutex_i
1a570 6e 69 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  nit_ret;...CACKE
1a580 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a590 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1a5a0 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  (cackey_initiali
1a5b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1a5c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1a5d0 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69 6e  ror.  Already in
1a5e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1a5f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1a600 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e 49  TOKI_ALREADY_INI
1a610 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1a620 69 66 20 28 70 49 6e 69 74 41 72 67 73 20 21 3d  if (pInitArgs !=
1a630 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73 20   NULL) {...args 
1a640 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09 6d  = pInitArgs;...m
1a650 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61 72  emcpy(&cackey_ar
1a660 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f 66  gs, args, sizeof
1a670 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b 0a  (cackey_args));.
1a680 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65  ...if (args->Cre
1a690 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ateMutex == NULL
1a6a0 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f   || args->Destro
1a6b0 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c  yMutex == NULL |
1a6c0 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65  | args->LockMute
1a6d0 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x == NULL || arg
1a6e0 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d  s->UnlockMutex =
1a6f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20  = NULL) {....if 
1a700 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74  (args->CreateMut
1a710 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
1a720 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78  gs->DestroyMutex
1a730 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   != NULL || args
1a740 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e  ->LockMutex != N
1a750 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c  ULL || args->Unl
1a760 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  ockMutex != NULL
1a770 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
1a780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1a790 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e 6f  or. Some, but no
1a7a0 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67 20  t All threading 
1a7b0 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69  primitives provi
1a7c0 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  ded.");......ret
1a7d0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1a7e0 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09 7d  S_BAD);....}...}
1a7f0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61 63  ..} else {...cac
1a800 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
1a810 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  utex = NULL;...c
1a820 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74 72  ackey_args.Destr
1a830 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  oyMutex = NULL;.
1a840 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f  ..cackey_args.Lo
1a850 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  ckMutex = NULL;.
1a860 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e  ..cackey_args.Un
1a870 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  lockMutex = NULL
1a880 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  ;...cackey_args.
1a890 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09  flags = 0;..}...
1a8a0 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
1a8b0 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
1a8c0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1a8d0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1a8e0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
1a8f0 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  +) {...cackey_se
1a900 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
1a910 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72  ve = 0;..}...for
1a920 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
1a930 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1a940 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1a950 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1a960 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
1a970 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1a980 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63 61  active = 0;...ca
1a990 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1a9a0 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55  pcsc_reader = NU
1a9b0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  LL;...cackey_slo
1a9c0 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74  ts[idx].transact
1a9d0 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09  ion_depth = 0;..
1a9e0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1a9f0 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  x].transaction_n
1aa00 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b  eed_hw_lock = 0;
1aa10 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1aa20 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 20  idx].slot_reset 
1aa30 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1aa40 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f 66  ots[idx].token_f
1aa50 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63 6b  lags = 0;...cack
1aa60 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61  ey_slots[idx].la
1aa70 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  bel = NULL;...ca
1aa80 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1aa90 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09 7d  internal = 0;..}
1aaa0 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1aab0 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
1aac0 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
1aad0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1aae0 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20 6e  _PRINTF("Asked n
1aaf0 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 44 6f  ot to include Do
1ab00 44 20 63 65 72 74 69 66 69 63 61 74 65 73 22 29  D certificates")
1ab10 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68 69  ;..} else {...hi
1ab20 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73 69  ghest_slot = (si
1ab30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1ab40 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1ab50 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d 20  ey_slots[0])) - 
1ab60 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  1;....CACKEY_DEB
1ab70 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75  UG_PRINTF("Inclu
1ab80 64 69 6e 67 20 44 6f 44 20 63 65 72 74 73 20 69  ding DoD certs i
1ab90 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e  n slot %lu", (un
1aba0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69 67  signed long) hig
1abb0 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09 63  hest_slot);....c
1abc0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1abd0 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76 65  est_slot].active
1abe0 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 1;...cackey_s
1abf0 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1ac00 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31 3b  t].internal = 1;
1ac10 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1ac20 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c 61  highest_slot].la
1ac30 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  bel = (unsigned 
1ac40 63 68 61 72 20 2a 29 20 22 55 53 20 47 6f 76 65  char *) "US Gove
1ac50 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61  rnment Certifica
1ac60 74 65 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73  tes";...cackey_s
1ac70 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f  lots[highest_slo
1ac80 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d  t].pcsc_reader =
1ac90 20 22 43 41 43 4b 65 79 22 3b 0a 09 09 63 61 63   "CACKey";...cac
1aca0 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1acb0 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  t_slot].token_fl
1acc0 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63 61  ags = 0;..}...ca
1acd0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1ace0 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61 63   = 1;...if (!cac
1acf0 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
1ad00 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69 74  ) {...mutex_init
1ad10 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d 75  _ret = cackey_mu
1ad20 74 65 78 5f 63 72 65 61 74 65 28 26 63 61 63 6b  tex_create(&cack
1ad30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1ad40 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f 72  if (mutex_init_r
1ad50 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  et != 0) {....CA
1ad60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ad70 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65 78  F("Error.  Mutex
1ad80 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1ad90 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 72  failed.");.....r
1ada0 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f 4c  eturn(CKR_CANT_L
1adb0 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  OCK);...}....cac
1adc0 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74  key_biglock_init
1add0 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45   = 1;..}...CACKE
1ade0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1adf0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1ae00 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1ae10 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1ae20 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1ae30 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1ae40 43 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f 56  C_Finalize)(CK_V
1ae50 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65  OID_PTR pReserve
1ae60 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  d) {..uint32_t i
1ae70 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
1ae80 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1ae90 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73  d.");...if (pRes
1aea0 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  erved != NULL) {
1aeb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1aec0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1aed0 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20  Reserved is not 
1aee0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1aef0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1af00 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1af10 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1af20 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1af30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1af40 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1af50 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1af60 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1af70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1af80 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
1af90 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
1afa0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1afb0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1afc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1afd0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
1afe0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
1aff0 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20  ns[idx].active) 
1b000 7b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73  {....C_CloseSess
1b010 69 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09 7d  ion(idx);...}..}
1b020 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
1b030 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
1b040 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  ;...for (idx = 0
1b050 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
1b060 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1b070 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b080 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
1b090 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
1b0a0 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72  slots[idx].inter
1b0b0 6e 61 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69 6e  nal) {....contin
1b0c0 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63  ue;...}....if (c
1b0d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1b0e0 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b 0a  .pcsc_reader) {.
1b0f0 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
1b100 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
1b110 65 61 64 65 72 29 3b 0a 09 09 7d 0a 0a 09 09 69  eader);...}....i
1b120 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1b130 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74  idx].cached_cert
1b140 73 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66  s) {....cackey_f
1b150 72 65 65 5f 63 65 72 74 73 28 63 61 63 6b 65 79  ree_certs(cackey
1b160 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68  _slots[idx].cach
1b170 65 64 5f 63 65 72 74 73 2c 20 63 61 63 6b 65 79  ed_certs, cackey
1b180 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68  _slots[idx].cach
1b190 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20  ed_certs_count, 
1b1a0 31 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  1);.....cackey_s
1b1b0 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64  lots[idx].cached
1b1c0 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09  _certs = NULL;..
1b1d0 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 70  .}..}...cackey_p
1b1e0 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
1b1f0 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69  ;...cackey_initi
1b200 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43 41  alized = 0;...CA
1b210 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b220 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1b230 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1b240 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1b250 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1b260 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1b270 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43 4b  V, C_GetInfo)(CK
1b280 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
1b290 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
1b2a0 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74 75  F8CHAR manufactu
1b2b0 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20  rerID[] = "U.S. 
1b2c0 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74  Government";..st
1b2d0 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1b2e0 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74   libraryDescript
1b2f0 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 22  ion[] = "CACKey"
1b300 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1b310 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1b320 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20  ");...if (pInfo 
1b330 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1b340 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b350 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69  ("Error. pInfo i
1b360 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1b370 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1b380 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1b390 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
1b3a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
1b3b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b3c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
1b3d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
1b3e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
1b3f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
1b400 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d  ED);..}...pInfo-
1b410 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
1b420 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b 45  .major = ((CACKE
1b430 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
1b440 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29 20  ON_CODE) >> 16) 
1b450 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
1b460 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e 2e  cryptokiVersion.
1b470 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45 59  minor = ((CACKEY
1b480 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f  _CRYPTOKI_VERSIO
1b490 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26 20  N_CODE) >> 8) & 
1b4a0 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0xff;...memset(p
1b4b0 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1b4c0 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
1b4d0 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
1b4e0 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
1b4f0 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
1b500 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
1b510 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
1b520 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
1b530 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   - 1);...pInfo->
1b540 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a 09  flags = 0x00;...
1b550 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 69  memset(pInfo->li
1b560 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1b570 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1b580 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
1b590 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63  ription));..memc
1b5a0 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72  py(pInfo->librar
1b5b0 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c 69  yDescription, li
1b5c0 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1b5d0 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72 79  , sizeof(library
1b5e0 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31  Description) - 1
1b5f0 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72  );...pInfo->libr
1b600 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  aryVersion.major
1b610 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65   = (cackey_getve
1b620 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26  rsion() >> 16) &
1b630 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 6c   0xff;..pInfo->l
1b640 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 69  ibraryVersion.mi
1b650 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65  nor = (cackey_ge
1b660 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29  tversion() >> 8)
1b670 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
1b680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b690 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1b6a0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1b6b0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1b6c0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f 63  );.}../*. * Proc
1b6d0 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61 64  ess list of read
1b6e0 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65 20  ers, and create 
1b6f0 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20  mapping between 
1b700 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64 20  reader name and 
1b710 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f 44  slot ID. */.CK_D
1b720 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1b730 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 4c  K_RV, C_GetSlotL
1b740 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74 6f  ist)(CK_BBOOL to
1b750 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f 53  kenPresent, CK_S
1b760 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74  LOT_ID_PTR pSlot
1b770 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  List, CK_ULONG_P
1b780 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  TR pulCount) {..
1b790 73 74 61 74 69 63 20 69 6e 74 20 66 69 72 73 74  static int first
1b7a0 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74 20  _call = 1;..int 
1b7b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
1b7c0 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  nt pcsc_connect_
1b7d0 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63  ret;..CK_ULONG c
1b7e0 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74  ount, slot_count
1b7f0 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 2c 20   = 0, currslot, 
1b800 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68 61 72 20  slot_idx;..char 
1b810 2a 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 2a  *pcsc_readers, *
1b820 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 2c 20  pcsc_readers_s, 
1b830 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 3b  *pcsc_readers_e;
1b840 0a 09 44 57 4f 52 44 20 70 63 73 63 5f 72 65 61  ..DWORD pcsc_rea
1b850 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20  ders_len;..LONG 
1b860 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1b870 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 63  s_ret;..size_t c
1b880 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b 0a  urr_reader_len;.
1b890 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b  .int slot_reset;
1b8a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b8b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1b8c0 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e  );...if (pulCoun
1b8d0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
1b8e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b8f0 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 43 6f  TF("Error. pulCo
1b900 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  unt is NULL.");.
1b910 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1b920 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1b930 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1b940 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1b950 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b960 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1b970 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1b980 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1b990 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1b9a0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 6d  IALIZED);..}...m
1b9b0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1b9c0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1b9d0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1b9e0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1b9f0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1ba00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ba10 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1ba20 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1ba30 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1ba40 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1ba50 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74 20 6f 66  /* Clear list of
1ba60 20 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74 5f   slots */..slot_
1ba70 72 65 73 65 74 20 3d 20 30 3b 0a 09 69 66 20 28  reset = 0;..if (
1ba80 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 69  pSlotList) {...i
1ba90 66 20 28 66 69 72 73 74 5f 63 61 6c 6c 29 20 7b  f (first_call) {
1baa0 0a 09 09 09 66 69 72 73 74 5f 63 61 6c 6c 20 3d  ....first_call =
1bab0 20 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72 65 73   0;.....slot_res
1bac0 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09 2f  et = 1;...}..../
1bad0 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20  * If any of the 
1bae0 73 6c 6f 74 73 20 68 61 76 65 20 62 65 65 6e 20  slots have been 
1baf0 72 65 73 65 74 20 74 68 65 6e 20 70 75 72 67 65  reset then purge
1bb00 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
1bb10 20 61 6e 64 20 63 68 65 63 6b 20 61 67 61 69 6e   and check again
1bb20 20 2a 2f 0a 09 09 66 6f 72 20 28 63 75 72 72 73   */...for (currs
1bb30 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
1bb40 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
1bb50 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1bb60 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1bb70 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
1bb80 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65  ) {....if (cacke
1bb90 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1bba0 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
1bbb0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
1bbc0 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
1bbd0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1bbe0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  .active) {.....c
1bbf0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
1bc00 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1bc10 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c 6f  ts[currslot].slo
1bc20 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09 73  t_reset) {.....s
1bc30 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 0a  lot_reset = 1;..
1bc40 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
1bc50 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f  ..}....if (slot_
1bc60 72 65 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b  reset) {....CACK
1bc70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bc80 22 50 75 72 67 69 6e 67 20 61 6c 6c 20 73 6c 6f  "Purging all slo
1bc90 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22 29  t information.")
1bca0 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70  ;...../* Only up
1bcb0 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66  date the list of
1bcc0 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65   slots if we are
1bcd0 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
1bce0 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20  supply the slot 
1bcf0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09  information */..
1bd00 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
1bd10 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
1bd20 0a 0a 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c  .....for (currsl
1bd30 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
1bd40 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1bd50 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1bd60 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1bd70 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
1bd80 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65   {.....if (cacke
1bd90 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1bda0 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
1bdb0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
1bdc0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b  .}......if (cack
1bdd0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1bde0 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20  t].pcsc_reader) 
1bdf0 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63 6b  {......free(cack
1be00 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1be10 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t].pcsc_reader);
1be20 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1be30 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
1be40 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c 4c  sc_reader = NULL
1be50 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
1be60 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  (cackey_slots[cu
1be70 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20 7b  rrslot].label) {
1be80 0a 09 09 09 09 09 66 72 65 65 28 63 61 63 6b 65  ......free(cacke
1be90 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1bea0 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09 09  ].label);.......
1beb0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1bec0 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e  rslot].label = N
1bed0 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  ULL;.....}......
1bee0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1bef0 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  rslot].active = 
1bf00 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  0;....}...} else
1bf10 20 7b 0a 09 09 09 0a 09 09 7d 0a 09 7d 0a 0a 09   {.......}..}...
1bf20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6c 69 73  /* Determine lis
1bf30 74 20 6f 66 20 72 65 61 64 65 72 73 20 2a 2f 0a  t of readers */.
1bf40 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
1bf50 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
1bf60 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20 28  connect();..if (
1bf70 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
1bf80 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
1bf90 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
1bfa0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1bfb0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f  onnection to PC/
1bfc0 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  SC failed, assum
1bfd0 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b 0a  ing no slots");.
1bfe0 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20  ...slot_count = 
1bff0 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 70  0;..} else {...p
1c000 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 20  csc_readers_len 
1c010 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c 69  = 0;....scard_li
1c020 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 20  streaders_ret = 
1c030 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1c040 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
1c050 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ndle, NULL, NULL
1c060 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f  , &pcsc_readers_
1c070 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  len);....if (sca
1c080 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1c090 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43 4f  et == SCARD_F_CO
1c0a0 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09 43  MM_ERROR) {....C
1c0b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c0c0 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72 64  TF("Error. SCard
1c0d0 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72 65  ListReaders() re
1c0e0 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f 43  turned SCARD_F_C
1c0f0 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75 6d  OMM_ERROR, assum
1c100 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74  ing Connection t
1c110 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77 61  o PC/SC went awa
1c120 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67 2e  y. Reconnecting.
1c130 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 70  ");.....cackey_p
1c140 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28 29  csc_disconnect()
1c150 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63  ;....cackey_pcsc
1c160 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09 09  _connect();.....
1c170 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c180 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61 72  NTF("Trying SCar
1c190 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 61  dListReaders() a
1c1a0 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72 64  gain");....scard
1c1b0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1c1c0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
1c1d0 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
1c1e0 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e  _handle, NULL, N
1c1f0 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ULL, &pcsc_reade
1c200 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09 09  rs_len);...}....
1c210 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
1c220 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
1c230 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26 20  RD_S_SUCCESS && 
1c240 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1c250 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73 63   != 0) {....pcsc
1c260 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c 6f  _readers = mallo
1c270 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  c(pcsc_readers_l
1c280 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65 61  en);....pcsc_rea
1c290 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72 65  ders_s = pcsc_re
1c2a0 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72 64  aders;.....scard
1c2b0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1c2c0 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61 64   = SCardListRead
1c2d0 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ers(*cackey_pcsc
1c2e0 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 70  _handle, NULL, p
1c2f0 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70 63  csc_readers, &pc
1c300 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1c310 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
1c320 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
1c330 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
1c340 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65 61  ) {.....pcsc_rea
1c350 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72 65  ders_e = pcsc_re
1c360 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65 61  aders + pcsc_rea
1c370 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09 2f  ders_len;....../
1c380 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c 6f  * Start with Slo
1c390 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69 64  t ID 1, to avoid
1c3a0 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f 6e   a bug in GDM on
1c3b0 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a 20   RHEL */...../* 
1c3c0 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74 70  Bug 594911: http
1c3d0 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65 64  s://bugzilla.red
1c3e0 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75 67  hat.com/show_bug
1c3f0 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20 2a  .cgi?id=594911 *
1c400 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20 3d  /.....currslot =
1c410 20 31 3b 0a 09 09 09 09 73 6c 6f 74 5f 63 6f 75   1;.....slot_cou
1c420 6e 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69 6c  nt = 0;.....whil
1c430 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73 20  e (pcsc_readers 
1c440 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  < pcsc_readers_e
1c450 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e 64  ) {....../* Find
1c460 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   next available 
1c470 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f 72  slot */......for
1c480 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28   (; currslot < (
1c490 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1c4a0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1c4b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1c4c0 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09   currslot++) {..
1c4d0 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
1c4e0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c4f0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09  .active) {......
1c500 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d  ..break;.......}
1c510 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63 75  ......}.......cu
1c520 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20  rr_reader_len = 
1c530 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61 64  strlen(pcsc_read
1c540 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20 28  ers);.......if (
1c550 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20  (pcsc_readers + 
1c560 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 29  curr_reader_len)
1c570 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   > pcsc_readers_
1c580 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  e) {.......break
1c590 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
1c5a0 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  f (curr_reader_l
1c5b0 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09  en == 0) {......
1c5c0 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a  .break;......}..
1c5d0 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c 6f  .....if (currslo
1c5e0 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  t >= (sizeof(cac
1c5f0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1c600 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1c610 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09 43  [0]))) {.......C
1c620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c630 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20 72  TF("Found more r
1c640 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f 74  eaders than slot
1c650 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 21  s are available!
1c660 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  ");........break
1c670 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 43  ;......}.......C
1c680 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c690 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65 72  TF("Found reader
1c6a0 3a 20 25 73 22 2c 20 70 63 73 63 5f 72 65 61 64  : %s", pcsc_read
1c6b0 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20 4f  ers);......./* O
1c6c0 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20 6c  nly update the l
1c6d0 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20  ist of slots if 
1c6e0 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  we are actually 
1c6f0 62 65 69 6e 67 20 61 73 6b 65 64 20 73 75 70 70  being asked supp
1c700 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f  ly the slot info
1c710 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09  rmation */......
1c720 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b  if (pSlotList) {
1c730 0a 09 09 09 09 09 09 69 66 20 28 73 6c 6f 74 5f  .......if (slot_
1c740 72 65 73 65 74 29 20 7b 0a 09 09 09 09 09 09 09  reset) {........
1c750 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1c760 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20  rslot].active = 
1c770 31 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  1;........cackey
1c780 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c790 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09  .internal = 0;..
1c7a0 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1c7b0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
1c7c0 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64 75  c_reader = strdu
1c7d0 70 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b  p(pcsc_readers);
1c7e0 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
1c7f0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70  lots[currslot].p
1c800 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
1c810 65 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63  ed = 0;........c
1c820 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1c830 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f  slot].transactio
1c840 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09 09  n_depth = 0;....
1c850 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1c860 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73  [currslot].trans
1c870 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
1c880 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 09 09 09 09  ock = 0;........
1c890 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1c8a0 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  rslot].token_fla
1c8b0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
1c8c0 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09 09  EQUIRED;........
1c8d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1c8e0 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 4e  rslot].label = N
1c8f0 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 09 63 61 63  ULL;.........cac
1c900 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
1c910 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  set(&cackey_slot
1c920 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a 09 09  s[currslot]);...
1c930 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73  ....}......} els
1c940 65 20 7b 0a 09 09 09 09 09 09 2f 2a 20 41 72 74  e {......./* Art
1c950 69 66 69 63 69 61 6c 6c 79 20 69 6e 63 72 65 61  ificially increa
1c960 73 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  se the number of
1c970 20 61 63 74 69 76 65 20 73 6c 6f 74 73 20 62 79   active slots by
1c980 20 77 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   what will becom
1c990 65 20 61 63 74 69 76 65 20 2a 2f 0a 09 09 09 09  e active */.....
1c9a0 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a  ..slot_count++;.
1c9b0 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75 72 72  .....}......curr
1c9c0 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 70 63  slot++;.......pc
1c9d0 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63 75  sc_readers += cu
1c9e0 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b 20  rr_reader_len + 
1c9f0 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66 6f  1;.....}......fo
1ca00 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
1ca10 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
1ca20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1ca30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1ca40 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
1ca50 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09  rrslot++) {.....
1ca60 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1ca70 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69  s[currslot].acti
1ca80 76 65 29 20 7b 0a 09 09 09 09 09 09 43 41 43 4b  ve) {.......CACK
1ca90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1caa0 22 46 6f 75 6e 64 20 61 63 74 69 76 65 20 73 6c  "Found active sl
1cab0 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  ot %lu", (unsign
1cac0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c 6f  ed long) currslo
1cad0 74 29 3b 0a 0a 09 09 09 09 09 09 73 6c 6f 74 5f  t);........slot_
1cae0 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a  count++;......}.
1caf0 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
1cb00 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
1cb10 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 6f 6e  UG_PRINTF("Secon
1cb20 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64 4c  d call to SCardL
1cb30 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c 65  istReaders faile
1cb40 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c 69  d, return %s/%li
1cb50 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
1cb60 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
1cb70 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74 72  _STR(scard_listr
1cb80 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c 6f  eaders_ret), (lo
1cb90 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72 65  ng) scard_listre
1cba0 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 09 7d  aders_ret);....}
1cbb0 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63 5f 72  .....free(pcsc_r
1cbc0 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20 65  eaders_s);...} e
1cbd0 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
1cbe0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69  DEBUG_PRINTF("Fi
1cbf0 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43 61 72  rst call to SCar
1cc00 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69  dListReaders fai
1cc10 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25  led, return %s/%
1cc20 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  li", CACKEY_DEBU
1cc30 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
1cc40 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73  TO_STR(scard_lis
1cc50 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28  treaders_ret), (
1cc60 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74  long) scard_list
1cc70 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09  readers_ret);...
1cc80 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
1cc90 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1cca0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ccb0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1ccc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1ccd0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1cce0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ccf0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
1cd00 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1cd10 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1cd20 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1cd30 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c  pSlotList == NUL
1cd40 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74  L) {...*pulCount
1cd50 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a   = slot_count;..
1cd60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1cd70 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1cd80 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20 46   CKR_OK (%i).  F
1cd90 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72 73  ound %lu readers
1cda0 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72 69 6e  , but not storin
1cdb0 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69 73 74  g IDs (pSlotList
1cdc0 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b 52 5f   == NULL)", CKR_
1cdd0 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  OK, (unsigned lo
1cde0 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b  ng) slot_count);
1cdf0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
1ce00 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20 3d  K);..}...count =
1ce10 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66 20   *pulCount;..if 
1ce20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63 6f  (count < slot_co
1ce30 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  unt) {...CACKEY_
1ce40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ce50 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61  ror. User alloca
1ce60 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c  ted %lu entries,
1ce70 20 62 75 74 20 77 65 20 68 61 76 65 20 25 6c 75   but we have %lu
1ce80 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75 6e   entries.", coun
1ce90 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a  t, slot_count);.
1cea0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ceb0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1cec0 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  g CKR_BUFFER_TOO
1ced0 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  _SMALL");....ret
1cee0 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54  urn(CKR_BUFFER_T
1cef0 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a 0a  OO_SMALL);...}..
1cf00 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1cf10 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1cf20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1cf30 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1cf40 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1cf50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1cf60 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1cf70 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1cf80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1cf90 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1cfa0 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20 30 3b 0a  ..slot_idx = 0;.
1cfb0 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d  .for (currslot =
1cfc0 20 30 3b 20 28 63 75 72 72 73 6c 6f 74 20 3c 20   0; (currslot < 
1cfd0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1cfe0 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1cff0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1d000 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b  ); currslot++) {
1d010 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1d020 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1d030 63 74 69 76 65 29 20 7b 0a 09 09 09 63 6f 6e 74  ctive) {....cont
1d040 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  inue;...}....if 
1d050 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20 63 6f 75  (slot_idx >= cou
1d060 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  nt) {....CACKEY_
1d070 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d080 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63 61  ror. User alloca
1d090 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73 2c  ted %lu entries,
1d0a0 20 62 75 74 20 77 65 20 6a 75 73 74 20 74 72 69   but we just tri
1d0b0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
1d0c0 68 65 20 25 6c 75 20 69 6e 64 65 78 20 2d 2d 20  he %lu index -- 
1d0d0 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f 75 6e 74  ignoring", count
1d0e0 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a 09 09  , slot_idx);....
1d0f0 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
1d100 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73 6c 6f 74  ..pSlotList[slot
1d110 5f 69 64 78 5d 20 3d 20 63 75 72 72 73 6c 6f 74  _idx] = currslot
1d120 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b 2b 3b 0a  ;...slot_idx++;.
1d130 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1d140 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1d150 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1d160 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1d170 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1d180 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1d190 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1d1a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1d1b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1d1c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1d1d0 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f  OR);..}...*pulCo
1d1e0 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74  unt = slot_count
1d1f0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1d200 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1d210 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20  ng CKR_OK (%i). 
1d220 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65   Found %lu reade
1d230 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75  rs.", CKR_OK, (u
1d240 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c  nsigned long) sl
1d250 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65 74  ot_count);...ret
1d260 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 74  urn(CKR_OK);...t
1d270 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20 74 6f  okenPresent = to
1d280 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20 53  kenPresent; /* S
1d290 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76 61  upress unused va
1d2a0 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a  riable warning *
1d2b0 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  /.}..CK_DEFINE_F
1d2c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1d2d0 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43 4b  _GetSlotInfo)(CK
1d2e0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
1d2f0 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50 54   CK_SLOT_INFO_PT
1d300 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
1d310 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 73  ic CK_UTF8CHAR s
1d320 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d  lotDescription[]
1d330 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f 74 22   = "CACKey Slot"
1d340 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1d350 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73 5f  val;..int bytes_
1d360 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b 45  to_copy;...CACKE
1d370 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d380 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1d390 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
1d3a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1d3b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1d3c0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
1d3d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d3e0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1d3f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1d400 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1d410 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d420 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1d430 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1d440 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1d450 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1d460 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1d470 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
1d480 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
1d490 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d4a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1d4b0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1d4c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d4d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1d4e0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1d4f0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
1d500 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
1d510 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
1d520 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
1d530 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
1d540 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1d550 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1d560 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1d570 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1d580 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1d590 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1d5a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1d5b0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1d5c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d5d0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1d5e0 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1d5f0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
1d600 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
1d610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d620 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1d630 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1d640 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
1d650 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
1d660 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
1d670 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1d680 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1d690 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
1d6a0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1d6b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  LID);..}...pInfo
1d6c0 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48 57  ->flags = CKF_HW
1d6d0 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 21 63 61  _SLOT;...if (!ca
1d6e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1d6f0 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  D].internal) {..
1d700 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d  .pInfo->flags |=
1d710 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f 44   CKF_REMOVABLE_D
1d720 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69 66 20 28  EVICE;..}...if (
1d730 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
1d740 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
1d750 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d 20 43  ts[slotID]) == C
1d760 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
1d770 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 70  ENPRESENT) {...p
1d780 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20 43  Info->flags |= C
1d790 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e 54  KF_TOKEN_PRESENT
1d7a0 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74 6f 5f  ;..}...bytes_to_
1d7b0 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 63 61  copy = strlen(ca
1d7c0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1d7d0 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  D].pcsc_reader);
1d7e0 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70 49 6e  ..if (sizeof(pIn
1d7f0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1d800 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63  ID) < bytes_to_c
1d810 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73 5f 74  opy) {...bytes_t
1d820 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66 28  o_copy = sizeof(
1d830 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1d840 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d 63  rerID);..}..memc
1d850 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
1d860 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b 65 79  cturerID, cackey
1d870 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70  _slots[slotID].p
1d880 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79 74 65  csc_reader, byte
1d890 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d 75  s_to_copy);...mu
1d8a0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1d8b0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1d8c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1d8d0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1d8e0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1d8f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d900 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1d910 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1d920 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1d930 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1d940 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1d950 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e  >slotDescription
1d960 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1d970 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
1d980 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28  tion));..memcpy(
1d990 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72  pInfo->slotDescr
1d9a0 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 73 63  iption, slotDesc
1d9b0 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28  ription, sizeof(
1d9c0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29  slotDescription)
1d9d0 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
1d9e0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1d9f0 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
1da00 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
1da10 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09 70 49  cturerID));...pI
1da20 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72  nfo->hardwareVer
1da30 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61  sion.major = (ca
1da40 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
1da50 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
1da60 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
1da70 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
1da80 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1da90 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78  ion() >> 8) & 0x
1daa0 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  ff;...pInfo->fir
1dab0 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  mwareVersion.maj
1dac0 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66  or = 0x00;..pInf
1dad0 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
1dae0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b  on.minor = 0x00;
1daf0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1db00 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1db10 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1db20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1db30 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1db40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1db50 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f 6b  (CK_RV, C_GetTok
1db60 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  enInfo)(CK_SLOT_
1db70 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54 4f  ID slotID, CK_TO
1db80 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e  KEN_INFO_PTR pIn
1db90 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  fo) {..static CK
1dba0 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61  _UTF8CHAR manufa
1dbb0 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e  cturerID[] = "U.
1dbc0 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a  S. Government";.
1dbd0 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1dbe0 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62 65 6c  HAR defaultLabel
1dbf0 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54 6f  [] = "Unknown To
1dc00 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20 43 4b  ken";..static CK
1dc10 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65 6c 5b  _UTF8CHAR model[
1dc20 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22 3b  ] = "CAC Token";
1dc30 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
1dc40 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70  pcsc_identity *p
1dc50 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a  csc_identities;.
1dc60 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
1dc70 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a 65  um_certs;..ssize
1dc80 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09 69  _t label_ret;..i
1dc90 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1dca0 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61 75 6c  ..int use_defaul
1dcb0 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b 45  t_label;...CACKE
1dcc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1dcd0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1dce0 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
1dcf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1dd00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1dd10 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
1dd20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1dd30 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1dd40 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1dd50 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1dd60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1dd70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1dd80 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1dd90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1dda0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1ddb0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1ddc0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
1ddd0 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
1dde0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1ddf0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1de00 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1de10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1de20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1de30 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1de40 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
1de50 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
1de60 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
1de70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
1de80 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
1de90 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1dea0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1deb0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1dec0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1ded0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1dee0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1def0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1df00 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1df10 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1df20 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1df30 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1df40 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
1df50 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
1df60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1df70 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1df80 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1df90 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
1dfa0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
1dfb0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
1dfc0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1dfd0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1dfe0 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
1dff0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1e000 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  LID);..}...if (c
1e010 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73  ackey_token_pres
1e020 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  ent(&cackey_slot
1e030 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43 41  s[slotID]) != CA
1e040 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
1e050 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43 41  NPRESENT) {...CA
1e060 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1e070 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20 70  F("No token is p
1e080 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49 44  resent in slotID
1e090 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44 29   = %lu", slotID)
1e0a0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1e0b0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1e0c0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1e0d0 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e 4f  urn(CKR_TOKEN_NO
1e0e0 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a  T_PRESENT);..}..
1e0f0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1e100 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1e110 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1e120 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1e130 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1e140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e150 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1e160 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1e170 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e180 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1e190 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
1e1a0 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20 66  ne token label f
1e1b0 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74 65 73  rom certificates
1e1c0 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66   */..memset(pInf
1e1d0 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20 73  o->label, ' ', s
1e1e0 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62  izeof(pInfo->lab
1e1f0 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66 61 75  el));..use_defau
1e200 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a 09  lt_label = 1;...
1e210 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1e220 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d  [slotID].label =
1e230 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73 63  = NULL) {...pcsc
1e240 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
1e250 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
1e260 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
1e270 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e 75  otID], NULL, &nu
1e280 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66 20 28  m_certs);...if (
1e290 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
1e2a0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66  != NULL) {....if
1e2b0 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30 29   (num_certs > 0)
1e2c0 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65 74   {.....label_ret
1e2d0 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69   = cackey_pcsc_i
1e2e0 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65 6c  dentity_to_label
1e2f0 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
1e300 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20  , pInfo->label, 
1e310 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
1e320 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20 28 6c  bel));.....if (l
1e330 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b 0a  abel_ret > 0) {.
1e340 09 09 09 09 09 75 73 65 5f 64 65 66 61 75 6c 74  .....use_default
1e350 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09 09  _label = 0;.....
1e360 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
1e370 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 6d  lotID].label = m
1e380 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49 6e  alloc(sizeof(pIn
1e390 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09  fo->label));....
1e3a0 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
1e3b0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
1e3c0 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62  abel, pInfo->lab
1e3d0 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  el, sizeof(pInfo
1e3e0 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 7d  ->label));.....}
1e3f0 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
1e400 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63  _free_certs(pcsc
1e410 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d  _identities, num
1e420 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d 0a  _certs, 1);...}.
1e430 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 63  .} else {...memc
1e440 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  py(pInfo->label,
1e450 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
1e460 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69 7a  otID].label, siz
1e470 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
1e480 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61 75  ));....use_defau
1e490 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09 7d  lt_label = 0;..}
1e4a0 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66 61 75  ...if (use_defau
1e4b0 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09 6d 65  lt_label) {...me
1e4c0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  mcpy(pInfo->labe
1e4d0 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65 6c 2c  l, defaultLabel,
1e4e0 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c 74 4c   sizeof(defaultL
1e4f0 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a 0a  abel) - 1);..}..
1e500 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
1e510 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27  anufacturerID, '
1e520 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1e530 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1e540 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ));..memcpy(pInf
1e550 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1e560 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49  D, manufacturerI
1e570 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61  D, sizeof(manufa
1e580 63 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a  cturerID) - 1);.
1e590 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1e5a0 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65  model, ' ', size
1e5b0 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 29  of(pInfo->model)
1e5c0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1e5d0 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c 20  ->model, model, 
1e5e0 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 2d 20  sizeof(model) - 
1e5f0 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
1e600 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65 72  fo->serialNumber
1e610 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1e620 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65  nfo->serialNumbe
1e630 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49  r));...memset(pI
1e640 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 27 20  nfo->utcTime, ' 
1e650 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1e660 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09 70 49  >utcTime));...pI
1e670 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72  nfo->hardwareVer
1e680 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61  sion.major = (ca
1e690 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
1e6a0 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
1e6b0 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
1e6c0 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  eVersion.minor =
1e6d0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1e6e0 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78  ion() >> 8) & 0x
1e6f0 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  ff;...pInfo->fir
1e700 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  mwareVersion.maj
1e710 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e 66  or = 0x00;..pInf
1e720 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69  o->firmwareVersi
1e730 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30 3b  on.minor = 0x00;
1e740 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1e750 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f 54  = CKF_WRITE_PROT
1e760 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53 45 52  ECTED | CKF_USER
1e770 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _PIN_INITIALIZED
1e780 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e 49   | CKF_TOKEN_INI
1e790 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63 6b 65  TIALIZED | cacke
1e7a0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1e7b0 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 70  token_flags;...p
1e7c0 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73 69  Info->ulMaxSessi
1e7d0 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65 6f  onCount = (sizeo
1e7e0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1e7f0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1e800 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
1e810 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   - 1;..pInfo->ul
1e820 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43  SessionCount = C
1e830 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
1e840 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
1e850 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69 6f  o->ulMaxRwSessio
1e860 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49 6e  nCount = 0;..pIn
1e870 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e 43  fo->ulRwSessionC
1e880 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49  ount = CK_UNAVAI
1e890 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1e8a0 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  N;..pInfo->ulMax
1e8b0 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09 70  PinLen = 128;..p
1e8c0 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c 65  Info->ulMinPinLe
1e8d0 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75  n = 0;..pInfo->u
1e8e0 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d 6f  lTotalPublicMemo
1e8f0 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
1e900 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
1e910 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50  ..pInfo->ulFreeP
1e920 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b  ublicMemory = CK
1e930 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1e940 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
1e950 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74 65  ->ulTotalPrivate
1e960 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
1e970 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1e980 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46  ION;..pInfo->ulF
1e990 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72 79  reePrivateMemory
1e9a0 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
1e9b0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 0a  E_INFORMATION;..
1e9c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e9d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1e9e0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1e9f0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1ea00 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1ea10 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1ea20 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72 53  K_RV, C_WaitForS
1ea30 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c 41  lotEvent)(CK_FLA
1ea40 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c 4f  GS flags, CK_SLO
1ea50 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49 44  T_ID_PTR pSlotID
1ea60 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52  , CK_VOID_PTR pR
1ea70 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43 4b  eserved) {..CACK
1ea80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ea90 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1eaa0 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e   (pReserved != N
1eab0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1eac0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ead0 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20 69  ror. pReserved i
1eae0 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  s not NULL.");..
1eaf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1eb00 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1eb10 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1eb20 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1eb30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1eb40 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1eb50 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1eb60 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1eb70 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1eb80 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f 2a  ALIZED);..}.../*
1eb90 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70 6c   XXX: TODO: Impl
1eba0 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a 2f  ement this... */
1ebb0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ebc0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ebd0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
1ebe0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
1ebf0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
1ec00 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1ec10 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
1ec20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1ec30 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
1ec40 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1ec50 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  V, C_GetMechanis
1ec60 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f 49  mList)(CK_SLOT_I
1ec70 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43  D slotID, CK_MEC
1ec80 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52 20  HANISM_TYPE_PTR 
1ec90 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c 20  pMechanismList, 
1eca0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1ecb0 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59  Count) {..CACKEY
1ecc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1ecd0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1ece0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1ecf0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1ed00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ed10 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1ed20 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1ed30 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ed40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ed50 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 43  );..}...if (pulC
1ed60 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ount == NULL) {.
1ed70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ed80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
1ed90 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ulCount is NULL.
1eda0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1edb0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1edc0 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
1edd0 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55 4c  anismList == NUL
1ede0 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e 74  L) {...*pulCount
1edf0 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f   = 1;....CACKEY_
1ee00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1ee10 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1ee20 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1ee30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1ee40 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c 43  ;..}...if (*pulC
1ee50 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43 41  ount < 1) {...CA
1ee60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ee70 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66 65  F("Error.  Buffe
1ee80 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b 0a  r too small.");.
1ee90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55  ...return(CKR_BU
1eea0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b  FFER_TOO_SMALL);
1eeb0 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73 6d  ..}...pMechanism
1eec0 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52 53  List[0] = CKM_RS
1eed0 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f 75  A_PKCS;..*pulCou
1eee0 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45 59  nt = 1;...CACKEY
1eef0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1ef00 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1ef10 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1ef20 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1ef30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1ef40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1ef50 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66  _GetMechanismInf
1ef60 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  o)(CK_SLOT_ID sl
1ef70 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  otID, CK_MECHANI
1ef80 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43 4b  SM_TYPE type, CK
1ef90 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f 5f  _MECHANISM_INFO_
1efa0 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e  PTR pInfo) {..in
1efb0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1efc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1efd0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1efe0 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
1eff0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1f000 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f010 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
1f020 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1f030 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1f040 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1f050 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1f060 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1f070 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f080 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1f090 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1f0a0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1f0b0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1f0c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
1f0d0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
1f0e0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1f0f0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1f100 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1f110 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1f120 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f130 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1f140 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1f150 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
1f160 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
1f170 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
1f180 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1f190 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1f1a0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1f1b0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1f1c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1f1d0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1f1e0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1f1f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1f200 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1f210 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1f220 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1f230 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1f240 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1f250 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
1f260 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f270 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f280 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1f290 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1f2a0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
1f2b0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
1f2c0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
1f2d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1f2e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1f2f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1f300 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1f310 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1f320 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1f330 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f340 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1f350 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1f360 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f370 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1f380 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1f390 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f3a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1f3b0 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 74  ;..}...switch (t
1f3c0 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ype) {...case CK
1f3d0 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 70  M_RSA_PKCS:....p
1f3e0 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53 69  Info->ulMinKeySi
1f3f0 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49 6e  ze = 512;....pIn
1f400 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a 65  fo->ulMaxKeySize
1f410 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e 66   = 8192;....pInf
1f420 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48  o->flags = CKF_H
1f430 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54 20  W | CKF_ENCRYPT 
1f440 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c 20  | CKF_DECRYPT | 
1f450 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f 56  CKF_SIGN | CKF_V
1f460 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b 3b  ERIFY;....break;
1f470 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
1f480 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1f490 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1f4a0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1f4b0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1f4c0 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70  ./* We don't sup
1f4d0 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64  port this method
1f4e0 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  . */.CK_DEFINE_F
1f4f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1f500 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f 53  _InitToken)(CK_S
1f510 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
1f520 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
1f530 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
1f540 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43  PinLen, CK_UTF8C
1f550 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29 20  HAR_PTR pLabel) 
1f560 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1f570 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f580 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
1f590 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1f5a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f5b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1f5c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1f5d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f5e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1f5f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1f600 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1f610 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1f620 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
1f630 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22 2c  PROTECTED (%i)",
1f640 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
1f650 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72  _PROTECTED);...r
1f660 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f  eturn(CKR_TOKEN_
1f670 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29  WRITE_PROTECTED)
1f680 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
1f690 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
1f6a0 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
1f6b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1f6c0 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43 4b  V, C_InitPIN)(CK
1f6d0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
1f6e0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54 46  hSession, CK_UTF
1f6f0 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
1f700 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
1f710 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
1f720 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f730 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
1f740 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1f750 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f760 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f770 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1f780 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1f790 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1f7a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1f7b0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
1f7c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1f7d0 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  ng CKR_TOKEN_WRI
1f7e0 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69  TE_PROTECTED (%i
1f7f0 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  )", CKR_TOKEN_WR
1f800 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a  ITE_PROTECTED);.
1f810 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b  ..return(CKR_TOK
1f820 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
1f830 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f  ED);.}../* We do
1f840 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73  n't support this
1f850 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44   method. */.CK_D
1f860 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1f870 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29 28  K_RV, C_SetPIN)(
1f880 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
1f890 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
1f8a0 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c 64  TF8CHAR_PTR pOld
1f8b0 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
1f8c0 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54  OldPinLen, CK_UT
1f8d0 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77 50  F8CHAR_PTR pNewP
1f8e0 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4e  in, CK_ULONG ulN
1f8f0 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43  ewPinLen) {..CAC
1f900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f910 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1f920 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1f930 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1f940 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f950 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1f960 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1f970 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1f980 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1f990 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1f9a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f9b0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
1f9c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1f9d0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
1f9e0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1f9f0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
1fa00 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
1fa10 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
1fa20 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1fa30 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f 70  TION(CK_RV, C_Op
1fa40 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 4c  enSession)(CK_SL
1fa50 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1fa60 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
1fa70 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c 69  _VOID_PTR pAppli
1fa80 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49 46  cation, CK_NOTIF
1fa90 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45 53  Y notify, CK_SES
1faa0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52 20  SION_HANDLE_PTR 
1fab0 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75 6e  phSession) {..un
1fac0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78 3b  signed long idx;
1fad0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1fae0 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f 73  al;..int found_s
1faf0 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43 41  ession = 0;...CA
1fb00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fb10 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1fb20 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b 46  if ((flags & CKF
1fb30 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29  _SERIAL_SESSION)
1fb40 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53   != CKF_SERIAL_S
1fb50 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74 75  ESSION) {...retu
1fb60 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 50  rn(CKR_SESSION_P
1fb70 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50 50  ARALLEL_NOT_SUPP
1fb80 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  ORTED);..}...if 
1fb90 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1fba0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1fbb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fbc0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1fbd0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1fbe0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1fbf0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1fc00 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
1fc10 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1fc20 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1fc30 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1fc40 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1fc50 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1fc60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fc70 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1fc80 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1fc90 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1fca0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1fcb0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1fcc0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1fcd0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1fce0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1fcf0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1fd00 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1fd10 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1fd20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1fd30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fd40 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1fd50 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1fd60 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1fd70 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1fd80 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1fd90 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1fda0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1fdb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fdc0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1fdd0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1fde0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1fdf0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1fe00 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1fe10 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1fe20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1fe30 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1fe40 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1fe50 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
1fe60 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61 63  t the card is ac
1fe70 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73 6c  tually in the sl
1fe80 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a 20  ot. */../* XXX: 
1fe90 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
1fea0 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74 68  re this is in th
1feb0 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69 66  e PKCS#11 specif
1fec0 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  ication */..if (
1fed0 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
1fee0 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
1fef0 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43  ts[slotID]) != C
1ff00 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
1ff10 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43  ENPRESENT) {...C
1ff20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ff30 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72 64  TF("Error.  Card
1ff40 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20 52   not present.  R
1ff50 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45 56  eturning CKR_DEV
1ff60 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a 0a  ICE_REMOVED");..
1ff70 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1ff80 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1ff90 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1ffa0 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f  (CKR_DEVICE_REMO
1ffb0 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  VED);..}...for (
1ffc0 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 28  idx = 1; idx < (
1ffd0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1ffe0 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
1fff0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
20000 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
20010 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
20020 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
20030 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f 73  ve) {....found_s
20040 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09 09  ession = 1;.....
20050 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64 78  *phSession = idx
20060 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
20070 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
20080 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79  e = 1;....cackey
20090 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
200a0 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b 0a  lotID = slotID;.
200b0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
200c0 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d 20  ns[idx].state = 
200d0 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
200e0 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65 79  SSION;....cackey
200f0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 66  _sessions[idx].f
20100 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09 09  lags = flags;...
20110 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20120 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45 72  [idx].ulDeviceEr
20130 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  ror = 0;....cack
20140 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
20150 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d 20  .pApplication = 
20160 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 09  pApplication;...
20170 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20180 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20 6e  [idx].Notify = n
20190 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b 65  otify;.....cacke
201a0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
201b0 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
201c0 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  L;....cackey_ses
201d0 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74  sions[idx].ident
201e0 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
201f0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
20200 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63 68  ions[idx].search
20210 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09  _active = 0;....
20220 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20230 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69 76  [idx].sign_activ
20240 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
20250 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
20260 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d  decrypt_active =
20270 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
20280 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65  essions[idx].ide
20290 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
202a0 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73  _read_identities
202b0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
202c0 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f  lotID], &cackey_
202d0 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
202e0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
202f0 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  ......break;...}
20300 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
20310 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
20320 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20330 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
20340 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
20350 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20360 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20370 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
20380 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20390 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
203a0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
203b0 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20 7b  found_session) {
203c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
203d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
203e0 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  g CKR_SESSION_CO
203f0 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f 53  UNT (%i)", CKR_S
20400 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 0a  ESSION_COUNT);..
20410 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
20420 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d 0a  SION_COUNT);..}.
20430 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20440 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20450 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
20460 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
20470 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
20480 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20490 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53 65  CK_RV, C_CloseSe
204a0 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f  ssion)(CK_SESSIO
204b0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
204c0 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
204d0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
204e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
204f0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
20500 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
20510 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20520 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20530 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20540 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20550 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20560 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20570 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
20580 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
20590 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
205a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
205b0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
205c0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
205d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
205e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
205f0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
20600 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
20610 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
20620 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
20630 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
20640 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20650 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
20660 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20670 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20680 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20690 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
206a0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
206b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
206c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
206d0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
206e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
206f0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
20700 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
20710 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
20720 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
20730 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20740 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
20750 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
20760 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
20770 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
20780 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
20790 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
207a0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 20  Session].active 
207b0 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72 65  = 0;..cackey_fre
207c0 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
207d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
207e0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
207f0 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
20800 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
20810 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
20820 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
20830 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
20840 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20850 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20860 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20870 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20880 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
20890 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
208a0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
208b0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
208c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
208d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
208e0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
208f0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
20900 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
20910 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
20920 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c  TION(CK_RV, C_Cl
20930 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29 28  oseAllSessions)(
20940 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
20950 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  D) {..uint32_t i
20960 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
20970 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
20980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
20990 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
209a0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
209b0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
209c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
209d0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
209e0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
209f0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
20a00 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
20a10 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49  ;..}...if (slotI
20a20 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20  D < 0 || slotID 
20a30 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
20a40 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
20a50 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
20a60 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
20a70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20a80 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
20a90 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
20aa0 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61  ), outside of va
20ab0 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74  lid range", slot
20ac0 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ID);....return(C
20ad0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
20ae0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
20af0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20b00 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
20b10 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
20b20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
20b30 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20b40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20b50 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
20b60 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20b70 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20b80 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
20b90 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
20ba0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
20bb0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20bc0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20bd0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
20be0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
20bf0 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
20c00 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
20c10 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
20c20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
20c30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
20c40 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
20c50 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
20c60 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
20c70 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
20c80 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
20c90 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
20ca0 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
20cb0 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
20cc0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
20cd0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69 66  .active) {....if
20ce0 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
20cf0 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21 3d  s[idx].slotID !=
20d00 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09 63   slotID) {.....c
20d10 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
20d20 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
20d30 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
20d40 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f 73  lock);....C_Clos
20d50 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09  eSession(idx);..
20d60 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  ..cackey_mutex_l
20d70 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20d80 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  ck);...}..}...mu
20d90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
20da0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
20db0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20dc0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
20dd0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
20de0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20df0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
20e00 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
20e10 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
20e20 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
20e30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20e40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
20e50 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
20e60 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
20e70 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
20e80 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
20e90 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65 73  (CK_RV, C_GetSes
20ea0 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45 53  sionInfo)(CK_SES
20eb0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
20ec0 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f 4e  sion, CK_SESSION
20ed0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
20ee0 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65   {..int mutex_re
20ef0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
20f00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
20f10 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
20f20 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
20f30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20f40 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
20f50 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
20f60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
20f70 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
20f80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
20f90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
20fa0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20fb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
20fc0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
20fd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
20fe0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
20ff0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
21000 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
21010 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
21020 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
21030 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
21040 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21050 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
21060 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21070 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
21080 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
21090 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
210a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
210b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
210c0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
210d0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
210e0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
210f0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
21100 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
21110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21120 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
21130 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
21140 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
21150 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
21160 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
21170 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
21180 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
21190 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
211a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
211b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
211c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
211d0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
211e0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
211f0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
21200 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
21210 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f 74  .}...pInfo->slot
21220 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
21230 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
21240 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e 73  lotID;..pInfo->s
21250 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73 65  tate = cackey_se
21260 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21270 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d 3e  .state;..pInfo->
21280 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f 73  flags = cackey_s
21290 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
212a0 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f 2d  ].flags;..pInfo-
212b0 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d  >ulDeviceError =
212c0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
212d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65 76  [hSession].ulDev
212e0 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74 65  iceError;...mute
212f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
21300 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21310 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21320 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
21330 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
21340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21350 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
21360 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
21370 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21380 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
21390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
213a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
213b0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
213c0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
213d0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
213e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
213f0 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72 61  K_RV, C_GetOpera
21400 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53 45  tionState)(CK_SE
21410 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21420 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
21430 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74 61  TR pOperationSta
21440 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  te, CK_ULONG_PTR
21450 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61   pulOperationSta
21460 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  teLen) {..CACKEY
21470 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
21480 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
21490 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
214a0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
214b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
214c0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
214d0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
214e0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
214f0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
21500 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21520 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
21530 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21540 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
21550 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21560 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
21570 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
21580 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
21590 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
215a0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f 70  N(CK_RV, C_SetOp
215b0 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b  erationState)(CK
215c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
215d0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
215e0 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e  E_PTR pOperation
215f0 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  State, CK_ULONG 
21600 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  ulOperationState
21610 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Len, CK_OBJECT_H
21620 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69 6f  ANDLE hEncryptio
21630 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nKey, CK_OBJECT_
21640 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74 69  HANDLE hAuthenti
21650 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43 41  cationKey) {..CA
21660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21670 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21680 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21690 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
216a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
216b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
216c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
216d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
216e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
216f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
21700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
21720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21730 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
21740 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21750 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
21760 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
21770 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21780 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21790 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
217a0 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ogin)(CK_SESSION
217b0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
217c0 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20 75  , CK_USER_TYPE u
217d0 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46 38  serType, CK_UTF8
217e0 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
217f0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
21800 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
21810 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74  slotID;..int mut
21820 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
21830 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b  tries_remaining;
21840 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74 3b  ..int login_ret;
21850 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21860 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
21870 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
21880 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
21890 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
218a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
218b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
218c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
218d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
218e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
218f0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
21900 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
21910 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
21920 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
21930 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
21940 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
21950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21960 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
21970 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
21980 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
21990 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
219a0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
219b0 0a 09 69 66 20 28 75 73 65 72 54 79 70 65 20 21  ..if (userType !
219c0 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09 09  = CKU_USER) {...
219d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
219e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65 20  NTF("Error.  We 
219f0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53 45  only support USE
21a00 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66 6f  R mode, asked fo
21a10 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28 75  r %lu mode.", (u
21a20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 73  nsigned long) us
21a30 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75 72  erType)....retur
21a40 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45 5f  n(CKR_USER_TYPE_
21a50 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
21a60 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
21a70 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
21a80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21a90 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
21aa0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
21ab0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21ac0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
21ad0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
21ae0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
21af0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
21b00 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
21b10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
21b20 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
21b30 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21b40 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21b50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21b60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21b70 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
21b80 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
21b90 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
21ba0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
21bb0 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
21bc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21bd0 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
21be0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
21bf0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
21c00 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
21c10 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
21c20 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
21c30 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21c40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21c50 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
21c60 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
21c70 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
21c80 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
21c90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
21ca0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
21cb0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
21cc0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
21cd0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
21ce0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21cf0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
21d00 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
21d10 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
21d20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
21d30 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
21d40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21d50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21d60 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
21d70 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
21d80 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65 74  ;..}...login_ret
21d90 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28   = cackey_login(
21da0 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
21db0 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c 50  otID], pPin, ulP
21dc0 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f 72 65  inLen, &tries_re
21dd0 6d 61 69 6e 69 6e 67 29 3b 0a 09 69 66 20 28 6c  maining);..if (l
21de0 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43 4b  ogin_ret != CACK
21df0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
21e00 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
21e10 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
21e20 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c 6f  lock);....if (lo
21e30 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
21e40 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 29  Y_PCSC_E_LOCKED)
21e50 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
21e60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21e70 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63 6b  .  Token is lock
21e80 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ed.");.....cacke
21e90 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
21ea0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43  token_flags |= C
21eb0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b  KF_USER_PIN_LOCK
21ec0 45 44 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ED;.....return(C
21ed0 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b 0a  KR_PIN_LOCKED);.
21ee0 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f 67  ..} else if (log
21ef0 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  in_ret == CACKEY
21f00 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 20  _PCSC_E_BADPIN) 
21f10 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
21f20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21f30 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22 29    Invalid PIN.")
21f40 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
21f50 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
21f60 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53  _flags |= CKF_US
21f70 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57  ER_PIN_COUNT_LOW
21f80 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f  ;.....if (tries_
21f90 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29 20  remaining == 1) 
21fa0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  {.....cackey_slo
21fb0 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e  ts[slotID].token
21fc0 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53  _flags |= CKF_US
21fd0 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59  ER_PIN_FINAL_TRY
21fe0 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72  ;....}.....retur
21ff0 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52 52  n(CKR_PIN_INCORR
22000 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  ECT);...}....CAC
22010 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22020 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f 77  ("Error.  Unknow
22030 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65 64  n error returned
22040 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f 67   from cackey_log
22050 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67 69  in() (%i)", logi
22060 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  n_ret);....retur
22070 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
22080 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  ROR);..}...cacke
22090 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
220a0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20 7e  token_flags &= ~
220b0 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f  (CKF_USER_PIN_LO
220c0 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f  CKED | CKF_USER_
220d0 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c 20  PIN_COUNT_LOW | 
220e0 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
220f0 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49  ED | CKF_USER_PI
22100 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a 09  N_FINAL_TRY);...
22110 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
22120 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20  hSession].state 
22130 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46 55  = CKS_RO_USER_FU
22140 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65 78  NCTIONS;...mutex
22150 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
22160 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
22170 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
22180 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
22190 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
221a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
221b0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
221c0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
221d0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
221e0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
221f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22200 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22210 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
22220 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
22230 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
22240 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22250 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28 43  _RV, C_Logout)(C
22260 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22270 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b   hSession) {..CK
22280 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
22290 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
222a0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
222b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
222c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
222d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
222e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
222f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22300 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22310 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22320 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22330 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
22340 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
22350 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
22360 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
22370 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
22380 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22390 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
223a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
223b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
223c0 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
223d0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
223e0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
223f0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
22400 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
22410 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
22420 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
22430 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
22440 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
22450 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22460 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22470 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
22480 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
22490 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
224a0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
224b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
224c0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
224d0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
224e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
224f0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
22500 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22510 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
22520 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
22530 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
22540 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
22550 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  LID);..}...slotI
22560 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
22570 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
22580 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
22590 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
225a0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
225b0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
225c0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
225d0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
225e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
225f0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
22600 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
22610 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
22620 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
22630 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
22640 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
22650 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
22660 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22670 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
22680 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22690 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
226a0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
226b0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
226c0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
226d0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
226e0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
226f0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
22700 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
22710 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22720 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63  ERROR);..}...cac
22730 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
22740 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43  ssion].state = C
22750 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45 53  KS_RO_PUBLIC_SES
22760 53 49 4f 4e 3b 0a 09 63 61 63 6b 65 79 5f 73 6c  SION;..cackey_sl
22770 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
22780 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f  n_flags = CKF_LO
22790 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09  GIN_REQUIRED;...
227a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
227b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
227c0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
227d0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
227e0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
227f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22800 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
22810 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
22820 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22830 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22840 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22850 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22860 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
22870 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
22880 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
22890 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
228a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65 61  ON(CK_RV, C_Crea
228b0 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  teObject)(CK_SES
228c0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
228d0 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55  sion, CK_ATTRIBU
228e0 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
228f0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
22900 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
22910 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63  NDLE_PTR phObjec
22920 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
22930 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22940 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
22950 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22960 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22970 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22980 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22990 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
229a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
229b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
229c0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
229d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
229e0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
229f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
22a00 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
22a10 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22a20 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
22a30 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22a40 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
22a50 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22a60 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65 63  _RV, C_CopyObjec
22a70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
22a80 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
22a90 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
22aa0 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52  hObject, CK_ATTR
22ab0 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
22ac0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
22ad0 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
22ae0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e 65  _HANDLE_PTR phNe
22af0 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  wObject) {..CACK
22b00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22b10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22b20 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22b30 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22b40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22b50 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22b60 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22b70 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22b80 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
22b90 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
22ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22bb0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
22bc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22bd0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
22be0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22bf0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
22c00 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
22c10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
22c20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
22c30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 73  ION(CK_RV, C_Des
22c40 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53  troyObject)(CK_S
22c50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
22c60 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
22c70 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
22c80 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
22c90 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
22ca0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
22cb0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22cc0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22cd0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22ce0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
22cf0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22d00 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
22d10 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
22d20 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22d30 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22d40 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
22d50 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
22d60 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
22d70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22d80 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
22d90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22da0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
22db0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22dc0 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74 53  RV, C_GetObjectS
22dd0 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ize)(CK_SESSION_
22de0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
22df0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
22e00 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55 4c  E hObject, CK_UL
22e10 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65 29  ONG_PTR pulSize)
22e20 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
22e30 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22e40 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22e50 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22e60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22e70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22e80 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22e90 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22ea0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22eb0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22ec0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22ed0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22ee0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
22ef0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
22f00 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
22f10 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22f20 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
22f30 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22f40 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
22f50 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22f60 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75 74  V, C_GetAttribut
22f70 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49  eValue)(CK_SESSI
22f80 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
22f90 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
22fa0 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
22fb0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
22fc0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
22fd0 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  NG ulCount) {..C
22fe0 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72  K_ATTRIBUTE *cur
22ff0 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74 20  r_attr;..struct 
23000 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
23010 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73 69  *identity;..unsi
23020 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69  gned long identi
23030 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78  ty_idx, attr_idx
23040 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2c  , sess_attr_idx,
23050 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20 6d   num_ids;..int m
23060 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  utex_retval;..CK
23070 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52  _RV retval = CKR
23080 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54  _OK;..CK_VOID_PT
23090 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c  R pValue;..CK_UL
230a0 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  ONG ulValueLen;.
230b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
230c0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
230d0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
230e0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
230f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23100 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
23110 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
23120 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
23130 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
23140 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
23150 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
23160 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
23170 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
23180 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
23190 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
231a0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
231b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
231c0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
231d0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
231e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
231f0 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
23200 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
23210 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d 20  .if (hObject == 
23220 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23230 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23240 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c  r.  Object handl
23250 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  e out of range."
23260 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
23270 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  KR_OBJECT_HANDLE
23280 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
23290 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20 30  if (ulCount == 0
232a0 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63  ) {.../* Short c
232b0 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20  ircuit, if zero 
232c0 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65  objects were spe
232d0 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65  cified return ze
232e0 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61  ro items immedia
232f0 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45 59  tely */...CACKEY
23300 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
23310 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
23320 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
23330 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
23340 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
23350 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65 6d  );..}...if (pTem
23360 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  plate == NULL) {
23370 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23380 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
23390 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55 4c  pTemplate is NUL
233a0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
233b0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
233c0 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74  D);..}...identit
233d0 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74 20  y_idx = hObject 
233e0 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  - 1;...mutex_ret
233f0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
23400 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
23410 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
23420 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
23430 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23440 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23450 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
23460 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23470 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
23480 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
23490 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
234a0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
234b0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
234c0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
234d0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
234e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
234f0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
23500 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
23510 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
23520 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
23530 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75 6d  VALID);..}...num
23540 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ids = cackey_se
23550 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
23560 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
23570 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  t;...if (identit
23580 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64 73  y_idx >= num_ids
23590 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
235a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
235b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
235c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
235d0 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
235e0 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
235f0 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74 79  range.  identity
23600 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d 5f  _idx = %lu, num_
23610 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75 6e  ids = %lu.", (un
23620 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
23630 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73 69  ntity_idx, (unsi
23640 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f 69  gned long) num_i
23650 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ds);....return(C
23660 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  KR_OBJECT_HANDLE
23670 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
23680 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
23690 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
236a0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
236b0 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b 0a  [identity_idx];.
236c0 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20  ..for (attr_idx 
236d0 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20  = 0; attr_idx < 
236e0 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64  ulCount; attr_id
236f0 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61 74  x++) {...curr_at
23700 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65 5b  tr = &pTemplate[
23710 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70 56  attr_idx];....pV
23720 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75  alue = NULL;...u
23730 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
23740 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41 43  LONG) -1;....CAC
23750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23760 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 74  ("Looking for at
23770 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78 20  tribute 0x%08lx 
23780 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20 2e  (identity:%lu) .
23790 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
237a0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e  ong) curr_attr->
237b0 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  type, (unsigned 
237c0 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69  long) identity_i
237d0 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65 73  dx);....for (ses
237e0 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20  s_attr_idx = 0; 
237f0 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20  sess_attr_idx < 
23800 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
23810 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73  utes_count; sess
23820 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
23830 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
23840 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
23850 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20 3d  attr_idx].type =
23860 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70  = curr_attr->typ
23870 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  e) {.....CACKEY_
23880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
23890 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56 61  .. found it, pVa
238a0 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c 75  lue = %p, ulValu
238b0 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64 65  eLen = %lu", ide
238c0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
238d0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
238e0 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69 74  .pValue, identit
238f0 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
23900 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
23910 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a 09  alueLen);.......
23920 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65 6e  ...pValue = iden
23930 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73  tity->attributes
23940 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e  [sess_attr_idx].
23950 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56 61  pValue;.....ulVa
23960 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69 74  lueLen = identit
23970 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  y->attributes[se
23980 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c 56  ss_attr_idx].ulV
23990 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09 09  alueLen;....}...
239a0 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74  }....if (curr_at
239b0 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70 56  tr->pValue && pV
239c0 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28 63  alue) {....if (c
239d0 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75  urr_attr->ulValu
239e0 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65 4c  eLen >= ulValueL
239f0 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70 79  en) {.....memcpy
23a00 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
23a10 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56 61  ue, pValue, ulVa
23a20 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c  lueLen);....} el
23a30 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75 65  se {.....ulValue
23a40 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
23a50 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  -1;......retval 
23a60 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
23a70 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09 7d  _SMALL;....}...}
23a80 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e 75  ....curr_attr->u
23a90 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61  lValueLen = ulVa
23aa0 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75 74  lueLen;..}...mut
23ab0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
23ac0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23ad0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23ae0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
23af0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
23b00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23b10 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
23b20 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
23b30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
23b40 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
23b50 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  ..if (retval == 
23b60 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
23b70 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09 09  PE_INVALID) {...
23b80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23b90 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23ba0 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59 50  KR_ATTRIBUTE_TYP
23bb0 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22 2c  E_INVALID (%i)",
23bc0 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
23bd0 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 76  .} else if (retv
23be0 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52  al == CKR_BUFFER
23bf0 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09  _TOO_SMALL) {...
23c00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23c10 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
23c20 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
23c30 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74 29  ALL (%i)", (int)
23c40 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73   retval);..} els
23c50 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  e if (retval == 
23c60 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
23c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23c80 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
23c90 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  K (%i)", (int) r
23ca0 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
23cb0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23cc0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23cd0 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
23ce0 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  tval);..}...retu
23cf0 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
23d00 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
23d10 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41 74  N(CK_RV, C_SetAt
23d20 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b  tributeValue)(CK
23d30 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
23d40 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
23d50 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65  ECT_HANDLE hObje
23d60 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  ct, CK_ATTRIBUTE
23d70 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
23d80 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
23d90 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
23da0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
23db0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
23dc0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
23dd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23de0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23df0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23e00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23e10 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23e20 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23e30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23e40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23e50 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
23e60 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
23e70 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
23e80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
23e90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
23ea0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23eb0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
23ec0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
23ed0 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
23ee0 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f  sInit)(CK_SESSIO
23ef0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
23f00 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
23f10 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
23f20 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29  K_ULONG ulCount)
23f30 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73   {..CK_SLOT_ID s
23f40 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  lotID;..CK_ULONG
23f50 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78   idx;..int mutex
23f60 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
23f70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23f80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23f90 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
23fa0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
23fb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23fc0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
23fd0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
23fe0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
23ff0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
24000 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
24010 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
24020 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
24030 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
24040 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
24050 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
24060 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24070 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
24080 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
24090 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
240a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
240b0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
240c0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
240d0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
240e0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
240f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
24100 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
24110 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
24120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24130 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
24140 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
24150 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
24160 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
24170 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24180 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
24190 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
241a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
241b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
241c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
241d0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
241e0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
241f0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
24200 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
24210 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
24220 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
24230 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
24240 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
24250 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
24260 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
24270 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
24280 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24290 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c 72  ror.  Search alr
242a0 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b 0a  eady active.");.
242b0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
242c0 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
242d0 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
242e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
242f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
24300 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
24310 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
24320 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
24330 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
24340 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
24350 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
24360 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24370 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
24380 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
24390 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
243a0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
243b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
243c0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
243d0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
243e0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
243f0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
24400 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24410 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
24420 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
24430 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
24440 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
24450 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
24460 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
24470 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24480 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
24490 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
244a0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
244b0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
244c0 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  D].slot_reset) {
244d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
244e0 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f 74  PRINTF("The slot
244f0 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74 20   has been reset 
24500 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c 6f  since we last lo
24510 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69 74  oked for identit
24520 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69 6e  ies -- rescannin
24530 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  g");....if (cack
24540 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
24550 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
24560 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 63   != NULL) {....c
24570 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74  ackey_free_ident
24580 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73  ities(cackey_ses
24590 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
245a0 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b  identities, cack
245b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
245c0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
245d0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61 63  _count);.....cac
245e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
245f0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
24600 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63  s = NULL;....cac
24610 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24620 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
24630 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 7d  s_count = 0;...}
24640 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
24650 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
24660 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  el != NULL) {...
24670 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
24680 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
24690 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  );....cackey_slo
246a0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
246b0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
246c0 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
246d0 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73  _reset(&cackey_s
246e0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a 09  lots[slotID]);..
246f0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
24700 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  otID].slot_reset
24710 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 63   = 0;..}...if (c
24720 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24730 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
24740 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies == NULL) {..
24750 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24760 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
24770 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
24780 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 26  ead_identities(&
24790 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
247a0 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73 65  tID], &cackey_se
247b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
247c0 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
247d0 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  t);..}...if (pTe
247e0 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29 20  mplate != NULL) 
247f0 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  {...if (ulCount 
24800 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b 65  != 0) {....cacke
24810 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24820 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
24830 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75 6e  y_count = ulCoun
24840 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  t;....cackey_ses
24850 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24860 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 6d  search_query = m
24870 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a 20  alloc(ulCount * 
24880 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74  sizeof(*pTemplat
24890 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28  e));.....memcpy(
248a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
248b0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
248c0 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61 74  _query, pTemplat
248d0 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a  e, ulCount * siz
248e0 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29 29  eof(*pTemplate))
248f0 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d 20  ;....for (idx = 
24900 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74  0; idx < ulCount
24910 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 69  ; idx++) {.....i
24920 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  f (pTemplate[idx
24930 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ].ulValueLen == 
24940 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65 79  0) {......cackey
24950 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24960 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
24970 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 4e  [idx].pValue = N
24980 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69  ULL;.......conti
24990 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  nue;.....}......
249a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
249b0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
249c0 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
249d0 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65 6d  ue = malloc(pTem
249e0 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c  plate[idx].ulVal
249f0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20  ueLen);......if 
24a00 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
24a10 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
24a20 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
24a30 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63  lue) {......memc
24a40 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
24a50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
24a60 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
24a70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65  Value, pTemplate
24a80 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54  [idx].pValue, pT
24a90 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56  emplate[idx].ulV
24aa0 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d 0a  alueLen);.....}.
24ab0 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
24ac0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
24ad0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
24ae0 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
24af0 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  = 0;....cackey_s
24b00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24b10 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d  ].search_query =
24b20 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65 6c   NULL;...}..} el
24b30 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75  se {...if (ulCou
24b40 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61  nt != 0) {....ca
24b50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
24b60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24b70 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
24b80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24b90 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 72 79  r.  Search query
24ba0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
24bb0 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20 6f  LL, but number o
24bc0 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e 6f  f query terms no
24bd0 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30  t specified as 0
24be0 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
24bf0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
24c00 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65  D);...}....cacke
24c10 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24c20 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
24c30 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 63  y_count = 0;...c
24c40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
24c50 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
24c60 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  query = NULL;..}
24c70 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
24c80 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
24c90 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  rch_active = 1;.
24ca0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
24cb0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
24cc0 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a 0a  h_curr_id = 0;..
24cd0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
24ce0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
24cf0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24d00 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
24d10 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
24d20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24d30 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
24d40 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
24d50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
24d60 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
24d70 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
24d80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
24d90 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
24da0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
24db0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
24dc0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b  .static int cack
24dd0 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72  ey_pkcs11_compar
24de0 65 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f  e_attributes(CK_
24df0 41 54 54 52 49 42 55 54 45 20 2a 61 2c 20 43 4b  ATTRIBUTE *a, CK
24e00 5f 41 54 54 52 49 42 55 54 45 20 2a 62 29 20 7b  _ATTRIBUTE *b) {
24e10 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
24e20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72 67  *smallbuf, *larg
24e30 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73 6d  ebuf;..size_t sm
24e40 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72 67  allbuf_len, larg
24e50 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28  ebuf_len;...if (
24e60 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74 79  a->type != b->ty
24e70 70 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30  pe) {...return(0
24e80 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
24e90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20  EBUG_PRINTF("   
24ea0 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63 68   ... found match
24eb0 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b 0a  ing type ...");.
24ec0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24ed0 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e 2e  RINTBUF("    ...
24ee0 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 61 2d   our value:", a-
24ef0 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56 61  >pValue, a->ulVa
24f00 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28 62  lueLen);...if (b
24f10 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c  ->pValue == NULL
24f20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
24f30 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20  UG_PRINTF("     
24f40 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c 64    ... found wild
24f50 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a 09  card match");...
24f60 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
24f70 09 69 66 20 28 61 2d 3e 70 56 61 6c 75 65 20 3d  .if (a->pValue =
24f80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
24f90 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66 20  rn(0);..}.. .if 
24fa0 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  (b->ulValueLen =
24fb0 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20  = a->ulValueLen 
24fc0 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56 61  && memcmp(a->pVa
24fd0 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c 20  lue, b->pValue, 
24fe0 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 3d  b->ulValueLen) =
24ff0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
25000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
25010 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 65       ... found e
25020 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a 09  xact match");...
25030 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a 0a  .return(1);..}..
25040 09 73 77 69 74 63 68 20 28 61 2d 3e 74 79 70 65  .switch (a->type
25050 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d  ) {...case CKA_M
25060 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66 20 28 61  ODULUS:....if (a
25070 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d 20  ->ulValueLen == 
25080 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  b->ulValueLen) {
25090 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
250a0 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61  .....if (a->ulVa
250b0 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56 61  lueLen > b->ulVa
250c0 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73 6d  lueLen) {.....sm
250d0 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61 6c  allbuf = b->pVal
250e0 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  ue;.....smallbuf
250f0 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c 75  _len = b->ulValu
25100 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65  eLen;......large
25110 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b  buf = a->pValue;
25120 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65  .....largebuf_le
25130 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = a->ulValueLe
25140 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  n;....} else {..
25150 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61 2d  ...smallbuf = a-
25160 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61  >pValue;.....sma
25170 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75  llbuf_len = a->u
25180 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09  lValueLen;......
25190 6c 61 72 67 65 62 75 66 20 3d 20 62 2d 3e 70 56  largebuf = b->pV
251a0 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62  alue;.....largeb
251b0 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61  uf_len = b->ulVa
251c0 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09 09  lueLen;....}....
251d0 09 66 6f 72 20 28 3b 20 6c 61 72 67 65 62 75 66  .for (; largebuf
251e0 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66  _len != smallbuf
251f0 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b 2b  _len; largebuf++
25200 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d 29  ,largebuf_len--)
25210 20 7b 0a 09 09 09 09 69 66 20 28 6c 61 72 67 65   {.....if (large
25220 62 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a 09  buf[0] != 0) {..
25230 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
25240 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61  ....}.....if (la
25250 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d  rgebuf_len != sm
25260 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 09  allbuf_len) {...
25270 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
25280 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61 72  ..if (memcmp(lar
25290 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 2c  gebuf, smallbuf,
252a0 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 3d   smallbuf_len) =
252b0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
252c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
252d0 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64         ... found
252e0 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6d 61 74   approximate mat
252f0 63 68 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  ch");......retur
25300 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  n(1);....}.....b
25310 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  reak;..}...retur
25320 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  n(0);.}..CK_DEFI
25330 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
25340 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
25350 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
25360 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
25370 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
25380 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  TR phObject, CK_
25390 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65 63  ULONG ulMaxObjec
253a0 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e 47  tCount, CK_ULONG
253b0 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43 6f  _PTR pulObjectCo
253c0 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  unt) {..struct c
253d0 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
253e0 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54 54  curr_id;..CK_ATT
253f0 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74  RIBUTE *curr_att
25400 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75 72  r;..CK_ULONG cur
25410 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 6f  r_id_idx, curr_o
25420 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  ut_id_idx, curr_
25430 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61  attr_idx, sess_a
25440 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c 4f  ttr_idx;..CK_ULO
25450 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  NG matched_count
25460 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63  , prev_matched_c
25470 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  ount;..int mutex
25480 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64 65 66 20  _retval;.#ifdef 
25490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41  CACKEY_DEBUG_SEA
254a0 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 73  RCH_SPEEDTEST..s
254b0 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73 74  truct timeval st
254c0 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74 36  art, end;..uint6
254d0 34 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c 20 65  4_t start_int, e
254e0 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a 0a  nd_int;.#endif..
254f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25500 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
25510 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
25520 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
25530 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25540 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
25550 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
25560 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
25570 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
25580 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
25590 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  f (pulObjectCoun
255a0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
255b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
255c0 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c 4f  TF("Error.  pulO
255d0 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e 55  bjectCount is NU
255e0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
255f0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
25600 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68  AD);..}...if (ph
25610 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20 26  Object == NULL &
25620 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  & ulMaxObjectCou
25630 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
25640 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
25650 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
25660 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
25670 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
25680 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
25690 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74  .*pulObjectCount
256a0 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59 5f   = 0;....CACKEY_
256b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
256c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
256d0 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75  %i) (short circu
256e0 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  it)", CKR_OK);..
256f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
25700 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a  ;..}...if (phObj
25710 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ect == NULL) {..
25720 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25730 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 68  INTF("Error.  ph
25740 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e 22  Object is NULL."
25750 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
25760 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
25770 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78 4f  ..}...if (ulMaxO
25780 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29  bjectCount == 0)
25790 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
257a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
257b0 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72    Maximum number
257c0 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65 63   of objects spec
257d0 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22 29  ified as zero.")
257e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
257f0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
25800 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
25810 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
25820 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
25830 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
25840 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
25850 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
25860 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25870 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
25880 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
25890 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
258a0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
258b0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
258c0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
258d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
258e0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
258f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
25900 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
25910 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25920 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25930 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
25940 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
25950 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
25960 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
25970 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25980 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
25990 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
259a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
259b0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
259c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
259d0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
259e0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
259f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
25a00 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
25a10 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
25a20 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
25a30 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
25a40 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  h_active) {...ca
25a50 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
25a60 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
25a70 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
25a80 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
25a90 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61 63  .  Search not ac
25aa0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
25ab0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
25ac0 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
25ad0 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ED);..}..#ifdef 
25ae0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41  CACKEY_DEBUG_SEA
25af0 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67  RCH_SPEEDTEST..g
25b00 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 74 61  ettimeofday(&sta
25b10 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  rt, NULL);.#endi
25b20 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f  f...curr_out_id_
25b30 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63  idx = 0;..for (c
25b40 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61 63  urr_id_idx = cac
25b50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25b60 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75  ssion].search_cu
25b70 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f 69  rr_id; curr_id_i
25b80 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73  dx < cackey_sess
25b90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
25ba0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
25bb0 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  && ulMaxObjectCo
25bc0 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64 78  unt; curr_id_idx
25bd0 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64 20  ++) {...curr_id 
25be0 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
25bf0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
25c00 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64 5f  ntities[curr_id_
25c10 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  idx];....CACKEY_
25c20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 72  DEBUG_PRINTF("Pr
25c30 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69 74  ocessing identit
25c40 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  y:%lu", (unsigne
25c50 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64 5f  d long) curr_id_
25c60 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65 64  idx);....matched
25c70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 66  _count = 0;....f
25c80 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69 64  or (curr_attr_id
25c90 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72  x = 0; curr_attr
25ca0 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65  _idx < cackey_se
25cb0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25cc0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
25cd0 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f 69  unt; curr_attr_i
25ce0 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76 5f  dx++) {....prev_
25cf0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20  matched_count = 
25d00 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 0a  matched_count;..
25d10 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26  ...curr_attr = &
25d20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25d30 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
25d40 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74 72  _query[curr_attr
25d50 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b 45  _idx];.....CACKE
25d60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25d70 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20 61    Checking for a
25d80 74 74 72 69 62 75 74 65 20 25 73 20 28 30 78 25  ttribute %s (0x%
25d90 30 38 6c 78 29 20 69 6e 20 69 64 65 6e 74 69 74  08lx) in identit
25da0 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45 59  y:%i...", CACKEY
25db0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52  _DEBUG_FUNC_ATTR
25dc0 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 63 75 72  IBUTE_TO_STR(cur
25dd0 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c 20 28  r_attr->type), (
25de0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
25df0 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20  urr_attr->type, 
25e00 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
25e10 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  x);....CACKEY_DE
25e20 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20  BUG_PRINTBUF("  
25e30 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67 20    Value looking 
25e40 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74 72  for:", curr_attr
25e50 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61  ->pValue, curr_a
25e60 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29  ttr->ulValueLen)
25e70 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73 5f  ;.....for (sess_
25e80 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73 65  attr_idx = 0; se
25e90 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 75  ss_attr_idx < cu
25ea0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
25eb0 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74  s_count; sess_at
25ec0 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  tr_idx++) {.....
25ed0 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73 31  if (cackey_pkcs1
25ee0 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62  1_compare_attrib
25ef0 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e 61  utes(&curr_id->a
25f00 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
25f10 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f 61  ttr_idx], curr_a
25f20 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61 74  ttr)) {......mat
25f30 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a 09  ched_count++;...
25f40 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
25f50 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66 20  ....}...../* If 
25f60 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63 6f  the attribute co
25f70 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63 68  uld not be match
25f80 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20 74  ed, do not try t
25f90 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f 6e  o match addition
25fa0 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a 2f  al attributes */
25fb0 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61 74  ....if (prev_mat
25fc0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d 61  ched_count == ma
25fd0 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a 09  tched_count) {..
25fe0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09  ...break;....}..
25ff0 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68 65  .}....if (matche
26000 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b 65  d_count == cacke
26010 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26020 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
26030 79 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41  y_count) {....CA
26040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26050 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69 20  F("  ... All %i 
26060 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
26070 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61 64  ed for found, ad
26080 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69  ding identity:%i
26090 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69 73   to returned lis
260a0 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65 79  t", (int) cackey
260b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
260c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
260d0 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
260e0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 09  rr_id_idx);.....
260f0 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f 75  phObject[curr_ou
26100 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72 72  t_id_idx] = curr
26110 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09 09  _id_idx + 1;....
26120 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  .ulMaxObjectCoun
26130 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f 75  t--;.....curr_ou
26140 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d 20  t_id_idx++;...} 
26150 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
26160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
26170 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69 20   ... Not all %i 
26180 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29 20  (only found %i) 
26190 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63 6b  attributes check
261a0 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e 6f  ed for found, no
261b0 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  t adding identit
261c0 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61 63  y:%i", (int) cac
261d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
261e0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
261f0 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29  ery_count, (int)
26200 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c 20   matched_count, 
26210 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
26220 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63 6b  x);...}..}..cack
26230 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26240 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72  sion].search_cur
26250 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f 69  r_id = curr_id_i
26260 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74 43  dx;..*pulObjectC
26270 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74 5f  ount = curr_out_
26280 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66 20  id_idx;..#ifdef 
26290 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45 41  CACKEY_DEBUG_SEA
262a0 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09 67  RCH_SPEEDTEST..g
262b0 65 74 74 69 6d 65 6f 66 64 61 79 28 26 65 6e 64  ettimeofday(&end
262c0 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74 5f  , NULL);..start_
262d0 69 6e 74 20 3d 20 28 73 74 61 72 74 2e 74 76 5f  int = (start.tv_
262e0 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20 2b  sec * 1000000) +
262f0 20 73 74 61 72 74 2e 74 76 5f 75 73 65 63 3b 0a   start.tv_usec;.
26300 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64 2e  .end_int = (end.
26310 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30  tv_sec * 1000000
26320 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63 3b  ) + end.tv_usec;
26330 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72 72  ..fprintf(stderr
26340 2c 20 22 53 65 61 72 63 68 20 74 6f 6f 6b 20 25  , "Search took %
26350 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 5c  lu microseconds\
26360 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  n", (unsigned lo
26370 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20 73  ng) (end_int - s
26380 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e 64  tart_int));.#end
26390 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  if...mutex_retva
263a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
263b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
263c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
263d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
263e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
263f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26400 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
26410 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26420 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26430 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
26440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26450 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
26460 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63 74  (%i), num object
26470 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f 4b  s = %lu", CKR_OK
26480 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  , *pulObjectCoun
26490 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  t);...return(CKR
264a0 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
264b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
264c0 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  V, C_FindObjects
264d0 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f  Final)(CK_SESSIO
264e0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
264f0 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69  n) {..CK_ULONG i
26500 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  dx;..int mutex_r
26510 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
26520 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
26530 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
26540 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
26550 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
26560 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26570 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
26580 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
26590 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
265a0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
265b0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
265c0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
265d0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
265e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
265f0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
26600 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
26610 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26620 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26630 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
26640 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
26650 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
26660 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
26670 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
26680 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
26690 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
266a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
266b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
266c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
266d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
266e0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
266f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
26700 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
26710 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
26720 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26730 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
26740 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
26750 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26760 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
26770 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26780 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
26790 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
267a0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
267b0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
267c0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
267d0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
267e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
267f0 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  rch_active) {...
26800 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26810 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26820 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
26830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26840 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20  or.  Search not 
26850 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
26860 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
26870 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
26880 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  IZED);..}...cack
26890 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
268a0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
268b0 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20 28  ive = 0;...for (
268c0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
268d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
268e0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
268f0 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64 78  query_count; idx
26900 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  ++) {...if (cack
26910 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26920 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
26930 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20  ry[idx].pValue) 
26940 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
26950 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26960 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
26970 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a 09  [idx].pValue);..
26980 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  .}..}...if (cack
26990 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
269a0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
269b0 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61 63  ry) {...free(cac
269c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
269d0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
269e0 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ery);..}...mutex
269f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
26a00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
26a10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
26a20 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
26a30 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
26a40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26a50 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
26a60 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
26a70 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
26a80 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
26a90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26aa0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26ab0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
26ac0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
26ad0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
26ae0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
26af0 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49 6e  _RV, C_EncryptIn
26b00 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
26b10 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
26b20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
26b30 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
26b40 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
26b50 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
26b60 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
26b70 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
26b80 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
26b90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26ba0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26bb0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
26bc0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26bd0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
26be0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
26bf0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
26c00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
26c10 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
26c20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
26c30 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
26c40 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26c50 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
26c60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26c70 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
26c80 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
26c90 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 29  K_RV, C_Encrypt)
26ca0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
26cb0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
26cc0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
26cd0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
26ce0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
26cf0 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20  pEncryptedData, 
26d00 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
26d10 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
26d20 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
26d30 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
26d40 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
26d50 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
26d60 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
26d70 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26d80 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
26d90 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26da0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
26db0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
26dc0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26dd0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26de0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
26df0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
26e00 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
26e10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26e20 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
26e30 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26e40 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
26e50 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
26e60 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70 64  RV, C_EncryptUpd
26e70 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
26e80 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
26e90 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
26ea0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
26eb0 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
26ec0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
26ed0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
26ee0 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
26ef0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
26f00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
26f10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
26f20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
26f30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
26f40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26f50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
26f60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
26f70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
26f80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
26f90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
26fa0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
26fb0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
26fc0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26fd0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
26fe0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
26ff0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
27000 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27010 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
27020 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27030 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
27040 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
27050 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
27060 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
27070 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50 61  pLastEncryptedPa
27080 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
27090 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74 65   pulLastEncrypte
270a0 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
270b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
270c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
270d0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
270e0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
270f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27100 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27110 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27120 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27130 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27140 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
27150 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27160 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
27170 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27180 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
27190 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
271a0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
271b0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
271c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
271d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
271e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
271f0 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
27200 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27210 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
27220 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
27230 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
27240 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e  NDLE hKey) {..in
27250 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
27260 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b  ..hKey--;...CACK
27270 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27280 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27290 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
272a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
272b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
272c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
272d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
272e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
272f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
27300 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  ED);..}...if (pM
27310 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c  echanism == NULL
27320 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27330 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27340 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20  . pMechanism is 
27350 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
27360 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
27370 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
27380 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
27390 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41  anism != CKM_RSA
273a0 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45  _PKCS) {...CACKE
273b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
273c0 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
273d0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74  m->mechanism not
273e0 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43 4b   specified as CK
273f0 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09  M_RSA_PKCS");...
27400 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48  .return(CKR_MECH
27410 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41  ANISM_PARAM_INVA
27420 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
27430 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
27440 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
27450 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
27460 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
27470 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
27480 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
27490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
274a0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
274b0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
274c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
274d0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
274e0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
274f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
27500 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
27510 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
27520 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
27530 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
27540 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27550 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
27560 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
27570 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
27580 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
27590 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
275a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
275b0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
275c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
275d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
275e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
275f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
27600 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
27610 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
27620 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
27630 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
27640 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
27650 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27660 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
27670 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
27680 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
27690 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
276a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
276b0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
276c0 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67   already in prog
276d0 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ress.");......re
276e0 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
276f0 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a  ON_ACTIVE);..}..
27700 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63  .if (hKey >= cac
27710 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27720 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
27730 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63  s_count) {...cac
27740 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
27750 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
27760 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
27770 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27780 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74    Key handle out
27790 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65   of range (reque
277a0 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e  sted key %lu, on
277b0 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65  ly %lu identitie
277c0 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20  s available).", 
277d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
277e0 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20  hKey, (unsigned 
277f0 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73  long) cackey_ses
27800 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27810 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
27820 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27830 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  _KEY_HANDLE_INVA
27840 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  LID);..}...cacke
27850 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27860 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
27870 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65  ive = 1;...cacke
27880 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
27890 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
278a0 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61 6e  hanism = pMechan
278b0 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b 0a  ism->mechanism;.
278c0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
278d0 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
278e0 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20 70  pt_mech_parm = p
278f0 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72 61  Mechanism->pPara
27900 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f 73  meter;..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 5f 70  ].decrypt_mech_p
27930 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61 6e  armlen = pMechan
27940 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65 72  ism->ulParameter
27950 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  Len;..cackey_ses
27960 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27970 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
27980 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
27990 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
279a0 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a  entities[hKey];.
279b0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
279c0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
279d0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
279e0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
279f0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
27a00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27a10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
27a20 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
27a30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27a40 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27a50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
27a60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
27a70 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
27a80 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
27a90 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
27aa0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
27ab0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
27ac0 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f  crypt)(CK_SESSIO
27ad0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
27ae0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
27af0 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 43  EncryptedData, C
27b00 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
27b10 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42  tedDataLen, CK_B
27b20 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
27b30 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
27b40 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55 4c  ataLen) {..CK_UL
27b50 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64 61  ONG datalen_upda
27b60 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61  te, datalen_fina
27b70 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79 70  l;..CK_RV decryp
27b80 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65  t_ret;..int mute
27b90 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
27ba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27bb0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27bc0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
27bd0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
27be0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27bf0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
27c00 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
27c10 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
27c20 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
27c30 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ED);..}...if (pu
27c40 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  lDataLen == NULL
27c50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27c60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27c70 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73 20  . pulDataLen is 
27c80 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
27c90 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
27ca0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74 61  _BAD);..}...data
27cb0 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70 75  len_update = *pu
27cc0 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63 72  lDataLen;...decr
27cd0 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72  ypt_ret = C_Decr
27ce0 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73 69  yptUpdate(hSessi
27cf0 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44 61  on, pEncryptedDa
27d00 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 44  ta, ulEncryptedD
27d10 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20 26  ataLen, pData, &
27d20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29 3b  datalen_update);
27d30 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
27d40 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
27d50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27d60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65  INTF("Error.  De
27d70 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72 65  cryptUpdate() re
27d80 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
27d90 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
27da0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
27db0 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69 66  rypt_ret);....if
27dc0 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d   (decrypt_ret !=
27dd0 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
27de0 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20 54  SMALL) {..../* T
27df0 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70 74  erminate decrypt
27e00 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ion operation */
27e10 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  .....mutex_retva
27e20 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
27e30 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
27e40 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
27e50 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
27e60 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
27e70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27e80 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
27e90 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  ed.");......retu
27ea0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
27eb0 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  RROR);....}.....
27ec0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
27ed0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
27ee0 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63  ctive) {.....cac
27ef0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
27f00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
27f10 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
27f20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27f30 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
27f40 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
27f50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
27f60 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
27f70 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  LID);....}.....i
27f80 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
27f90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
27fa0 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a  crypt_active) {.
27fb0 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
27fc0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
27fd0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
27fe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27ff0 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79  F("Error.  Decry
28000 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  pt not active.")
28010 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
28020 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
28030 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
28040 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
28050 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28060 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
28070 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78  e = 0;.....mutex
28080 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
28090 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
280a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
280b0 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
280c0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
280d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
280e0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
280f0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
28100 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28110 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28120 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74  ....}...}....ret
28130 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74 29  urn(decrypt_ret)
28140 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74 61  ;..}...if (pData
28150 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20 64  ) {...pData += d
28160 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a 09  atalen_update;..
28170 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  }..datalen_final
28180 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20 2d   = *pulDataLen -
28190 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b   datalen_update;
281a0 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d  ...decrypt_ret =
281b0 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 28   C_DecryptFinal(
281c0 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c  hSession, pData,
281d0 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 29   &datalen_final)
281e0 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
281f0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
28200 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28210 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
28220 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72 65  ecryptFinal() re
28230 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
28240 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
28250 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65 63  signed long) dec
28260 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72 65  rypt_ret);....re
28270 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
28280 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74 61  );..}...*pulData
28290 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75 70  Len = datalen_up
282a0 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f 66  date + datalen_f
282b0 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  inal;...CACKEY_D
282c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
282d0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
282e0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
282f0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
28300 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
28310 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
28320 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b  ecryptUpdate)(CK
28330 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
28340 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
28350 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
28360 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
28370 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
28380 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
28390 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
283a0 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
283b0 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45  ..static CK_BYTE
283c0 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73 73   buf[16384];..ss
283d0 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09 43  ize_t buflen;..C
283e0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
283f0 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20  ;..CK_RV retval 
28400 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  = CKR_GENERAL_ER
28410 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ROR;..int mutex_
28420 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
28430 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
28440 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
28450 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
28460 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
28470 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28480 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
28490 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
284a0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
284b0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
284c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
284d0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
284e0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
284f0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
28500 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
28510 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
28520 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
28530 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28540 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
28550 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
28560 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
28570 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
28580 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e  D);..}...if (pEn
28590 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e  cryptedPart == N
285a0 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70 74  ULL && ulEncrypt
285b0 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  edPartLen == 0) 
285c0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
285d0 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20 61  cuit if we are a
285e0 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74 20  sked to decrypt 
285f0 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09  nothing... */...
28600 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28610 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
28620 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
28630 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
28640 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
28650 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
28660 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74   (pEncryptedPart
28670 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
28680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28690 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72 79  F("Error. pEncry
286a0 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c 4c  ptedPart is NULL
286b0 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74 65  , but ulEncrypte
286c0 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  dPartLen is not 
286d0 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
286e0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
286f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 45  D);..}...if (ulE
28700 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
28710 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
28720 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28730 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74 65  rror. ulEncrypte
28740 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62  dPartLen is 0, b
28750 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20  ut pPart is not 
28760 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
28770 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
28780 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
28790 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e 55  pulPartLen == NU
287a0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
287b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
287c0 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20 69  or. pulPartLen i
287d0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
287e0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
287f0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
28800 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
28810 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
28820 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28830 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
28840 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
28850 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28860 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
28870 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
28880 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
28890 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
288a0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
288b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
288c0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
288d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
288e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
288f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28900 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
28910 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
28920 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
28930 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
28940 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
28950 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
28960 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28970 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
28980 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
28990 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
289a0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
289b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
289c0 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
289d0 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
289e0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
289f0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
28a00 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
28a10 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63  }...slotID = cac
28a20 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28a30 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a  ssion].slotID;..
28a40 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
28a50 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
28a60 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
28a70 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
28a80 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
28a90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28aa0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
28ab0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
28ac0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
28ad0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
28ae0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
28af0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
28b00 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
28b10 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
28b20 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
28b30 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
28b40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28b50 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
28b60 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
28b70 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
28b80 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
28b90 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
28ba0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
28bb0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
28bc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28bd0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28be0 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61  ..}...switch (ca
28bf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28c00 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
28c10 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
28c20 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
28c30 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72 64  :..../* Ask card
28c40 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a 09   to decrypt */..
28c50 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65  ..buflen = cacke
28c60 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63  y_signdecrypt(&c
28c70 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
28c80 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ID], cackey_sess
28c90 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
28ca0 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79 2c  ecrypt_identity,
28cb0 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
28cc0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
28cd0 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  Len, buf, sizeof
28ce0 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a 09  (buf), 0, 1);...
28cf0 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20 30  ..if (buflen < 0
28d00 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79  ) {...../* Decry
28d10 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a 2f  ption failed. */
28d20 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
28d30 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
28d40 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09  _NEEDLOGIN) {...
28d50 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
28d60 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f  USER_NOT_LOGGED_
28d70 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69  IN;.....} else i
28d80 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
28d90 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
28da0 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72  ABSENT) {......r
28db0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49  etval = CKR_DEVI
28dc0 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09  CE_REMOVED;.....
28dd0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65  } else {......re
28de0 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
28df0 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a  AL_ERROR;.....}.
28e00 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28  ...} else if (((
28e10 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62  unsigned long) b
28e20 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61 72  uflen) > *pulPar
28e30 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20 7b  tLen && pPart) {
28e40 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74 65  ...../* Decrypte
28e50 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67 65  d data too large
28e60 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20 3d   */.....retval =
28e70 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
28e80 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73 65  SMALL;....} else
28e90 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72 74   {.....if (pPart
28ea0 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28  ) {......memcpy(
28eb0 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66 6c  pPart, buf, bufl
28ec0 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  en);.....}......
28ed0 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62 75  *pulPartLen = bu
28ee0 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61  flen;......retva
28ef0 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d  l = CKR_OK;....}
28f00 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a  .....break;..}..
28f10 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
28f20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
28f30 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28f40 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
28f50 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
28f60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28f70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
28f80 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
28f90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28fa0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
28fb0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
28fc0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
28fd0 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20  ning %i", (int) 
28fe0 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
28ff0 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b  n(retval);.}..CK
29000 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
29010 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
29020 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
29030 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29040 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
29050 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55 4c  pLastPart, CK_UL
29060 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 50  ONG_PTR pulLastP
29070 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d  artLen) {..int m
29080 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
29090 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72  t terminate_decr
290a0 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45  ypt = 1;...CACKE
290b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
290c0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
290d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
290e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
290f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29100 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
29110 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
29120 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
29130 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
29140 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
29150 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
29160 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
29170 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
29180 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
29190 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
291a0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
291b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
291c0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
291d0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
291e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
291f0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
29200 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75  ID);..}...if (pu
29210 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d 20  lLastPartLen == 
29220 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
29230 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29240 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61 72  rror. pulLastPar
29250 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  tLen is NULL.");
29260 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
29270 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
29280 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
29290 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
292a0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
292b0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
292c0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
292d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
292e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
292f0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
29300 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29310 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
29320 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
29330 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29340 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
29350 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
29360 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
29370 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
29380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29390 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
293a0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
293b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
293c0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
293d0 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  ID);..}...if (!c
293e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
293f0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
29400 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  _active) {...cac
29410 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
29420 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
29430 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
29440 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29450 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
29460 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
29470 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
29480 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
29490 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c 61  ED);..}...*pulLa
294a0 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a 0a  stPartLen = 0;..
294b0 09 69 66 20 28 70 4c 61 73 74 50 61 72 74 20 3d  .if (pLastPart =
294c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72 6d  = NULL) {...term
294d0 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20  inate_decrypt = 
294e0 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  0;..}...if (term
294f0 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20 7b  inate_decrypt) {
29500 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
29510 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
29520 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
29530 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
29540 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
29550 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
29560 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
29570 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
29580 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29590 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
295a0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
295b0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
295c0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
295d0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
295e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
295f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
29600 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
29610 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
29620 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
29630 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
29640 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43 4b  C_DigestInit)(CK
29650 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
29660 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
29670 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
29680 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45 59  anism) {..CACKEY
29690 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
296a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
296b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
296c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
296d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
296e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
296f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
29700 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
29710 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
29720 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
29730 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29740 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
29750 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29760 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
29770 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29780 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
29790 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
297a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
297b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
297c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
297d0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
297e0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
297f0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
29800 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
29810 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
29820 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c  R pDigest, CK_UL
29830 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73  ONG_PTR pulDiges
29840 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
29850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29860 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29870 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29880 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29890 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
298a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
298b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
298c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
298d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
298e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
298f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29900 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
29910 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29920 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
29930 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29940 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
29950 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29960 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
29970 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
29980 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
29990 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
299a0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
299b0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
299c0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
299d0 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
299e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
299f0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
29a00 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
29a10 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
29a20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29a30 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
29a40 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
29a50 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
29a60 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
29a70 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
29a80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29a90 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
29aa0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
29ab0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
29ac0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29ad0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
29ae0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
29af0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29b00 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
29b10 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
29b20 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45 53  igestKey)(CK_SES
29b30 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
29b40 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
29b50 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
29b60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29b70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
29b80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
29b90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
29ba0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29bb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
29bc0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
29bd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
29be0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
29bf0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
29c00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29c10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
29c20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29c30 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
29c40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29c50 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
29c60 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
29c70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
29c80 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
29c90 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
29ca0 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43 4b  _DigestFinal)(CK
29cb0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
29cc0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
29cd0 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43  E_PTR pDigest, C
29ce0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
29cf0 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43  igestLen) {..CAC
29d00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29d10 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
29d20 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
29d30 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
29d40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29d50 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
29d60 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
29d70 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
29d80 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
29d90 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
29da0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29db0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
29dc0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29dd0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
29de0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29df0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
29e00 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
29e10 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
29e20 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29e30 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
29e40 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  gnInit)(CK_SESSI
29e50 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29e60 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
29e70 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
29e80 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
29e90 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d  E hKey) {..int m
29ea0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68  utex_retval;...h
29eb0 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f  Key--;...CACKEY_
29ec0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
29ed0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
29ee0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
29ef0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
29f00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29f10 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
29f20 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
29f30 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
29f40 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
29f50 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68  ;..}...if (pMech
29f60 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b  anism == NULL) {
29f70 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29f80 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
29f90 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c  Mechanism is NUL
29fa0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
29fb0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
29fc0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65  D);..}...if (pMe
29fd0 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
29fe0 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b  sm != CKM_RSA_PK
29ff0 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CS) {...CACKEY_D
2a000 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a010 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  or. pMechanism->
2a020 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70  mechanism not sp
2a030 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f 52  ecified as CKM_R
2a040 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65  SA_PKCS");....re
2a050 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49  turn(CKR_MECHANI
2a060 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44  SM_PARAM_INVALID
2a070 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2a080 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2a090 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2a0a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2a0b0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2a0c0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2a0d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2a0e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2a0f0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2a100 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2a110 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2a120 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2a130 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2a140 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2a150 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2a160 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2a170 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2a180 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2a190 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a1a0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2a1b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a1c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2a1d0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2a1e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2a1f0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2a200 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2a210 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2a220 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2a230 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a240 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2a250 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2a260 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2a270 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2a280 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2a290 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
2a2a0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2a2b0 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
2a2c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2a2d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2a2e0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2a2f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a300 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79 20  .  Sign already 
2a310 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
2a320 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a330 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
2a340 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
2a350 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
2a360 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2a370 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
2a380 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2a390 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2a3a0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2a3b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a3c0 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
2a3d0 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
2a3e0 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20   (requested key 
2a3f0 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64  %lu, only %lu id
2a400 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62  entities availab
2a410 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  le).", (unsigned
2a420 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e   long) hKey, (un
2a430 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
2a440 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a450 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2a460 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  s_count);....ret
2a470 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44  urn(CKR_KEY_HAND
2a480 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2a490 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2a4a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2a4b0 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63  _active = 1;...c
2a4c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2a4d0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65  Session].sign_me
2a4e0 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61  chanism = pMecha
2a4f0 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b  nism->mechanism;
2a500 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2a510 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2a520 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b 0a  n_buflen = 128;.
2a530 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2a540 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2a550 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63 61  bufused = 0;..ca
2a560 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a570 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2a580 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
2a590 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (*cackey_session
2a5a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2a5b0 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f 73  _buf) * cackey_s
2a5c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a5d0 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a  ].sign_buflen);.
2a5e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a5f0 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20 25  RINTF("Session %
2a600 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  lu sign_identity
2a610 20 69 73 20 25 70 20 28 69 64 65 6e 74 69 74 79   is %p (identity
2a620 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e   #%lu)", (unsign
2a630 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f  ed long) hSessio
2a640 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63 61 63  n, (void *) &cac
2a650 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a660 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2a670 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67 6e  s[hKey], (unsign
2a680 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b 0a  ed long) hKey);.
2a690 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2a6a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2a6b0 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
2a6c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a6d0 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
2a6e0 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
2a6f0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2a700 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2a710 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2a720 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2a730 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2a740 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a750 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2a760 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2a770 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2a780 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2a790 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a7a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a7b0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2a7c0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2a7d0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2a7e0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2a7f0 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f 53  RV, C_Sign)(CK_S
2a800 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2a810 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2a820 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c  PTR pData, CK_UL
2a830 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43  ONG ulDataLen, C
2a840 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
2a850 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
2a860 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
2a870 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  Len) {..unsigned
2a880 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67 6e   long start_sign
2a890 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52 56  _bufused;..CK_RV
2a8a0 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74 20   sign_ret;..int 
2a8b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2a8c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a8d0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2a8e0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2a8f0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2a900 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a910 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2a920 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2a930 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2a940 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2a950 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2a960 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2a970 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2a980 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2a990 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2a9a0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2a9b0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2a9c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a9d0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2a9e0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2a9f0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2aa00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2aa10 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
2aa20 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
2aa30 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  d = cackey_sessi
2aa40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2aa50 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73 69  gn_bufused;...si
2aa60 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 55  gn_ret = C_SignU
2aa70 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20  pdate(hSession, 
2aa80 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65 6e  pData, ulDataLen
2aa90 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74  );..if (sign_ret
2aaa0 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
2aab0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2aac0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
2aad0 6e 55 70 64 61 74 65 28 29 20 72 65 74 75 72 6e  nUpdate() return
2aae0 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d  ed failure (rv =
2aaf0 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e   %lu).", (unsign
2ab00 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65  ed long) sign_re
2ab10 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e 5f  t);....if (sign_
2ab20 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45  ret != CKR_BUFFE
2ab30 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
2ab40 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2ab50 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
2ab60 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2ab70 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
2ab80 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2ab90 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2aba0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2abb0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
2abc0 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
2abd0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2abe0 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  R);....}.....if 
2abf0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2ac00 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2ac10 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  ve) {.....cackey
2ac20 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2ac30 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2ac40 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2ac50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ac60 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2ac70 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72  ive.");........r
2ac80 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2ac90 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2aca0 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  );....}.....if (
2acb0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2acc0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2acd0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
2ace0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2acf0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2ad00 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
2ad10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ad20 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
2ad30 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
2ad40 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2ad50 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2ad60 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  IZED);....}.....
2ad70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ad80 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61  hSession].sign_a
2ad90 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d  ctive = 0;.....m
2ada0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2adb0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2adc0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2add0 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
2ade0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2adf0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ae00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ae10 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2ae20 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
2ae30 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2ae40 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  OR);....}...}...
2ae50 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74  .return(sign_ret
2ae60 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65 74  );..}...sign_ret
2ae70 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28 68   = C_SignFinal(h
2ae80 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61 74  Session, pSignat
2ae90 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75 72  ure, pulSignatur
2aea0 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e  eLen);..if (sign
2aeb0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
2aec0 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65 74  {...if (sign_ret
2aed0 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54   == CKR_BUFFER_T
2aee0 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 43  OO_SMALL) {....C
2aef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2af00 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29 20  TF("SignFinal() 
2af10 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55 46  returned CKR_BUF
2af20 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 72  FER_TOO_SMALL (r
2af30 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69 6e  v = %lu), undoin
2af40 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29  g C_SignUpdate()
2af50 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2af60 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
2af70 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2af80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2af90 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72 74  _bufused = start
2afa0 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a  _sign_bufused;..
2afb0 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
2afc0 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  et);...}....CACK
2afd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2afe0 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69 6e  "Error.  SignFin
2aff0 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  al() returned fa
2b000 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
2b010 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
2b020 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a  ng) sign_ret);..
2b030 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
2b040 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53 69  t);..}...if (pSi
2b050 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c 29  gnature == NULL)
2b060 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2b070 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e 61  G_PRINTF("pSigna
2b080 74 75 72 65 20 73 70 65 63 69 66 69 65 64 20 61  ture specified a
2b090 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67 20  s NULL, undoing 
2b0a0 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22 29  C_SignUpdate()")
2b0b0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
2b0c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b0d0 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74  ign_bufused = st
2b0e0 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
2b0f0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  ;....return(sign
2b100 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  _ret);..}...CACK
2b110 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b120 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
2b130 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
2b140 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
2b150 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
2b160 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2b170 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28 43   C_SignUpdate)(C
2b180 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2b190 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2b1a0 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2b1b0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
2b1c0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
2b1d0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
2b1e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2b1f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2b200 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2b210 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2b220 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b230 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2b240 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2b250 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2b260 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2b270 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2b280 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2b290 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2b2a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2b2b0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2b2c0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2b2d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b2e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b2f0 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2b300 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2b310 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2b320 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2b330 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
2b340 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 50  t == NULL && ulP
2b350 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
2b360 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
2b370 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b 65  t if we are aske
2b380 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69 6e  d to sign nothin
2b390 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59  g... */...CACKEY
2b3a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2b3b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2b3c0 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
2b3d0 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
2b3e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
2b3f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61 72  );..}...if (pPar
2b400 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
2b410 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b420 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72 74  TF("Error. pPart
2b430 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
2b440 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20 30  PartLen is not 0
2b450 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2b460 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2b470 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50 61  );..}...if (ulPa
2b480 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09  rtLen == 0) {...
2b490 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b4a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50 61  NTF("Error. ulPa
2b4b0 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74 20  rtLen is 0, but 
2b4c0 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c  pPart is not NUL
2b4d0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
2b4e0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2b4f0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2b500 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2b510 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2b520 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2b530 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2b540 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2b550 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b560 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2b570 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b580 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2b590 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2b5a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b5b0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2b5c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2b5d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b5e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2b5f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b600 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2b610 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2b620 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2b630 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2b640 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2b650 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2b660 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2b670 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
2b680 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2b690 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2b6a0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2b6b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b6c0 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
2b6d0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2b6e0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2b6f0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2b700 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  D);..}...switch 
2b710 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2b720 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2b730 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09 63  mechanism) {...c
2b740 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ase CKM_RSA_PKCS
2b750 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c 61  :..../* Accumula
2b760 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 09  te directly */..
2b770 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73 65  ..if ((cackey_se
2b780 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b790 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 20  .sign_bufused + 
2b7a0 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61 63  ulPartLen) > cac
2b7b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b7c0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
2b7d0 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79  en) {.....cackey
2b7e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b7f0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
2b800 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b 65  *= 2;......cacke
2b810 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b820 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d 20  ion].sign_buf = 
2b830 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f 73  realloc(cackey_s
2b840 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b850 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a 65  ].sign_buf, size
2b860 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69  of(*cackey_sessi
2b870 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2b880 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79  gn_buf) * cackey
2b890 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b8a0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29  on].sign_buflen)
2b8b0 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70  ;....}.....memcp
2b8c0 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  y(cackey_session
2b8d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b8e0 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73 65  _buf + cackey_se
2b8f0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b900 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20 70  .sign_bufused, p
2b910 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e 29  Part, ulPartLen)
2b920 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
2b930 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b940 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d 20  sign_bufused += 
2b950 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09 62  ulPartLen;.....b
2b960 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  reak;..}...mutex
2b970 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2b980 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b990 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2b9a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2b9b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2b9c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b9d0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2b9e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2b9f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2ba00 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2ba10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ba20 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2ba30 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2ba40 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2ba50 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2ba60 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2ba70 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61 6c  _RV, C_SignFinal
2ba80 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2ba90 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2baa0 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2bab0 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  ture, CK_ULONG_P
2bac0 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  TR pulSignatureL
2bad0 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b  en) {..static CK
2bae0 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31 30 32  _BYTE sigbuf[102
2baf0 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69 67  4];..ssize_t sig
2bb00 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54  buflen;..CK_SLOT
2bb10 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
2bb20 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  RV retval = CKR_
2bb30 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
2bb40 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73 69  int terminate_si
2bb50 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74  gn = 1;..int mut
2bb60 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2bb70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2bb80 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2bb90 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2bba0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2bbb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bbc0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2bbd0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2bbe0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2bbf0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2bc00 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2bc10 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 3d  ulSignatureLen =
2bc20 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2bc30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bc40 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e 61  "Error. pulSigna
2bc50 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e  tureLen is NULL.
2bc60 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2bc70 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
2bc80 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
2bc90 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
2bca0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
2bcb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
2bcc0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2bcd0 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
2bce0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2bcf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2bd00 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
2bd10 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
2bd20 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2bd30 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2bd40 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
2bd50 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2bd60 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
2bd70 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2bd80 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2bd90 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2bda0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2bdb0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
2bdc0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2bdd0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2bde0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
2bdf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2be00 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
2be10 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2be20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2be30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2be40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2be50 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2be60 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2be70 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2be80 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2be90 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2bea0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2beb0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2bec0 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  n_active) {...ca
2bed0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2bee0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2bef0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2bf00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2bf10 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74 69  .  Sign not acti
2bf20 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2bf30 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2bf40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2bf50 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
2bf60 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2bf70 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
2bf80 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
2bf90 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
2bfa0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
2bfb0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
2bfc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
2bfd0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
2bfe0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2bff0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
2c000 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
2c010 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
2c020 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
2c030 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2c040 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2c050 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2c060 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
2c070 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
2c080 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c090 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
2c0a0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
2c0b0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
2c0c0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
2c0d0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
2c0e0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2c0f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2c100 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
2c110 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2c120 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
2c130 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2c140 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2c150 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
2c160 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
2c170 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72  S:..../* Ask car
2c180 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09 09  d to sign */....
2c190 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c1a0 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20 73  NTF("Asking to s
2c1b0 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69 74  ign from identit
2c1c0 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e 20  y %p in session 
2c1d0 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29 20 63  %lu", (void *) c
2c1e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c1f0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64  Session].sign_id
2c200 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e 65  entity, (unsigne
2c210 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f 6e  d long) hSession
2c220 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e 20  );....sigbuflen 
2c230 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
2c240 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
2c250 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
2c260 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c270 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74  sion].sign_ident
2c280 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73 73  ity, cackey_sess
2c290 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2c2a0 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79 5f  ign_buf, cackey_
2c2b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c2c0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c  n].sign_bufused,
2c2d0 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66 28   sigbuf, sizeof(
2c2e0 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b 0a  sigbuf), 1, 0);.
2c2f0 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c 65  ....if (sigbufle
2c300 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20  n < 0) {...../* 
2c310 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e 20  Signing failed. 
2c320 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62 75  */.....if (sigbu
2c330 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50  flen == CACKEY_P
2c340 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
2c350 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
2c360 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f   CKR_USER_NOT_LO
2c370 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65  GGED_IN;.....} e
2c380 6c 73 65 20 69 66 20 28 73 69 67 62 75 66 6c 65  lse if (sigbufle
2c390 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
2c3a0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
2c3b0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2c3c0 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
2c3d0 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ED;.....} else {
2c3e0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2c3f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2c400 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
2c410 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64  e if (((unsigned
2c420 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65 6e   long) sigbuflen
2c430 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75 72  ) > *pulSignatur
2c440 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74 75  eLen && pSignatu
2c450 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67  re) {...../* Sig
2c460 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72  ned data too lar
2c470 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45 59  ge */.....CACKEY
2c480 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 72  _DEBUG_PRINTF("r
2c490 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2c4a0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20 73  ER_TOO_SMALL;  s
2c4b0 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c 20  igbuflen = %lu, 
2c4c0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2c4d0 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65  = %lu", (unsigne
2c4e0 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
2c4f0 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  n, (unsigned lon
2c500 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  g) *pulSignature
2c510 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76 61  Len);......retva
2c520 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54  l = CKR_BUFFER_T
2c530 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09 74  OO_SMALL;......t
2c540 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20  erminate_sign = 
2c550 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  0;....} else {..
2c560 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
2c570 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20 28  n = 0;......if (
2c580 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
2c590 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e 61  ...memcpy(pSigna
2c5a0 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73 69  ture, sigbuf, si
2c5b0 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 09  gbuflen);.......
2c5c0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
2c5d0 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2a   1;.....}......*
2c5e0 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2c5f0 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09 09  = sigbuflen;....
2c600 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
2c610 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
2c620 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72 6d  k;..}...if (term
2c630 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09 09  inate_sign) {...
2c640 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2c650 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2c660 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72 65  gn_buf) {....fre
2c670 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
2c680 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2c690 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  _buf);...}....ca
2c6a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c6b0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
2c6c0 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ive = 0;..}...mu
2c6d0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2c6e0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2c6f0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c700 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2c710 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2c720 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c730 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2c740 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2c750 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2c760 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2c770 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c780 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2c790 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65 74  g %i", (int) ret
2c7a0 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
2c7b0 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  etval);.}..CK_DE
2c7c0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2c7d0 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76  _RV, C_SignRecov
2c7e0 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  erInit)(CK_SESSI
2c7f0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2c800 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2c810 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2c820 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2c830 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
2c840 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c850 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2c860 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2c870 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2c880 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c890 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2c8a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2c8b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2c8c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2c8d0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2c8e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2c8f0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2c900 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c910 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2c920 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c930 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2c940 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c950 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2c960 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2c970 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e  ON(CK_RV, C_Sign
2c980 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
2c990 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2c9a0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2c9b0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
2c9c0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
2c9d0 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2c9e0 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  re, CK_ULONG_PTR
2c9f0 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
2ca00 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2ca10 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2ca20 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2ca30 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2ca40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ca50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2ca60 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2ca70 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ca80 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2ca90 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2caa0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2cab0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2cac0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2cad0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2cae0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2caf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2cb00 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2cb10 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2cb20 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2cb30 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2cb40 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69 74  RV, C_VerifyInit
2cb50 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2cb60 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2cb70 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2cb80 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
2cb90 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2cba0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2cbb0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2cbc0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2cbd0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2cbe0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2cbf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2cc00 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2cc10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2cc20 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2cc30 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2cc40 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2cc50 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2cc60 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2cc70 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2cc80 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2cc90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2cca0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ccb0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ccc0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2ccd0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2cce0 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43 4b  RV, C_Verify)(CK
2ccf0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2cd00 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2cd10 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f  E_PTR pData, CK_
2cd20 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c  ULONG ulDataLen,
2cd30 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69   CK_BYTE_PTR pSi
2cd40 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e  gnature, CK_ULON
2cd50 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  G ulSignatureLen
2cd60 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2cd70 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2cd80 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2cd90 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2cda0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2cdb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2cdc0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2cdd0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2cde0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2cdf0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2ce00 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ce10 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2ce20 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ce30 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ce40 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ce50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ce60 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ce70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ce80 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2ce90 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2cea0 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64 61  RV, C_VerifyUpda
2ceb0 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2cec0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2ced0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2cee0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
2cef0 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
2cf00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2cf10 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2cf20 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2cf30 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2cf40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2cf50 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2cf60 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2cf70 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2cf80 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2cf90 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2cfa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2cfb0 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2cfc0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2cfd0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2cfe0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2cff0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2d000 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d010 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2d020 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d030 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66  N(CK_RV, C_Verif
2d040 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  yFinal)(CK_SESSI
2d050 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2d060 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2d070 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2d080 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65  LONG ulSignature
2d090 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2d0a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2d0b0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2d0c0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2d0d0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2d0e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2d0f0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2d100 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2d110 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2d120 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2d130 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2d140 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2d150 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2d160 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2d170 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2d180 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d190 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2d1a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2d1b0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2d1c0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2d1d0 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52  CK_RV, C_VerifyR
2d1e0 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
2d1f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2d200 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2d210 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2d220 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2d230 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2d240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d250 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2d260 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2d270 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2d280 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d290 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2d2a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2d2b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2d2c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2d2d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2d2e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d2f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2d300 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d310 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2d320 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d330 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2d340 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2d350 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d360 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2d370 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2d380 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28 43  VerifyRecover)(C
2d390 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2d3a0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2d3b0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
2d3c0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
2d3d0 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f 42  gnatureLen, CK_B
2d3e0 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2d3f0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
2d400 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ataLen) {..CACKE
2d410 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d420 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2d430 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2d440 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2d450 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d460 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2d470 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2d480 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2d490 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2d4a0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2d4b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2d4c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2d4d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d4e0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2d4f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d500 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2d510 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2d520 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2d530 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2d540 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
2d550 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 29  stEncryptUpdate)
2d560 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2d570 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2d580 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
2d590 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c  CK_ULONG ulPartL
2d5a0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2d5b0 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
2d5c0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2d5d0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2d5e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2d5f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2d600 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2d610 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2d620 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d630 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d640 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2d650 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d660 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2d670 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2d680 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d690 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2d6a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2d6b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2d6c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2d6d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d6e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2d6f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d700 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2d710 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2d720 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69 67  RV, C_DecryptDig
2d730 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  estUpdate)(CK_SE
2d740 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2d750 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2d760 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
2d770 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  t, CK_ULONG ulEn
2d780 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20  cryptedPartLen, 
2d790 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2d7a0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2d7b0 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  pulPartLen) {..C
2d7c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d7d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2d7e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2d7f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2d800 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d810 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2d820 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2d830 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2d840 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2d850 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2d860 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d870 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2d880 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d890 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2d8a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d8b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2d8c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2d8d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d8e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2d8f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2d900 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74  SignEncryptUpdat
2d910 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2d920 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2d930 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2d940 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2d950 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2d960 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  R pEncryptedPart
2d970 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2d980 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2d990 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2d9a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2d9b0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2d9c0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2d9d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d9e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d9f0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2da00 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2da10 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2da20 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2da30 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2da40 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2da50 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2da60 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2da70 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2da80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2da90 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2daa0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2dab0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2dac0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2dad0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 56  K_RV, C_DecryptV
2dae0 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f  erifyUpdate)(CK_
2daf0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2db00 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2db10 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
2db20 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2db30 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
2db40 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2db50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
2db60 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  R pulPartLen) {.
2db70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2db80 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2db90 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2dba0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2dbb0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dbc0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2dbd0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2dbe0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2dbf0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2dc00 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2dc10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dc20 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2dc30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2dc40 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2dc50 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2dc60 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2dc70 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2dc80 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2dc90 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2dca0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2dcb0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28 43  C_GenerateKey)(C
2dcc0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2dcd0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2dce0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2dcf0 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
2dd00 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
2dd10 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
2dd20 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
2dd30 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
2dd40 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2dd50 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2dd60 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2dd70 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2dd80 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2dd90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2dda0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2ddb0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2ddc0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2ddd0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2dde0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ddf0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2de00 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2de10 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2de20 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2de30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2de40 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2de50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2de60 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2de70 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2de80 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
2de90 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49 4f  yPair)(CK_SESSIO
2dea0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2deb0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2dec0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2ded0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
2dee0 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70 6c   pPublicKeyTempl
2def0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
2df00 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62 75  PublicKeyAttribu
2df10 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54 52  teCount, CK_ATTR
2df20 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76 61  IBUTE_PTR pPriva
2df30 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  teKeyTemplate, C
2df40 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61 74  K_ULONG ulPrivat
2df50 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75  eKeyAttributeCou
2df60 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
2df70 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c 69  NDLE_PTR phPubli
2df80 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  cKey, CK_OBJECT_
2df90 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72 69  HANDLE_PTR phPri
2dfa0 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43 4b  vateKey) {..CACK
2dfb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2dfc0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2dfd0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2dfe0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2dff0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e000 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2e010 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2e020 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2e030 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2e040 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2e050 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e060 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2e070 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e080 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2e090 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e0a0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2e0b0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2e0c0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2e0d0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e0e0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72 61  ION(CK_RV, C_Wra
2e0f0 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
2e100 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2e110 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2e120 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2e130 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2e140 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  hWrappingKey, CK
2e150 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2e160 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Key, CK_BYTE_PTR
2e170 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43 4b   pWrappedKey, CK
2e180 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57 72  _ULONG_PTR pulWr
2e190 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a 09  appedKeyLen) {..
2e1a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e1b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2e1c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2e1d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2e1e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e1f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2e200 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2e210 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2e220 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2e230 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2e240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e250 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2e260 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e270 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2e280 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e290 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2e2a0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2e2b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e2c0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2e2d0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2e2e0 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f 53  _UnwrapKey)(CK_S
2e2f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2e300 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2e310 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2e320 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2e330 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69 6e  ANDLE hUnwrappin
2e340 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  gKey, CK_BYTE_PT
2e350 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
2e360 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70 65  K_ULONG ulWrappe
2e370 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54 52  dKeyLen, CK_ATTR
2e380 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
2e390 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
2e3a0 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
2e3b0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2e3c0 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
2e3d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e3e0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e3f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2e400 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2e410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e420 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2e430 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2e440 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2e450 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2e460 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2e470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e480 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2e490 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e4a0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2e4b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e4c0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2e4d0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2e4e0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e4f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2e500 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2e510 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53 45  DeriveKey)(CK_SE
2e520 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2e530 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2e540 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2e550 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
2e560 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20 43  NDLE hBaseKey, C
2e570 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
2e580 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
2e590 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65 43  ONG ulAttributeC
2e5a0 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  ount, CK_OBJECT_
2e5b0 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79  HANDLE_PTR phKey
2e5c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2e5d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2e5e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2e5f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2e600 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e610 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e620 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2e630 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e640 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2e650 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2e660 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e670 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2e680 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2e690 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2e6a0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2e6b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e6c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2e6d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e6e0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2e6f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2e700 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d  RV, C_SeedRandom
2e710 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2e720 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2e730 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64 2c  _BYTE_PTR pSeed,
2e740 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65 64   CK_ULONG ulSeed
2e750 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2e760 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2e770 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2e780 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2e790 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2e7a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e7b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2e7c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2e7d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2e7e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2e7f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2e800 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2e810 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2e820 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2e830 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2e840 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e850 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2e860 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e870 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2e880 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2e890 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
2e8a0 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  eRandom)(CK_SESS
2e8b0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2e8c0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2e8d0 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43 4b   pRandomData, CK
2e8e0 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d 4c  _ULONG ulRandomL
2e8f0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2e900 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2e910 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2e920 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2e930 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2e940 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2e950 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2e960 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2e970 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2e980 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2e990 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2e9a0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2e9b0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2e9c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2e9d0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2e9e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2e9f0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ea00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ea10 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 44  PORTED);.}../* D
2ea20 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69  eprecated Functi
2ea30 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  on */.CK_DEFINE_
2ea40 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2ea50 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
2ea60 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  tus)(CK_SESSION_
2ea70 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
2ea80 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2ea90 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2eaa0 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
2eab0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2eac0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2ead0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
2eae0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2eaf0 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
2eb00 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2eb10 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
2eb20 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
2eb30 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
2eb40 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
2eb50 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
2eb60 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63   */.}../* Deprec
2eb70 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f  ated Function */
2eb80 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2eb90 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61 6e  ION(CK_RV, C_Can
2eba0 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b 5f  celFunction)(CK_
2ebb0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ebc0 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
2ebd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ebe0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
2ebf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ec00 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2ec10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
2ec20 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
2ec30 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
2ec40 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
2ec50 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2ec60 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
2ec70 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
2ec80 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
2ec90 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
2eca0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
2ecb0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2ecc0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75  N(CK_RV, C_GetFu
2ecd0 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f 46  nctionList)(CK_F
2ece0 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
2ecf0 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e 4c  _PTR ppFunctionL
2ed00 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43 54  ist) {..CK_FUNCT
2ed10 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46 75  ION_LIST_PTR pFu
2ed20 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
2ed30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ed40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2ed50 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c 69  if (ppFunctionLi
2ed60 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  st == NULL) {...
2ed70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ed80 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46 75  NTF("Error. ppFu
2ed90 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e 55  nctionList is NU
2eda0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2edb0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2edc0 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63 74  AD);..}...pFunct
2edd0 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f 63  ionList = malloc
2ede0 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74 69  (sizeof(*pFuncti
2edf0 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75 6e  onList));...pFun
2ee00 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
2ee10 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43  on.major = ((CAC
2ee20 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
2ee30 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36  SION_CODE) >> 16
2ee40 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e 63  ) & 0xff;..pFunc
2ee50 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69 6f  tionList->versio
2ee60 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b  n.minor = ((CACK
2ee70 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
2ee80 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20  ION_CODE) >> 8) 
2ee90 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63 74  & 0xff;...pFunct
2eea0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 69  ionList->C_Initi
2eeb0 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69 61  alize = C_Initia
2eec0 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
2eed0 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a 65  List->C_Finalize
2eee0 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a 09   = C_Finalize;..
2eef0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ef00 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74  _GetInfo = C_Get
2ef10 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
2ef20 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 4c  List->C_GetSlotL
2ef30 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74 4c  ist = C_GetSlotL
2ef40 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ist;..pFunctionL
2ef50 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49 6e  ist->C_GetSlotIn
2ef60 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49 6e  fo = C_GetSlotIn
2ef70 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
2ef80 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49 6e  st->C_GetTokenIn
2ef90 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e 49  fo = C_GetTokenI
2efa0 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
2efb0 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53 6c  ist->C_WaitForSl
2efc0 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69 74  otEvent = C_Wait
2efd0 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09 70  ForSlotEvent;..p
2efe0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2eff0 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74  GetMechanismList
2f000 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
2f010 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f  mList;..pFunctio
2f020 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68  nList->C_GetMech
2f030 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47 65  anismInfo = C_Ge
2f040 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b 0a  tMechanismInfo;.
2f050 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f060 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43 5f  C_InitToken = C_
2f070 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75 6e  InitToken;..pFun
2f080 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69  ctionList->C_Ini
2f090 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49 4e  tPIN = C_InitPIN
2f0a0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f0b0 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f 53  ->C_SetPIN = C_S
2f0c0 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f  etPIN;..pFunctio
2f0d0 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65 73  nList->C_OpenSes
2f0e0 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65 73  sion = C_OpenSes
2f0f0 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  sion;..pFunction
2f100 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65 73  List->C_CloseSes
2f110 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53 65  sion = C_CloseSe
2f120 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
2f130 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41 6c  nList->C_CloseAl
2f140 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43 6c  lSessions = C_Cl
2f150 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b 0a  oseAllSessions;.
2f160 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f170 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
2f180 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49   = C_GetSessionI
2f190 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
2f1a0 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61 74  ist->C_GetOperat
2f1b0 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65 74  ionState = C_Get
2f1c0 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a  OperationState;.
2f1d0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f1e0 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
2f1f0 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72 61  ate = C_SetOpera
2f200 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e  tionState;..pFun
2f210 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67  ctionList->C_Log
2f220 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09 70  in = C_Login;..p
2f230 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f240 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f 75  Logout = C_Logou
2f250 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2f260 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65 63  t->C_CreateObjec
2f270 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a 65  t = C_CreateObje
2f280 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
2f290 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63 74  st->C_CopyObject
2f2a0 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74 3b   = C_CopyObject;
2f2b0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f2c0 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74  >C_DestroyObject
2f2d0 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65   = C_DestroyObje
2f2e0 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ct;..pFunctionLi
2f2f0 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74 53  st->C_GetObjectS
2f300 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65 63  ize = C_GetObjec
2f310 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  tSize;..pFunctio
2f320 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74 72  nList->C_GetAttr
2f330 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 47  ibuteValue = C_G
2f340 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
2f350 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f360 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  ->C_SetAttribute
2f370 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74 74  Value = C_SetAtt
2f380 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46  ributeValue;..pF
2f390 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
2f3a0 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20 3d  indObjectsInit =
2f3b0 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e   C_FindObjectsIn
2f3c0 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
2f3d0 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
2f3e0 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  s = C_FindObject
2f3f0 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  s;..pFunctionLis
2f400 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73  t->C_FindObjects
2f410 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f 62  Final = C_FindOb
2f420 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46 75  jectsFinal;..pFu
2f430 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
2f440 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45 6e  cryptInit = C_En
2f450 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e  cryptInit;..pFun
2f460 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63  ctionList->C_Enc
2f470 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70 74  rypt = C_Encrypt
2f480 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f490 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61 74  ->C_EncryptUpdat
2f4a0 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70 64  e = C_EncryptUpd
2f4b0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2f4c0 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46 69  ist->C_EncryptFi
2f4d0 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74 46  nal = C_EncryptF
2f4e0 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
2f4f0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 49  List->C_DecryptI
2f500 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74 49  nit = C_DecryptI
2f510 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
2f520 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20 3d  ist->C_Decrypt =
2f530 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46 75   C_Decrypt;..pFu
2f540 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
2f550 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
2f560 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  DecryptUpdate;..
2f570 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f580 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _DecryptFinal = 
2f590 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_DecryptFinal;.
2f5a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f5b0 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20 43  C_DigestInit = C
2f5c0 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70 46  _DigestInit;..pF
2f5d0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2f5e0 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73 74  igest = C_Digest
2f5f0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f600 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74 65  ->C_DigestUpdate
2f610 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61 74   = C_DigestUpdat
2f620 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2f630 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20 3d  t->C_DigestKey =
2f640 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09 70   C_DigestKey;..p
2f650 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f660 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43 5f  DigestFinal = C_
2f670 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70 46  DigestFinal;..pF
2f680 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2f690 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  ignInit = C_Sign
2f6a0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2f6b0 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20 43  List->C_Sign = C
2f6c0 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  _Sign;..pFunctio
2f6d0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70 64  nList->C_SignUpd
2f6e0 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64 61  ate = C_SignUpda
2f6f0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
2f700 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c 20  st->C_SignFinal 
2f710 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a 09  = C_SignFinal;..
2f720 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f730 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
2f740 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72   = C_SignRecover
2f750 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2f760 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
2f770 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f  ver = C_SignReco
2f780 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
2f790 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e 69  ist->C_VerifyIni
2f7a0 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69 74  t = C_VerifyInit
2f7b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f7c0 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f 56  ->C_Verify = C_V
2f7d0 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69 6f  erify;..pFunctio
2f7e0 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 55  nList->C_VerifyU
2f7f0 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66 79  pdate = C_Verify
2f800 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2f810 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
2f820 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66 79  Final = C_Verify
2f830 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
2f840 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52  nList->C_VerifyR
2f850 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 56  ecoverInit = C_V
2f860 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74  erifyRecoverInit
2f870 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f880 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  ->C_VerifyRecove
2f890 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  r = C_VerifyReco
2f8a0 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ver;..pFunctionL
2f8b0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e 63  ist->C_DigestEnc
2f8c0 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 44  ryptUpdate = C_D
2f8d0 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
2f8e0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
2f8f0 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69 67  st->C_DecryptDig
2f900 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 65  estUpdate = C_De
2f910 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
2f920 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2f930 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70 74  t->C_SignEncrypt
2f940 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 45  Update = C_SignE
2f950 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
2f960 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f970 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
2f980 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 56  ate = C_DecryptV
2f990 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46  erifyUpdate;..pF
2f9a0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2f9b0 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f 47  enerateKey = C_G
2f9c0 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46 75  enerateKey;..pFu
2f9d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2f9e0 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d 20  nerateKeyPair = 
2f9f0 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
2fa00 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r;..pFunctionLis
2fa10 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20 43  t->C_WrapKey = C
2fa20 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63  _WrapKey;..pFunc
2fa30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77 72  tionList->C_Unwr
2fa40 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61 70  apKey = C_Unwrap
2fa50 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
2fa60 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65 79  ist->C_DeriveKey
2fa70 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b 0a   = C_DeriveKey;.
2fa80 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2fa90 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20 43  C_SeedRandom = C
2faa0 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70 46  _SeedRandom;..pF
2fab0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2fac0 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d 20  enerateRandom = 
2fad0 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d  C_GenerateRandom
2fae0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2faf0 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  ->C_GetFunctionS
2fb00 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75 6e  tatus = C_GetFun
2fb10 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70 46  ctionStatus;..pF
2fb20 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
2fb30 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d 20  ancelFunction = 
2fb40 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e  C_CancelFunction
2fb50 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2fb60 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c  ->C_GetFunctionL
2fb70 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63 74  ist = C_GetFunct
2fb80 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46 75  ionList;...*ppFu
2fb90 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46 75  nctionList = pFu
2fba0 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43 41  nctionList;...CA
2fbb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2fbc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2fbd0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
2fbe0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
2fbf0 5f 4f 4b 29 3b 0a 7d 0a 0a                       _OK);.}..