Hex Artifact Content

Artifact cc302eaf9b169c048d9ed84ef1c6b5217b8ec238:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23  ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74    include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a  define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e  #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72  E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65  urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f  fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69  nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55  ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72  NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e   returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f  ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f  CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28  me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20  * name).#ifndef 
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69  NULL_PTR.#  defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65  ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75  pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23  de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20   "md5.h"../*. * 
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f  Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68  urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75  is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75  an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20  nctions and not 
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62  include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61  . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63  sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69  lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a  nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20   0x58../*** PIV 
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69  Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49   0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37  TR_GENAUTH  0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e  xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20  _PIV_AID        
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78  , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20  00, 0x00, 0x10, 
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30  0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a  ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69  /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31  -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23  PIVAUTH   0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54  _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65  URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  KEY_KEYMGT    0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41  P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a  RDAUTH  0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e  * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50  tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65   800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78  ALGO_RSA1024  0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a  SA2048  0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66  * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54  0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66  able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20  _3_OID_PIVAUTH  
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43  NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20  1, 0x0A.#define 
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35  ID_KEYMGT    0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64  F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54  73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  H  0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x01../* Maximum 
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a           250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69   ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64   MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49  efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a  ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e  E_TIME_H.#    in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63  tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  time = 0;.static
1760: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43   unsigned long C
1770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
1780: 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09 69 66 20  IME(void) {..if 
1790: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74  (cackey_debug_st
17a0: 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29 20 7b  art_time == 0) {
17b0: 0a 09 09 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  ...cackey_debug_
17c0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17d0: 65 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  e(NULL);..}...re
17e0: 74 75 72 6e 28 74 69 6d 65 28 4e 55 4c 4c 29 20  turn(time(NULL) 
17f0: 2d 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73  - cackey_debug_s
1800: 74 61 72 74 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20  tart_time);.}.# 
1810: 20 65 6c 73 65 0a 73 74 61 74 69 63 20 75 6e 73   else.static uns
1820: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1830: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1840: 76 6f 69 64 29 20 7b 0a 09 72 65 74 75 72 6e 28  void) {..return(
1850: 30 29 3b 0a 7d 0a 23 20 20 65 6e 64 69 66 0a 0a  0);.}.#  endif..
1860: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1870: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
1880: 2e 2e 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 20  ..) { \..static 
1890: 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34 30  char buf_user[40
18a0: 39 36 5d 20 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e  96] = {0}; \..sn
18b0: 70 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 2c  printf(buf_user,
18c0: 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72   sizeof(buf_user
18d0: 29 2c 20 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73  ), x); \..buf_us
18e0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
18f0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1900: 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b   \..fprintf(cack
1910: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1920: 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20  [%lu]: %s():%i: 
1930: 25 73 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  %s\n", CACKEY_DE
1940: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1950: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1960: 5f 2c 20 62 75 66 5f 75 73 65 72 29 3b 20 5c 0a  _, buf_user); \.
1970: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
1980: 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a  ebug_fd()); \.}.
1990: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
19a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
19b0: 66 2c 20 78 2c 20 79 29 20 7b 20 5c 0a 09 73 74  f, x, y) { \..st
19c0: 61 74 69 63 20 63 68 61 72 20 62 75 66 5f 75 73  atic char buf_us
19d0: 65 72 5b 34 30 39 36 5d 20 3d 20 7b 30 7d 2c 20  er[4096] = {0}, 
19e0: 2a 62 75 66 5f 75 73 65 72 5f 70 3b 20 5c 0a 09  *buf_user_p; \..
19f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75  unsigned long bu
1a00: 66 5f 75 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09  f_user_size; \..
1a10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1a20: 4d 50 42 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e  MPBUF; \..unsign
1a30: 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09  ed long idx; \..
1a40: 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f 72 65 74  int snprintf_ret
1a50: 3b 20 5c 0a 09 54 4d 50 42 55 46 20 3d 20 28 75  ; \..TMPBUF = (u
1a60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1a70: 28 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  (x); \..buf_user
1a80: 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20 5c  _p = buf_user; \
1a90: 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1aa0: 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  = sizeof(buf_use
1ab0: 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78 20  r); \..for (idx 
1ac0: 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20  = 1; idx < (y); 
1ad0: 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20  idx++) { \...if 
1ae0: 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c  (buf_user_size <
1af0: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1b00: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e  k; \...}; \...sn
1b10: 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70  printf_ret = snp
1b20: 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70  rintf(buf_user_p
1b30: 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c  , buf_user_size,
1b40: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1b50: 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20  F[idx]); \...if 
1b60: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d  (snprintf_ret <=
1b70: 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b   0) { \....break
1b80: 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66  ; \...}; \...buf
1b90: 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69  _user_p += snpri
1ba0: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66  ntf_ret; \...buf
1bb0: 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e  _user_size -= sn
1bc0: 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d  printf_ret; \..}
1bd0: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1be0: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1bf0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
1c00: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1c10: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1c20: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28  : %s():%i: %s  (
1c30: 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78 25 73  %s/%lu = {%02x%s
1c40: 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  })\n", CACKEY_DE
1c50: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1c60: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1c70: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1c80: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1c90: 4d 50 42 55 46 5b 30 5d 2c 20 62 75 66 5f 75 73  MPBUF[0], buf_us
1ca0: 65 72 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63  er); \..fflush(c
1cb0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1cc0: 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65  ); \.}.#  define
1cd0: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1ce0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cf0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
1d00: 28 76 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b  (void *) x, #x);
1d10: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1d20: 74 69 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79  tic FILE *cackey
1d30: 5f 64 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20  _debug_fd(void) 
1d40: 7b 0a 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a  {..static FILE *
1d50: 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  fd = NULL;..char
1d60: 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20   *logfile;...if 
1d70: 28 66 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fd != NULL) {..
1d80: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a  .return(fd);..}.
1d90: 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20  ../*.. * Log to 
1da0: 73 74 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79  stderr initially
1db0: 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64   so we can use d
1dc0: 65 62 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a  ebugging within.
1dd0: 09 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  . * this functio
1de0: 6e 20 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e  n without gettin
1df0: 67 20 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69  g into an infini
1e00: 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64  te loop.. */..fd
1e10: 20 3d 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67   = stderr;...log
1e20: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1e30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1e40: 49 4c 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66  ILE");..if (logf
1e50: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
1e60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e70: 49 4e 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69  INTF("Found envi
1e80: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e90: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
1ea0: 0a 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74  ....logfile = st
1eb0: 72 63 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d  rchr(logfile, '=
1ec0: 27 29 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c  ');...if (logfil
1ed0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1ee0: 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  logfile = getenv
1ef0: 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  ("CACKEY_DEBUG_L
1f00: 4f 47 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c  OGFILE");...} el
1f10: 73 65 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b  se {....logfile+
1f20: 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  +;...}..}...if (
1f30: 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  logfile != NULL)
1f40: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f50: 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
1f60: 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c  log file: %s", l
1f70: 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d  ogfile);....fd =
1f80: 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20   fopen(logfile, 
1f90: 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  "a");..}...if (f
1fa0: 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  d == NULL) {...f
1fb0: 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a  d = stderr;..}..
1fc0: 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72  .if (fd == stder
1fd0: 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  r) {...CACKEY_DE
1fe0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1ff0: 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a  rning stderr");.
2000: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
2010: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2020: 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20  "Returning %p", 
2030: 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d  (void *) fd);..}
2040: 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d  ...return(fd);.}
2050: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43  ..static void *C
2060: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
2070: 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73  _MALLOC(size_t s
2080: 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ize, const char 
2090: 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29  *func, int line)
20a0: 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c   {..void *retval
20b0: 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c  ;...retval = mal
20c0: 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72  loc(size);...fpr
20d0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
20e0: 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20  g_fd(), "[%lu]: 
20f0: 25 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28  %s():%i: MALLOC(
2100: 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45  ) = %p\n", CACKE
2110: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
2120: 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72  ), func, line, r
2130: 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28  etval);..fflush(
2140: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2150: 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ));...return(ret
2160: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
2170: 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42  void *CACKEY_DEB
2180: 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28  UG_FUNC_REALLOC(
2190: 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f  void *ptr, size_
21a0: 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68  t size, const ch
21b0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69  ar *func, int li
21c0: 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74  ne) {..void *ret
21d0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
21e0: 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a  realloc(ptr, siz
21f0: 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  e);...if (retval
2200: 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72   != ptr) {...fpr
2210: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
2220: 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20  g_fd(), "[%lu]: 
2230: 25 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43  %s():%i: REALLOC
2240: 28 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41  (%p) = %p\n", CA
2250: 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49  CKEY_DEBUG_GETTI
2260: 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65  ME(), func, line
2270: 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a  , ptr, retval);.
2280: 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
2290: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a  debug_fd());..}.
22a0: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  ..if (retval == 
22b0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
22c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
22d0: 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65  *** ERROR *** re
22e0: 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e  alloc returned N
22f0: 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29  ULL (size = %lu)
2300: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2310: 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72  g) size);..}...r
2320: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
2330: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 43  ..static char *C
2340: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
2350: 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68  _STRDUP(const ch
2360: 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63  ar *ptr, const c
2370: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
2380: 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65  ine) {..char *re
2390: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
23a0: 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09   strdup(ptr);...
23b0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
23c0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
23d0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44  ]: %s():%i: STRD
23e0: 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  UP_MALLOC() = %p
23f0: 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  \n", CACKEY_DEBU
2400: 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e  G_GETTIME(), fun
2410: 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29  c, line, retval)
2420: 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ;..fflush(cackey
2430: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09  _debug_fd());...
2440: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2450: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
2460: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
2470: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
2480: 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  TR(unsigned char
2490: 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20   tag) {..switch 
24a0: 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47  (tag) {...case G
24b0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a  SCIS_TAG_CARDID:
24c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
24d0: 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a  S_TAG_CARDID");.
24e0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
24f0: 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74  _CCC_VER:....ret
2500: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2510: 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65  CC_VER");...case
2520: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
2530: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2540: 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52  SCIS_TAG_CCG_VER
2550: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2560: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
2570: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2580: 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09  AG_CARDURL");...
2590: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50  case GSCIS_TAG_P
25a0: 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e  KCS15:....return
25b0: 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  ("GSCIS_TAG_PKCS
25c0: 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  15");...case GSC
25d0: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
25e0: 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e  MODEL:....return
25f0: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  ("GSCIS_TAG_REG_
2600: 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09  DATA_MODEL");...
2610: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
2620: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74  CR_TABLE:....ret
2630: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41  urn("GSCIS_TAG_A
2640: 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  CR_TABLE");...ca
2650: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
2660: 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72  D_APDU:....retur
2670: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52  n("GSCIS_TAG_CAR
2680: 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65  D_APDU");...case
2690: 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52   GSCIS_TAG_REDIR
26a0: 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  ECTION:....retur
26b0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44  n("GSCIS_TAG_RED
26c0: 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61  IRECTION");...ca
26d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a  se GSCIS_TAG_CT:
26e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
26f0: 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61  S_TAG_CT");...ca
2700: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a  se GSCIS_TAG_ST:
2710: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2720: 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61  S_TAG_ST");...ca
2730: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58  se GSCIS_TAG_NEX
2740: 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28  TCCC:....return(
2750: 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43  "GSCIS_TAG_NEXTC
2760: 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CC");...case GSC
2770: 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09  IS_TAG_FNAME:...
2780: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2790: 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61  AG_FNAME");...ca
27a0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  se GSCIS_TAG_MNA
27b0: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ME:....return("G
27c0: 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29  SCIS_TAG_MNAME")
27d0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
27e0: 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74  AG_LNAME:....ret
27f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c  urn("GSCIS_TAG_L
2800: 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47  NAME");...case G
2810: 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a  SCIS_TAG_SUFFIX:
2820: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2830: 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a  S_TAG_SUFFIX");.
2840: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2850: 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09  _GOVT_AGENCY:...
2860: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2870: 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29  AG_GOVT_AGENCY")
2880: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2890: 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65  AG_BUREAU:....re
28a0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
28b0: 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65  BUREAU");...case
28c0: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
28d0: 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  U_CODE:....retur
28e0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52  n("GSCIS_TAG_BUR
28f0: 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61  EAU_CODE");...ca
2900: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50  se GSCIS_TAG_DEP
2910: 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  T_CODE:....retur
2920: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50  n("GSCIS_TAG_DEP
2930: 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65  T_CODE");...case
2940: 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45   GSCIS_TAG_TITLE
2950: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2960: 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a  IS_TAG_TITLE");.
2970: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2980: 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65  _BUILDING:....re
2990: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
29a0: 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61  BUILDING");...ca
29b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
29c0: 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65  ICE_ADDR1:....re
29d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
29e0: 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a  OFFICE_ADDR1");.
29f0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2a00: 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09  _OFFICE_ADDR2:..
2a10: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2a20: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
2a30: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2a40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59  _TAG_OFFICE_CITY
2a50: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2a60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49  IS_TAG_OFFICE_CI
2a70: 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TY");...case GSC
2a80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54  IS_TAG_OFFICE_ST
2a90: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2aa0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2ab0: 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65  _STATE");...case
2ac0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2ad0: 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e  E_ZIP:....return
2ae0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2af0: 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65  CE_ZIP");...case
2b00: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2b10: 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65  E_COUNTRY:....re
2b20: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2b30: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29  OFFICE_COUNTRY")
2b40: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2b50: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a  AG_OFFICE_PHONE:
2b60: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2b70: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2b80: 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  NE");...case GSC
2b90: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2ba0: 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75  ONE_EXT:....retu
2bb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2bc0: 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29  FICE_PHONE_EXT")
2bd0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2be0: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09  AG_OFFICE_FAX:..
2bf0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2c00: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29  TAG_OFFICE_FAX")
2c10: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2c20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a  AG_OFFICE_EMAIL:
2c30: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2c40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41  S_TAG_OFFICE_EMA
2c50: 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  IL");...case GSC
2c60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
2c70: 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  OM:....return("G
2c80: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2c90: 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47  ROOM");...case G
2ca0: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
2cb0: 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72  AGENCY:....retur
2cc0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  n("GSCIS_TAG_NON
2cd0: 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09  GOV_AGENCY");...
2ce0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2cf0: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09  SN_DESIGNATOR:..
2d00: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2d10: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
2d20: 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  OR");...case GSC
2d30: 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72  IS_TAG_SSN:....r
2d40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2d50: 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47  _SSN");...case G
2d60: 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09  SCIS_TAG_DOB:...
2d70: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2d80: 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65  AG_DOB");...case
2d90: 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45   GSCIS_TAG_GENDE
2da0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
2db0: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29  CIS_TAG_GENDER")
2dc0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2dd0: 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65  AG_USERID:....re
2de0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2df0: 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65  USERID");...case
2e00: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
2e10: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
2e20: 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29  CIS_TAG_DOMAIN")
2e30: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2e40: 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09  AG_PASSWORD:....
2e50: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2e60: 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09  G_PASSWORD");...
2e70: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49  case GSCIS_TAG_I
2e80: 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75  SSUERID:....retu
2e90: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53  rn("GSCIS_TAG_IS
2ea0: 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65  SUERID");...case
2eb0: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
2ec0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2ed0: 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a  IS_TAG_SERNO");.
2ee0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2ef0: 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09  _ISSUE_DATE:....
2f00: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f10: 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a  G_ISSUE_DATE");.
2f20: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2f30: 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09  _EXPIRE_DATE:...
2f40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f50: 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29  AG_EXPIRE_DATE")
2f60: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2f70: 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09  AG_CARD_TYPE:...
2f80: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f90: 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a  AG_CARD_TYPE");.
2fa0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2fb0: 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a  _SECURITY_CODE:.
2fc0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2fd0: 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f  _TAG_SECURITY_CO
2fe0: 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  DE");...case GSC
2ff0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49  IS_TAG_CARDID_AI
3000: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
3010: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
3020: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ID");...case GSC
3030: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
3040: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
3050: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
3060: 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  CATE");...case G
3070: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53  SCIS_TAG_CERT_IS
3080: 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  SUE_DATE:....ret
3090: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
30a0: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29  ERT_ISSUE_DATE")
30b0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
30c0: 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44  AG_CERT_EXPIRE_D
30d0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
30e0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
30f0: 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d  XPIRE_DATE");..}
3100: 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f  ...return("UNKNO
3110: 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  WN");.}..static 
3120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
3130: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
3140: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f  ARDERR_TO_STR(LO
3150: 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73  NG retcode) {..s
3160: 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20  witch (retcode) 
3170: 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53  {...case SCARD_S
3180: 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74  _SUCCESS:....ret
3190: 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43  urn("SCARD_S_SUC
31a0: 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53  CESS");...case S
31b0: 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44  CARD_E_CANCELLED
31c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
31d0: 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29  RD_E_CANCELLED")
31e0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
31f0: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09  _CANT_DISPOSE:..
3200: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3210: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29  E_CANT_DISPOSE")
3220: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3230: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55  _INSUFFICIENT_BU
3240: 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  FFER:....return(
3250: 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49  "SCARD_E_INSUFFI
3260: 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a  CIENT_BUFFER");.
3270: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
3280: 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72  NVALID_ATR:....r
3290: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
32a0: 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09  NVALID_ATR");...
32b0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56  case SCARD_E_INV
32c0: 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09  ALID_HANDLE:....
32d0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
32e0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29  INVALID_HANDLE")
32f0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3300: 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54  _INVALID_PARAMET
3310: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
3320: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50  CARD_E_INVALID_P
3330: 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61  ARAMETER");...ca
3340: 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  se SCARD_E_INVAL
3350: 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65  ID_TARGET:....re
3360: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3370: 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a  VALID_TARGET");.
3380: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
3390: 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09  NVALID_VALUE:...
33a0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
33b0: 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29  _INVALID_VALUE")
33c0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
33d0: 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72  _NO_MEMORY:....r
33e0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
33f0: 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61  O_MEMORY");...ca
3400: 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  se SCARD_E_UNKNO
3410: 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65  WN_READER:....re
3420: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e  turn("SCARD_E_UN
3430: 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a  KNOWN_READER");.
3440: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54  ..case SCARD_E_T
3450: 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72  IMEOUT:....retur
3460: 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f  n("SCARD_E_TIMEO
3470: 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  UT");...case SCA
3480: 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RD_E_SHARING_VIO
3490: 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  LATION:....retur
34a0: 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49  n("SCARD_E_SHARI
34b0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a  NG_VIOLATION");.
34c0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
34d0: 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09  O_SMARTCARD:....
34e0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
34f0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a  NO_SMARTCARD");.
3500: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55  ..case SCARD_E_U
3510: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09  NKNOWN_CARD:....
3520: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3530: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a  UNKNOWN_CARD");.
3540: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50  ..case SCARD_E_P
3550: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09  ROTO_MISMATCH:..
3560: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3570: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
3580: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3590: 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09  _E_NOT_READY:...
35a0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
35b0: 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09  _NOT_READY");...
35c0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53  case SCARD_E_SYS
35d0: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09  TEM_CANCELLED:..
35e0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
35f0: 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c  E_SYSTEM_CANCELL
3600: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3610: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
3620: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
3630: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e  SCARD_E_NOT_TRAN
3640: 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65  SACTED");...case
3650: 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f   SCARD_E_READER_
3660: 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09  UNAVAILABLE:....
3670: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3680: 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42  READER_UNAVAILAB
3690: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  LE");...case SCA
36a0: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
36b0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
36c0: 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50  ("SCARD_W_UNSUPP
36d0: 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09  ORTED_CARD");...
36e0: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52  case SCARD_W_UNR
36f0: 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a  ESPONSIVE_CARD:.
3700: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3710: 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f  _W_UNRESPONSIVE_
3720: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
3730: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
3740: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3750: 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45  ("SCARD_W_UNPOWE
3760: 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  RED_CARD");...ca
3770: 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54  se SCARD_W_RESET
3780: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3790: 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  ("SCARD_W_RESET_
37a0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
37b0: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43  CARD_W_REMOVED_C
37c0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
37d0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
37e0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
37f0: 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53  CARD_E_PCI_TOO_S
3800: 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  MALL:....return(
3810: 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f  "SCARD_E_PCI_TOO
3820: 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65  _SMALL");...case
3830: 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f   SCARD_E_READER_
3840: 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09  UNSUPPORTED:....
3850: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3860: 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54  READER_UNSUPPORT
3870: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3880: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
3890: 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  EADER:....return
38a0: 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43  ("SCARD_E_DUPLIC
38b0: 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09  ATE_READER");...
38c0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52  case SCARD_E_CAR
38d0: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09  D_UNSUPPORTED:..
38e0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38f0: 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54  E_CARD_UNSUPPORT
3900: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3910: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a  RD_E_NO_SERVICE:
3920: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3930: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29  D_E_NO_SERVICE")
3940: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3950: 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44  _SERVICE_STOPPED
3960: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3970: 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f  RD_E_SERVICE_STO
3980: 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  PPED");...case S
3990: 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54  CARD_E_UNSUPPORT
39a0: 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72  ED_FEATURE:....r
39b0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
39c0: 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55  NSUPPORTED_FEATU
39d0: 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41  RE");.#ifdef SCA
39e0: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
39f0: 52 44 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  RD...case SCARD_
3a00: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a  W_INSERTED_CARD:
3a10: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3a20: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
3a30: 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  D");.#endif.#ifd
3a40: 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45  ef SCARD_E_NO_RE
3a50: 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a  ADERS_AVAILABLE.
3a60: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
3a70: 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41  O_READERS_AVAILA
3a80: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
3a90: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45  SCARD_E_NO_READE
3aa0: 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a  RS_AVAILABLE");.
3ab0: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75  #endif..}...retu
3ac0: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
3ad0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
3ae0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
3af0: 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
3b00: 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a  STR(uint16_t obj
3b10: 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f  id) {..switch (o
3b20: 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30  bjid) {...case 0
3b30: 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x2000:....return
3b40: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3b50: 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29  ID_GENERALINFO")
3b60: 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 30 3a  ;...case 0x2100:
3b70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3b80: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f  EY_TLV_OBJID_PRO
3b90: 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a  PERSONALINFO");.
3ba0: 09 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09  ..case 0x3000:..
3bb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3bc0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53  _TLV_OBJID_ACCES
3bd0: 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61  SCONTROL");...ca
3be0: 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65  se 0x4000:....re
3bf0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3c00: 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a  _OBJID_LOGIN");.
3c10: 09 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09  ..case 0x5000:..
3c20: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3c30: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49  _TLV_OBJID_CARDI
3c40: 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78  NFO");...case 0x
3c50: 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  6000:....return(
3c60: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3c70: 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a  D_BIOMETRICS");.
3c80: 09 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09  ..case 0x7000:..
3c90: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3ca0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54  _TLV_OBJID_DIGIT
3cb0: 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63  ALSIGCERT");...c
3cc0: 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72  ase 0x0200:....r
3cd0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3ce0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
3cf0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  ON");...case 0x0
3d00: 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  202:....return("
3d10: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3d20: 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b  _CAC_BENEFITS");
3d30: 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a  ...case 0x0203:.
3d40: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d50: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3d60: 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b  OTHERBENEFITS");
3d70: 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a  ...case 0x0201:.
3d80: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d90: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3da0: 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63  PERSONNEL");...c
3db0: 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72  ase 0x02FE:....r
3dc0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3dd0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43  V_OBJID_CAC_PKIC
3de0: 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74  ERT");..}....ret
3df0: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3e00: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3e10: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3e20: 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
3e30: 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61  TO_STR(uint8_t a
3e40: 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63  pptype) {..switc
3e50: 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09  h (apptype) {...
3e60: 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65  case 0x00:....re
3e70: 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09  turn("NONE");...
3e80: 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65  case 0x01:....re
3e90: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3ea0: 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a  _APP_GENERIC");.
3eb0: 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09  ..case 0x02:....
3ec0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3ed0: 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09  LV_APP_SKI");...
3ee0: 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65  case 0x03:....re
3ef0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3f00: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
3f10: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
3f20: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34  I");...case 0x04
3f30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3f40: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
3f50: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a  );...case 0x05:.
3f60: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3f70: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
3f80: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  C | CACKEY_TLV_A
3f90: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_PKI");...case
3fa0: 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e   0x06:....return
3fb0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3fc0: 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c  _SKI | CACKEY_TL
3fd0: 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63  V_APP_PKI");...c
3fe0: 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74  ase 0x07:....ret
3ff0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
4000: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41  APP_GENERIC | CA
4010: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
4020: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
4030: 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65  P_PKI");..}...re
4040: 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b  turn("INVALID");
4050: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
4060: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
4070: 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
4080: 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54  TE_TO_STR(CK_ATT
4090: 52 49 42 55 54 45 5f 54 59 50 45 20 61 74 74 72  RIBUTE_TYPE attr
40a0: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74  ) {..switch (att
40b0: 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f  r) {...case CKA_
40c0: 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e  CLASS:....return
40d0: 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09  ("CKA_CLASS");..
40e0: 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a  .case CKA_TOKEN:
40f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4100: 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20  TOKEN");...case 
4110: 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09  CKA_PRIVATE:....
4120: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56  return("CKA_PRIV
4130: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ATE");...case CK
4140: 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75  A_LABEL:....retu
4150: 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b  rn("CKA_LABEL");
4160: 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c  ...case CKA_APPL
4170: 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  ICATION:....retu
4180: 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54  rn("CKA_APPLICAT
4190: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ION");...case CK
41a0: 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  A_VALUE:....retu
41b0: 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b  rn("CKA_VALUE");
41c0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45  ...case CKA_OBJE
41d0: 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e  CT_ID:....return
41e0: 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22  ("CKA_OBJECT_ID"
41f0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45  );...case CKA_CE
4200: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a  RTIFICATE_TYPE:.
4210: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43  ...return("CKA_C
4220: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 22  ERTIFICATE_TYPE"
4230: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53  );...case CKA_IS
4240: 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  SUER:....return(
4250: 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09  "CKA_ISSUER");..
4260: 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c  .case CKA_SERIAL
4270: 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75  _NUMBER:....retu
4280: 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e  rn("CKA_SERIAL_N
4290: 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20  UMBER");...case 
42a0: 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09  CKA_AC_ISSUER:..
42b0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43  ..return("CKA_AC
42c0: 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73  _ISSUER");...cas
42d0: 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09  e CKA_OWNER:....
42e0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45  return("CKA_OWNE
42f0: 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  R");...case CKA_
4300: 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72  ATTR_TYPES:....r
4310: 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f  eturn("CKA_ATTR_
4320: 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20  TYPES");...case 
4330: 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09  CKA_TRUSTED:....
4340: 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53  return("CKA_TRUS
4350: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  TED");...case CK
4360: 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72  A_KEY_TYPE:....r
4370: 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54  eturn("CKA_KEY_T
4380: 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPE");...case CK
4390: 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65  A_SUBJECT:....re
43a0: 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43  turn("CKA_SUBJEC
43b0: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  T");...case CKA_
43c0: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ID:....return("C
43d0: 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20  KA_ID");...case 
43e0: 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09  CKA_SENSITIVE:..
43f0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45  ..return("CKA_SE
4400: 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73  NSITIVE");...cas
4410: 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09  e CKA_ENCRYPT:..
4420: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e  ..return("CKA_EN
4430: 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20  CRYPT");...case 
4440: 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09  CKA_DECRYPT:....
4450: 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52  return("CKA_DECR
4460: 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPT");...case CK
4470: 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72  A_WRAP:....retur
4480: 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09  n("CKA_WRAP");..
4490: 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50  .case CKA_UNWRAP
44a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
44b0: 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73  _UNWRAP");...cas
44c0: 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72  e CKA_SIGN:....r
44d0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22  eturn("CKA_SIGN"
44e0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49  );...case CKA_SI
44f0: 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72  GN_RECOVER:....r
4500: 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f  eturn("CKA_SIGN_
4510: 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73  RECOVER");...cas
4520: 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09  e CKA_VERIFY:...
4530: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52  .return("CKA_VER
4540: 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  IFY");...case CK
4550: 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52  A_VERIFY_RECOVER
4560: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4570: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22  _VERIFY_RECOVER"
4580: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45  );...case CKA_DE
4590: 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  RIVE:....return(
45a0: 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09  "CKA_DERIVE");..
45b0: 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f  .case CKA_START_
45c0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
45d0: 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22  "CKA_START_DATE"
45e0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e  );...case CKA_EN
45f0: 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  D_DATE:....retur
4600: 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22  n("CKA_END_DATE"
4610: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  );...case CKA_MO
4620: 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e  DULUS:....return
4630: 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b  ("CKA_MODULUS");
4640: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
4650: 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  LUS_BITS:....ret
4660: 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53  urn("CKA_MODULUS
4670: 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  _BITS");...case 
4680: 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
4690: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
46a0: 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
46b0: 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ENT");...case CK
46c0: 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45  A_PRIVATE_EXPONE
46d0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
46e0: 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e  KA_PRIVATE_EXPON
46f0: 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ENT");...case CK
4700: 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65  A_PRIME_1:....re
4710: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
4720: 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  1");...case CKA_
4730: 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75  PRIME_2:....retu
4740: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22  rn("CKA_PRIME_2"
4750: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58  );...case CKA_EX
4760: 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74  PONENT_1:....ret
4770: 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e  urn("CKA_EXPONEN
4780: 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  T_1");...case CK
4790: 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09  A_EXPONENT_2:...
47a0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50  .return("CKA_EXP
47b0: 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73  ONENT_2");...cas
47c0: 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e  e CKA_COEFFICIEN
47d0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
47e0: 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b  A_COEFFICIENT");
47f0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d  ...case CKA_PRIM
4800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4810: 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73  A_PRIME");...cas
4820: 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a  e CKA_SUBPRIME:.
4830: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4840: 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73  UBPRIME");...cas
4850: 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72  e CKA_BASE:....r
4860: 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22  eturn("CKA_BASE"
4870: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52  );...case CKA_PR
4880: 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  IME_BITS:....ret
4890: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42  urn("CKA_PRIME_B
48a0: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ITS");...case CK
48b0: 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53  A_SUB_PRIME_BITS
48c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
48d0: 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22  _SUB_PRIME_BITS"
48e0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41  );...case CKA_VA
48f0: 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  LUE_BITS:....ret
4900: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42  urn("CKA_VALUE_B
4910: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ITS");...case CK
4920: 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09  A_VALUE_LEN:....
4930: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55  return("CKA_VALU
4940: 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20  E_LEN");...case 
4950: 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a  CKA_EXTRACTABLE:
4960: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4970: 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09  EXTRACTABLE");..
4980: 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a  .case CKA_LOCAL:
4990: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
49a0: 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20  LOCAL");...case 
49b0: 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43  CKA_NEVER_EXTRAC
49c0: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
49d0: 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52  ("CKA_NEVER_EXTR
49e0: 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  ACTABLE");...cas
49f0: 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e  e CKA_ALWAYS_SEN
4a00: 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72  SITIVE:....retur
4a10: 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45  n("CKA_ALWAYS_SE
4a20: 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73  NSITIVE");...cas
4a30: 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45  e CKA_KEY_GEN_ME
4a40: 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75  CHANISM:....retu
4a50: 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f  rn("CKA_KEY_GEN_
4a60: 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63  MECHANISM");...c
4a70: 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42  ase CKA_MODIFIAB
4a80: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  LE:....return("C
4a90: 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b  KA_MODIFIABLE");
4aa0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53  ...case CKA_ECDS
4ab0: 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74  A_PARAMS:....ret
4ac0: 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50  urn("CKA_ECDSA_P
4ad0: 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20  ARAMS");...case 
4ae0: 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09  CKA_EC_POINT:...
4af0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f  .return("CKA_EC_
4b00: 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20  POINT");...case 
4b10: 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55  CKA_SECONDARY_AU
4b20: 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  TH:....return("C
4b30: 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54  KA_SECONDARY_AUT
4b40: 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  H");...case CKA_
4b50: 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a  AUTH_PIN_FLAGS:.
4b60: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
4b70: 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b  UTH_PIN_FLAGS");
4b80: 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46  ...case CKA_HW_F
4b90: 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09  EATURE_TYPE:....
4ba0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46  return("CKA_HW_F
4bb0: 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09  EATURE_TYPE");..
4bc0: 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f  .case CKA_RESET_
4bd0: 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75  ON_INIT:....retu
4be0: 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e  rn("CKA_RESET_ON
4bf0: 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20  _INIT");...case 
4c00: 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09  CKA_HAS_RESET:..
4c10: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41  ..return("CKA_HA
4c20: 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73  S_RESET");...cas
4c30: 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46  e CKA_VENDOR_DEF
4c40: 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  INED:....return(
4c50: 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49  "CKA_VENDOR_DEFI
4c60: 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  NED");..}...retu
4c70: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
4c80: 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c  ..#  define mall
4c90: 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42  oc(x) CACKEY_DEB
4ca0: 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78  UG_FUNC_MALLOC(x
4cb0: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
4cc0: 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20  NE__).#  define 
4cd0: 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41  realloc(x, y) CA
4ce0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4cf0: 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f  REALLOC(x, y, __
4d00: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
4d10: 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75  ).#  ifdef strdu
4d20: 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72  p.#    undef str
4d30: 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20  dup.#  endif.#  
4d40: 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29  define strdup(x)
4d50: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4d60: 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66  NC_STRDUP(x, __f
4d70: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4d80: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
4d90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
4da0: 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a  INTF(x...) /**/.
4db0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4dc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
4dd0: 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20  f, x, y) /**/.# 
4de0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
4df0: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
4e00: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e10: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e20: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e30: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
4e40: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e50: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e60: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e70: 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54  FUNC_OBJID_TO_ST
4e80: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4e90: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
4ea0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4eb0: 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
4ec0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4ed0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43  LED".#  define C
4ee0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4ef0: 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
4f00: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4f10: 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 74 79  BLED".#endif..ty
4f20: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
4f30: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
4f40: 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  ,..CACKEY_ID_TYP
4f50: 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f 49  E_PIV,..CACKEY_I
4f60: 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
4f70: 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  .} cackey_pcsc_i
4f80: 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75 63 74 20  d_type;..struct 
4f90: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
4fa0: 74 69 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f 70  tity {..cackey_p
4fb0: 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74  csc_id_type id_t
4fc0: 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65  ype;...size_t ce
4fd0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
4fe0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
4ff0: 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73  ertificate;...ss
5000: 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 0a  ize_t keysize;..
5010: 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75 63  .union {...struc
5020: 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64 20  t {....unsigned 
5030: 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a  char applet[7];.
5040: 09 09 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65  ...uint16_t file
5050: 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73 74  ;...} cac;....st
5060: 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e  ruct {....unsign
5070: 65 64 20 63 68 61 72 20 6b 65 79 5f 69 64 3b 0a  ed char key_id;.
5080: 09 09 7d 20 70 69 76 3b 0a 09 7d 20 63 61 72 64  ..} piv;..} card
5090: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
50a0: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  key_identity {..
50b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
50c0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
50d0: 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b  c_identity;...CK
50e0: 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72  _ATTRIBUTE *attr
50f0: 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e  ibutes;..CK_ULON
5100: 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  G attributes_cou
5110: 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  nt;.};..struct c
5120: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a  ackey_session {.
5130: 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43  .int active;...C
5140: 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
5150: 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61  ;...CK_STATE sta
5160: 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c  te;..CK_FLAGS fl
5170: 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  ags;..CK_ULONG u
5180: 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43  lDeviceError;..C
5190: 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
51a0: 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54  ication;..CK_NOT
51b0: 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74  IFY Notify;...st
51c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
51d0: 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
51e0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
51f0: 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
5200: 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f  t;...int search_
5210: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52  active;..CK_ATTR
5220: 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68  IBUTE_PTR search
5230: 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e  _query;..CK_ULON
5240: 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  G search_query_c
5250: 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ount;..unsigned 
5260: 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72  long search_curr
5270: 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f  _id;...int sign_
5280: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
5290: 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f  ANISM_TYPE sign_
52a0: 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42  mechanism;..CK_B
52b0: 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66  YTE_PTR sign_buf
52c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
52d0: 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75   sign_buflen;..u
52e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67  nsigned long sig
52f0: 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75  n_bufused;..stru
5300: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
5310: 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74  ty *sign_identit
5320: 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74  y;...int decrypt
5330: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
5340: 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72  HANISM_TYPE decr
5350: 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ypt_mechanism;..
5360: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72  CK_VOID_PTR decr
5370: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09  ypt_mech_parm;..
5380: 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74  CK_ULONG decrypt
5390: 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09  _mech_parmlen;..
53a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
53b0: 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f  entity *decrypt_
53c0: 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74  identity;.};..st
53d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
53e0: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
53f0: 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a 0a  .int internal;..
5400: 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64  .char *pcsc_read
5410: 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63  er;...int pcsc_c
5420: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09  ard_connected;..
5430: 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63  SCARDHANDLE pcsc
5440: 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61  _card;...int tra
5450: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a  nsaction_depth;.
5460: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  .int transaction
5470: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a  _need_hw_lock;..
5480: 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b  .int slot_reset;
5490: 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65  ...CK_FLAGS toke
54a0: 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67  n_flags;...unsig
54b0: 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b  ned char *label;
54c0: 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ...DWORD protoco
54d0: 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  l;...unsigned in
54e0: 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  t cached_certs_c
54f0: 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63 61  ount;..struct ca
5500: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
5510: 74 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74 73  ty *cached_certs
5520: 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ;.};..typedef en
5530: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
5540: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30  _APP_GENERIC = 0
5550: 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x01,..CACKEY_TLV
5560: 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30  _APP_SKI     = 0
5570: 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x02,..CACKEY_TLV
5580: 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30  _APP_PKI     = 0
5590: 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  x04.} cackey_tlv
55a0: 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64  _apptype;..typed
55b0: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45  ef enum {..CACKE
55c0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45  Y_TLV_OBJID_GENE
55d0: 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20  RALINFO       = 
55e0: 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x2000,..CACKEY_
55f0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
5600: 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78  SONALINFO   = 0x
5610: 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  2100,..CACKEY_TL
5620: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
5630: 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30  NTROL     = 0x30
5640: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5650: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20  OBJID_LOGIN     
5660: 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30          = 0x4000
5670: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5680: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20  JID_CARDINFO    
5690: 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a        = 0x5000,.
56a0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
56b0: 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20  D_BIOMETRICS    
56c0: 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43      = 0x6000,..C
56d0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
56e0: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20  DIGITALSIGCERT  
56f0: 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43    = 0x7000,..CAC
5700: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5710: 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20  C_PERSON        
5720: 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45  = 0x0200,..CACKE
5730: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
5740: 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20  BENEFITS      = 
5750: 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f  0x0202,..CACKEY_
5760: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54  TLV_OBJID_CAC_OT
5770: 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78  HERBENEFITS = 0x
5780: 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0203,..CACKEY_TL
5790: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
57a0: 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32  ONNEL     = 0x02
57b0: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
57c0: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52  OBJID_CAC_PKICER
57d0: 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45  T       = 0x02FE
57e0: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  .} cackey_tlv_ob
57f0: 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66  jectid;..typedef
5800: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
5810: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
5820: 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41 43  ENT    = 1,..CAC
5830: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
5840: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a             = 0,.
5850: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  .CACKEY_PCSC_E_G
5860: 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d  ENERIC         =
5870: 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -1,..CACKEY_PCS
5880: 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20  C_E_BADPIN      
5890: 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45      = -2,..CACKE
58a0: 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20  Y_PCSC_E_LOCKED 
58b0: 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 09           = -3,..
58c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
58d0: 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d 20  EDLOGIN       = 
58e0: 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -4,..CACKEY_PCSC
58f0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20  _E_TOKENABSENT  
5900: 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 59     = -6,..CACKEY
5910: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 20  _PCSC_E_RETRY   
5920: 20 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20 63          = -7.} c
5930: 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75  ackey_ret;..stru
5940: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61  ct cackey_tlv_ca
5950: 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65  rdurl {..unsigne
5960: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69  d char        ri
5970: 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  d[5];..cackey_tl
5980: 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74  v_apptype   appt
5990: 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  ype;..cackey_tlv
59a0: 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63  _objectid  objec
59b0: 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  tid;..cackey_tlv
59c0: 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64  _objectid  appid
59d0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
59e0: 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d          pinid;.}
59f0: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
5a00: 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72  _tlv_entity;.str
5a10: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
5a20: 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74  ntity {..uint8_t
5a30: 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65   tag;..size_t le
5a40: 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a  ngth;...union {.
5a50: 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09  ..void *value;..
5a60: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5a70: 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75  lv_cardurl *valu
5a80: 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e  e_cardurl;...uin
5a90: 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b  t8_t value_byte;
5aa0: 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61  ..};...struct ca
5ab0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
5ac0: 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43  *_next;.};../* C
5ad0: 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e  ACKEY Global Han
5ae0: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  dles */.static v
5af0: 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c  oid *cackey_bigl
5b00: 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  ock = NULL;.stat
5b10: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
5b20: 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f  _session cackey_
5b30: 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73  sessions[128];.s
5b40: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
5b50: 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f  key_slot cackey_
5b60: 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74  slots[128];.stat
5b70: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e  ic int cackey_in
5b80: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73  itialized = 0;.s
5b90: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
5ba0: 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20  _biglock_init = 
5bb0: 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  0;.CK_C_INITIALI
5bc0: 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61  ZE_ARGS cackey_a
5bd0: 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20  rgs;../** Extra 
5be0: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f 20  certificates to 
5bf0: 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e  include in token
5c00: 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 6b   **/.struct cack
5c10: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
5c20: 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d   extra_certs[] =
5c30: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63   {.#include "cac
5c40: 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74  key_builtin_cert
5c50: 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53 43  s.h".};../* PCSC
5c60: 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20   Global Handles 
5c70: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52  */.static LPSCAR
5c80: 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f  DCONTEXT cackey_
5c90: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
5ca0: 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  LL;..static unsi
5cb0: 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79  gned long cackey
5cc0: 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64  _getversion(void
5cd0: 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69  ) {..static unsi
5ce0: 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c  gned long retval
5cf0: 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65   = 255;..unsigne
5d00: 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30  d long major = 0
5d10: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
5d20: 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61   minor = 0;..cha
5d30: 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e  r *major_str = N
5d40: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f  ULL;..char *mino
5d50: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  r_str = NULL;...
5d60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5d70: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
5d80: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20  ..if (retval != 
5d90: 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  255) {...CACKEY_
5da0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
5db0: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63  turning 0x%lx (c
5dc0: 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c  ached).", retval
5dd0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
5de0: 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  val);..}...retva
5df0: 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50  l = 0;..#ifdef P
5e00: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20  ACKAGE_VERSION. 
5e10: 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72         major_str
5e20: 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49   = PACKAGE_VERSI
5e30: 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73  ON;..if (major_s
5e40: 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d  tr) {..        m
5e50: 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d  ajor = strtoul(m
5e60: 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72  ajor_str, &minor
5e70: 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66  _str, 10);....if
5e80: 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09   (minor_str) {..
5e90: 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75  ..minor = strtou
5ea0: 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c  l(minor_str + 1,
5eb0: 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a   NULL, 10);...}.
5ec0: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d  .}...retval = (m
5ed0: 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d  ajor << 16) | (m
5ee0: 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64  inor << 8);.#end
5ef0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
5f00: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
5f10: 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76  ing 0x%lx", retv
5f20: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
5f30: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f  tval);.}../* PC/
5f40: 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74  SC Related Funct
5f50: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59  ions */./*. * SY
5f60: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
5f70: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  id cackey_slots_
5f80: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76  disconnect_all(v
5f90: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
5fa0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
5fb0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
5fc0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
5fd0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
5fe0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
5ff0: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72  n disconnects fr
6000: 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a  om all cards.. *
6010: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
6020: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69   cackey_slots_di
6030: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69  sconnect_all(voi
6040: 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  d) {..uint32_t i
6050: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
6060: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
6070: 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  d.");...for (idx
6080: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
6090: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
60a0: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
60b0: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
60c0: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
60d0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
60e0: 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f 2a  nternal) {..../*
60f0: 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20 73   Skip internal s
6100: 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74 69  lots */....conti
6110: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  nue;...}....if (
6120: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6130: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
6140: 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b  ected) {....CACK
6150: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6160: 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  "SCardDisconnect
6170: 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28  (%lu) called", (
6180: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
6190: 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  dx);.....SCardDi
61a0: 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f  sconnect(cackey_
61b0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
61c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
61d0: 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09  E_CARD);...}....
61e0: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
61f0: 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09  [idx].label) {..
6200: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
6210: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b  ots[idx].label);
6220: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6230: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e  s[idx].label = N
6240: 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ULL;...}....cack
6250: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
6260: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
6270: 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  d = 0;...cackey_
6280: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
6290: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
62a0: 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
62b0: 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
62c0: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
62d0: 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65   0;....if (cacke
62e0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74  y_slots[idx].act
62f0: 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ive) {....CACKEY
6300: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
6310: 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c  arking active sl
6320: 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20  ot %lu as being 
6330: 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65  reset", (unsigne
6340: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09  d long) idx);...
6350: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
6360: 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
6370: 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b  t = 1;..}...CACK
6380: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6390: 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09  "Returning");...
63a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
63b0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
63c0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
63d0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
63e0: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
63f0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
6400: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
6410: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
6420: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
6430: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
6440: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
6450: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
6460: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
6470: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
6480: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65  s function conne
6490: 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43  cts to the PC/SC
64a0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61   Connection Mana
64b0: 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  ger and updates 
64c0: 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61  the. *     globa
64d0: 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f  l handle.. *. */
64e0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
64f0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  et cackey_pcsc_c
6500: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09  onnect(void) {..
6510: 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63  LONG scard_est_c
6520: 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64  ontext_ret;.#ifd
6530: 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56  ef HAVE_SCARDISV
6540: 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e  ALIDCONTEXT..LON
6550: 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  G scard_isvalid_
6560: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ret;.#endif...CA
6570: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6580: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
6590: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
65a0: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  handle == NULL) 
65b0: 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  {...cackey_pcsc_
65c0: 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28  handle = malloc(
65d0: 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70  sizeof(*cackey_p
65e0: 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09  csc_handle));...
65f0: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
6600: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  handle == NULL) 
6610: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
6620: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
6630: 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  o malloc() faile
6640: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
6650: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63  failure");.....c
6660: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6670: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
6680: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6690: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
66a0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
66b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
66c0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
66d0: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
66e0: 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  .scard_est_conte
66f0: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73  xt_ret = SCardEs
6700: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53  tablishContext(S
6710: 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45  CARD_SCOPE_SYSTE
6720: 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63  M, NULL, NULL, c
6730: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6740: 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f  e);...if (scard_
6750: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
6760: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6770: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
6780: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6790: 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62  ll to SCardEstab
67a0: 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c  lishContext fail
67b0: 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f  ed (returned %s/
67c0: 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20  %li), returning 
67d0: 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43  in failure", CAC
67e0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
67f0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
6800: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6810: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
6820: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6830: 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63  ret);.....free(c
6840: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6850: 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  e);....cackey_pc
6860: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
6870: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
6880: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6890: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
68a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
68b0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  NERIC);...}..}..
68c0: 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52  #ifdef HAVE_SCAR
68d0: 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a  DISVALIDCONTEXT.
68e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
68f0: 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 6c  INTF("SCardIsVal
6900: 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  idContext() call
6910: 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76  ed");..scard_isv
6920: 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64  alid_ret = SCard
6930: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a  IsValidContext(*
6940: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6950: 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  le);..if (scard_
6960: 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53  isvalid_ret != S
6970: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
6980: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
6990: 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20  _PRINTF("Handle 
69a0: 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  has become inval
69b0: 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 64  id (SCardIsValid
69c0: 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69  Context = %s/%li
69d0: 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d  ), trying to re-
69e0: 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43  establish...", C
69f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
6a00: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
6a10: 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72  (scard_isvalid_r
6a20: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
6a30: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a  d_isvalid_ret);.
6a40: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6a50: 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74  PRINTF("SCardEst
6a60: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20  ablishContext() 
6a70: 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72  called");...scar
6a80: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
6a90: 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69  t = SCardEstabli
6aa0: 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f  shContext(SCARD_
6ab0: 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55  SCOPE_SYSTEM, NU
6ac0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79  LL, NULL, cackey
6ad0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6ae0: 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63  .if (scard_est_c
6af0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43  ontext_ret != SC
6b00: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
6b10: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6b20: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
6b30: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
6b40: 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72  ontext failed (r
6b50: 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c  eturned %s/%li),
6b60: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
6b70: 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44  ilure", CACKEY_D
6b80: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
6b90: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
6ba0: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6bb0: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65  , (long) scard_e
6bc0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b  st_context_ret);
6bd0: 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
6be0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6bf0: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
6c00: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  ndle = NULL;....
6c10: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
6c20: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
6c30: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
6c40: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
6c50: 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
6c60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48  _DEBUG_PRINTF("H
6c70: 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72  andle has been r
6c80: 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b  e-established");
6c90: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  ..}.#endif...CAC
6ca0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6cb0: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f  ("Sucessfully co
6cc0: 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43  nnected to PC/SC
6cd0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  , returning in s
6ce0: 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75  uccess");...retu
6cf0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
6d00: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
6d10: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
6d20: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
6d30: 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
6d40: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
6d50: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
6d60: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
6d70: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
6d80: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
6d90: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
6da0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
6db0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
6dc0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
6dd0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
6de0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63  is function disc
6df0: 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65  onnects from the
6e00: 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f   PC/SC Connectio
6e10: 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70  n manager and up
6e20: 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65  dates. *     the
6e30: 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a   global handle..
6e40: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
6e50: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
6e60: 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
6e70: 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  void) {..LONG sc
6e80: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
6e90: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
6ea0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6eb0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
6ec0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6ed0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
6ee0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6ef0: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  S_OK);..}...scar
6f00: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
6f10: 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65  t = SCardRelease
6f20: 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f  Context(*cackey_
6f30: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09  pcsc_handle);...
6f40: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
6f50: 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65  handle) {...free
6f60: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
6f70: 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79  dle);.....cackey
6f80: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
6f90: 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63  ULL;..}...if (sc
6fa0: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
6fb0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6fc0: 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75  UCCESS) {...retu
6fd0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6fe0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
6ff0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7000: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
7010: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
7020: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d     void cackey_m
7030: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
7040: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7050: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
7060: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
7070: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
7080: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
7090: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
70a0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
70b0: 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c  ction marks a sl
70c0: 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20 62 65  ot has having be
70d0: 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61 74  en reset, to lat
70e0: 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70  er be cleaned up
70f0: 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75 70  .. *     Cleanup
7100: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
7110: 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c 69  en a PKCS#11 cli
7120: 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64  ent calls C_Find
7130: 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a  ObjectsInit.. *.
7140: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
7150: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
7160: 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61  _reset(struct ca
7170: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
7180: 20 7b 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20   {..if (slot == 
7190: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
71a0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
71b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
71c0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f  ed.");...if (slo
71d0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
71e0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43 61 72  nected) {...SCar
71f0: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
7200: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7210: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
7220: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f  .}...slot->slot_
7230: 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c 6f 74  reset = 1;..slot
7240: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
7250: 65 63 74 65 64 20 3d 20 30 3b 0a 09 73 6c 6f 74  ected = 0;..slot
7260: 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ->token_flags = 
7270: 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
7280: 45 44 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ED;...CACKEY_DEB
7290: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
72a0: 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72  ning.");...retur
72b0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
72c0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47  OSIS. *     LONG
72d0: 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
72e0: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61  t_card(struct ca
72f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
7300: 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70   DWORD default_p
7310: 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 44  rotocol, LPDWORD
7320: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63   selected_protoc
7330: 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ol);. *. * ARGUM
7340: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
7350: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
7360: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
7370: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
7380: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44 57 4f 52  o. *. *     DWOR
7390: 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63  D default_protoc
73a0: 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 50 72  ol. *         Pr
73b0: 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74 65 6d 70  otocol to attemp
73c0: 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a 20 20 20  t first. *. *   
73d0: 20 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74    LPDWORD select
73e0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20  ed_protocol. *  
73f0: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 72 6f         [OUT] Pro
7400: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 0a 20  tocol selected. 
7410: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
7420: 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65 74  E. *     The ret
7430: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 53  urn value from S
7440: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a  CardReconnect().
7450: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
7460: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
7470: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
7480: 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e 6e  ound SCardReconn
7490: 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20  ect(). *. *     
74a0: 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  The SCardReconne
74b0: 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61  ct() function ca
74c0: 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ll will be calle
74d0: 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68 65  d first with the
74e0: 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65 72  . *     dwPrefer
74f0: 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20  redProtocols of 
7500: 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f  "default_protoco
7510: 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61 6c  l".  If that cal
7520: 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20 20  l returns. *    
7530: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7540: 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61 69  ISMATCH try agai
7550: 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63 6f  n with a protoco
7560: 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66 61  l of T=0, and fa
7570: 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68 61  iling. *     tha
7580: 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  t T=1.. *. */.st
7590: 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79  atic LONG cackey
75a0: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
75b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
75c0: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20  ot *slot, DWORD 
75d0: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
75e0: 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74  , LPDWORD select
75f0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09  ed_protocol) {..
7600: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
7610: 72 65 74 3b 0a 0a 09 73 63 61 72 64 5f 63 6f 6e  ret;...scard_con
7620: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63  n_ret = SCardRec
7630: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
7640: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48  c_card, SCARD_SH
7650: 41 52 45 5f 53 48 41 52 45 44 2c 20 64 65 66 61  ARE_SHARED, defa
7660: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53 43  ult_protocol, SC
7670: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20  ARD_RESET_CARD, 
7680: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
7690: 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f  l);...if (scard_
76a0: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
76b0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
76c0: 43 48 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CH) {...CACKEY_D
76d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
76e0: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 65  rdReconnect() re
76f0: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50  turned SCARD_E_P
7700: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74  ROTO_MISMATCH, t
7710: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20  rying with just 
7720: 54 3d 30 22 29 0a 09 09 73 63 61 72 64 5f 63 6f  T=0")...scard_co
7730: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
7740: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
7750: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
7760: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7770: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7780: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
7790: 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  , selected_proto
77a0: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
77b0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
77c0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
77d0: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
77e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
77f0: 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28  "SCardReconnect(
7800: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
7810: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7820: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
7830: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 73 63 61  ust T=1")....sca
7840: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
7850: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
7860: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
7870: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7880: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
7890: 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45 54  _T1, SCARD_RESET
78a0: 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f  _CARD, selected_
78b0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 09  protocol);...}..
78c0: 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72 64  }...return(scard
78d0: 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f  _conn_ret);.}../
78e0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
78f0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
7900: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
7910: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7920: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
7930: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
7940: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
7950: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
7960: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
7970: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
7980: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7990: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
79a0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
79b0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
79c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
79d0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
79e0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
79f0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
7a00: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
7a10: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  ret cackey_conne
7a20: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
7a30: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7a40: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
7a50: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7a60: 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ;..DWORD protoco
7a70: 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63  l;..LONG scard_c
7a80: 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
7a90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7aa0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
7ab0: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
7ac0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7ad0: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
7ae0: 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69  ecified, returni
7af0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
7b00: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
7b10: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7b20: 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
7b30: 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
7b40: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
7b50: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
7b60: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
7b70: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
7b80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7b90: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
7ba0: 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
7bb0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
7bc0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
7bd0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
7be0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
7bf0: 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72  ./* Connect to r
7c00: 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64  eader, if needed
7c10: 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e   */..if (!slot->
7c20: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
7c30: 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ted) {...CACKEY_
7c40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7c50: 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63  ardConnect(%s) c
7c60: 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63  alled", slot->pc
7c70: 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73 63  sc_reader);...sc
7c80: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7c90: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
7ca0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
7cb0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7cc0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
7cd0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
7ce0: 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
7cf0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
7d00: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7d10: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09   &protocol);....
7d20: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7d30: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
7d40: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
7d50: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7d60: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
7d70: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
7d80: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7d90: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
7da0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
7db0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
7dc0: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
7dd0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
7de0: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
7df0: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
7e00: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
7e10: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26  D_PROTOCOL_T0, &
7e20: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7e30: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09   &protocol);....
7e40: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
7e50: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
7e60: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
7e70: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7e80: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
7e90: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7ea0: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
7eb0: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
7ec0: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29   with just T=1")
7ed0: 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  .....scard_conn_
7ee0: 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65  ret = SCardConne
7ef0: 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  ct(*cackey_pcsc_
7f00: 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63  handle, slot->pc
7f10: 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44  sc_reader, SCARD
7f20: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
7f30: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
7f40: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
7f50: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
7f60: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
7f70: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7f80: 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45  = SCARD_W_UNPOWE
7f90: 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 43  RED_CARD) {....C
7fa0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7fb0: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
7fc0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
7fd0: 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41  D_W_UNPOWERED_CA
7fe0: 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65  RD, trying to re
7ff0: 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a  -connect...");..
8000: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8010: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
8020: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
8030: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
8040: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
8050: 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43 41  HARE_DIRECT, SCA
8060: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
8070: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
8080: 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T1, &slot->pcsc_
8090: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
80a0: 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  ;.....if (scard_
80b0: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
80c0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
80d0: 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  CH) {.....CACKEY
80e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
80f0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65  CardConnect() re
8100: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50  turned SCARD_E_P
8110: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74  ROTO_MISMATCH, t
8120: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20  rying with just 
8130: 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64 5f  T=0").....scard_
8140: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
8150: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
8160: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
8170: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
8180: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
8190: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
81a0: 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T0, &slot->pc
81b0: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
81c0: 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63  ol);......if (sc
81d0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
81e0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
81f0: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43  SMATCH) {......C
8200: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8210: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
8220: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
8230: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
8240: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
8250: 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09  just T=1")......
8260: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8270: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
8280: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
8290: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
82a0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
82b0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
82c0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
82d0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
82e0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d  protocol);.....}
82f0: 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f  ....}.....scard_
8300: 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  conn_ret = cacke
8310: 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64  y_reconnect_card
8320: 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 2c  (slot, protocol,
8330: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d   &protocol);...}
8340: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8350: 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  nn_ret != SCARD_
8360: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
8370: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8380: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
8390: 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20  to card failed, 
83a0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
83b0: 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65  lure (SCardConne
83c0: 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c  ct() = %s/%li)",
83d0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
83e0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
83f0: 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  TR(scard_conn_re
8400: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
8410: 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09  _conn_ret);.....
8420: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8430: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
8440: 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63  .}....slot->pcsc
8450: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
8460: 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 1;...slot->tra
8470: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
8480: 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e   0;...slot->tran
8490: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
84a0: 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f 74  lock = 0;...slot
84b0: 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f  ->protocol = pro
84c0: 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74 75  tocol;..}...retu
84d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
84e0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
84f0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
8500: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8510: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
8520: 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  on(struct cackey
8530: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a  _slot *slot);. *
8540: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
8550: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
8560: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
8570: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
8580: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
8590: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
85a0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
85b0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
85c0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
85d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
85e0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
85f0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
8600: 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61 63       The transac
8610: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 74  tion should be t
8620: 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 20  erminated using 
8630: 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  "cackey_end_tran
8640: 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a  saction". *. */.
8650: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
8660: 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  t cackey_begin_t
8670: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
8680: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8690: 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72  lot) {..cackey_r
86a0: 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  et cackey_conn_r
86b0: 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  et;..LONG scard_
86c0: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43  trans_ret;...CAC
86d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
86e0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63  ("Called.");...c
86f0: 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d  ackey_conn_ret =
8700: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
8710: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
8720: 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74  (cackey_conn_ret
8730: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
8740: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
8750: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
8760: 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
8770: 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
8780: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
8790: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
87a0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
87b0: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61  ;..}...slot->tra
87c0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b  nsaction_depth++
87d0: 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ;...if (slot->tr
87e0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
87f0: 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74 72  > 1 && !slot->tr
8800: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
8810: 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43 4b  w_lock) {...CACK
8820: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8830: 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72  "Already in a tr
8840: 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f  ansaction, perfo
8850: 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20  rming no action 
8860: 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69 29  (new depth = %i)
8870: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
8880: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
8890: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
88a0: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73  SC_S_OK);..}...s
88b0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
88c0: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
88d0: 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73  0;...scard_trans
88e0: 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67 69  _ret = SCardBegi
88f0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  nTransaction(slo
8900: 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a 09  t->pcsc_card);..
8910: 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f  if (scard_trans_
8920: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
8930: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
8940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8950: 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69 6e  "Unable to begin
8960: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
8970: 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
8980: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
8990: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
89a0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
89b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
89c0: 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67 61  Sucessfully bega
89d0: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  n transaction on
89e0: 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f   slot (%s)", slo
89f0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t->pcsc_reader);
8a00: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8a10: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
8a20: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
8a30: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
8a40: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e   cackey_end_tran
8a50: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
8a60: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8a70: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
8a80: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
8a90: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
8aa0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
8ab0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
8ac0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
8ad0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
8ae0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
8af0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
8b00: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
8b10: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
8b20: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
8b30: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
8b40: 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65 73  unction requires
8b50: 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74   "cackey_begin_t
8b60: 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20 62  ransaction" to b
8b70: 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a 20  e called first. 
8b80: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
8b90: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65  key_ret cackey_e
8ba0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
8bb0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8bc0: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47  t *slot) {..LONG
8bd0: 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74   scard_trans_ret
8be0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
8bf0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
8c00: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d  ");...if (!slot-
8c10: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
8c20: 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  cted) {...CACKEY
8c30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
8c40: 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65  ard is not conne
8c50: 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20  cted, unable to 
8c60: 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  end transaction 
8c70: 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69 66  on card");....if
8c80: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
8c90: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
8ca0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8cb0: 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65 61 73  _PRINTF("Decreas
8cc0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
8cd0: 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e 67  depth and asking
8ce0: 20 66 6f 72 20 61 20 68 61 72 64 77 61 72 65 20   for a hardware 
8cf0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78 74  lock on the next
8d00: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
8d10: 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74  on (current dept
8d20: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
8d30: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8d40: 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 72  h);.....slot->tr
8d50: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
8d60: 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d  -;.....if (slot-
8d70: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8d80: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73 6c  th > 0) {.....sl
8d90: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8da0: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31  need_hw_lock = 1
8db0: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
8dc0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8dd0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
8de0: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
8df0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d  saction_depth ==
8e00: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
8e10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65 72  EBUG_PRINTF("Ter
8e20: 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e 73  minating a trans
8e30: 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  action that has 
8e40: 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09  not begun!");...
8e50: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8e60: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
8e70: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .}...slot->trans
8e80: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
8e90: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
8ea0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
8eb0: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
8ec0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61 6e  BUG_PRINTF("Tran
8ed0: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69  sactions still i
8ee0: 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20  n progress, not 
8ef0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63  terminating on-c
8f00: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
8f10: 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d  (current depth =
8f20: 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61   %i)", slot->tra
8f30: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b  nsaction_depth);
8f40: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8f50: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
8f60: 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  ...scard_trans_r
8f70: 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72 61  et = SCardEndTra
8f80: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70  nsaction(slot->p
8f90: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
8fa0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69 66  LEAVE_CARD);..if
8fb0: 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65   (scard_trans_re
8fc0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
8fd0: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
8fe0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
8ff0: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61  nable to end tra
9000: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
9010: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
9020: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9030: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9040: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
9050: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65  BUG_PRINTF("Suce
9060: 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74  ssfully terminat
9070: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ed transaction o
9080: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c  n slot (%s)", sl
9090: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
90a0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
90b0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
90c0: 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65 64  ./* APDU Related
90d0: 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a   Functions */./*
90e0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
90f0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
9100: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
9110: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
9120: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
9130: 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75  ed char class, u
9140: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73  nsigned char ins
9150: 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e  truction, unsign
9160: 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69  ed char p1, unsi
9170: 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e  gned char p2, un
9180: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20  signed char lc, 
9190: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
91a0: 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ata, unsigned ch
91b0: 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20  ar le, uint16_t 
91c0: 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67  *respcode, unsig
91d0: 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61  ned char *respda
91e0: 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70  ta, size_t *resp
91f0: 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a  data_len);. *. *
9200: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
9210: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
9220: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
9230: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
9240: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
9250: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9260: 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20 20  class. *        
9270: 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53 43   APDU Class (GSC
9280: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
9290: 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53 5f   or GSCIS_CLASS_
92a0: 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a  GLOBAL_PLATFORM.
92b0: 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61 6c   *         usual
92c0: 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a  ly), (CLA). *. *
92d0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
92e0: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  ar instruction. 
92f0: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 49  *         APDU I
9300: 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53 29  nstruction (INS)
9310: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
9320: 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20 20  ned char p1. *  
9330: 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61         APDU Para
9340: 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a 0a  meter 1 (P1). *.
9350: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9360: 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20 20  char p2. *      
9370: 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 65     APDU Paramete
9380: 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20  r 2 (P2). *. *  
9390: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
93a0: 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20 41   lc. *         A
93b0: 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f  PDU Length of Co
93c0: 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68  ntent (Lc) -- th
93d0: 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68  is is the length
93e0: 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20 20   of "data". *   
93f0: 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72 2e        parameter.
9400: 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20 73    If "data" is s
9410: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
9420: 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  , this parameter
9430: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
9440: 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a   be ignored.. *.
9450: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9460: 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20 20  char *data. *   
9470: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
9480: 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64 2e   buffer to send.
9490: 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 22    It should be "
94a0: 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20  Lc" bytes long. 
94b0: 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 73   If. *         s
94c0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
94d0: 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20  , "Lc" will not 
94e0: 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68 69  be sent, and thi
94f0: 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65  s buffer will be
9500: 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e 6f  . *         igno
9510: 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  red.. *. *     u
9520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 0a  nsigned char le.
9530: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
9540: 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63 74  Length of Expect
9550: 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68  ation (Le) -- th
9560: 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68  is is the length
9570: 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20 20   of the. *      
9580: 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70 6c     expected repl
9590: 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  y.  If this is s
95a0: 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74 68  pecified as 0 th
95b0: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20  en it will not. 
95c0: 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65 6e  *         be sen
95d0: 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e  t.. *. *     uin
95e0: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a  t16_t *respcode.
95f0: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
9600: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72   Pointer to stor
9610: 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70  age of APDU resp
9620: 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20 74  onse code.  If t
9630: 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20  his is. *       
9640: 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e    specified as N
9650: 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73  ULL, the respons
9660: 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 64  e code will be d
9670: 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20  iscarded.. *. * 
9680: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9690: 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20 20  r *respdata. *  
96a0: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69         [OUT] Poi
96b0: 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20  nter to storage 
96c0: 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65  of APDU response
96d0: 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73 20   data.  If this 
96e0: 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70  is. *         sp
96f0: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
9700: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61   the response da
9710: 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61  ta will be disca
9720: 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20 20  rded.  If. *    
9730: 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64 61       the "respda
9740: 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74 65  ta_len" paramete
9750: 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  r is specified a
9760: 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75 66  s NULL, this buf
9770: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 77  fer. *         w
9780: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
9790: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  ed.. *. *     si
97a0: 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c  ze_t *respdata_l
97b0: 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 49  en. *         [I
97c0: 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20  N, OUT] Pointer 
97d0: 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61  initialing conta
97e0: 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f  ining the size o
97f0: 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61 22  f the "respdata"
9800: 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66 66  . *         buff
9810: 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74 75  er.  Before retu
9820: 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74  rning, the point
9830: 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20 75  ed to value is u
9840: 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20 2a  pdated to the. *
9850: 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20           number 
9860: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
9870: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20   to the buffer. 
9880: 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63   If this is spec
9890: 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20 20  ified as. *     
98a0: 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c      NULL, it wil
98b0: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
98c0: 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61 22  , and "respdata"
98d0: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
98e0: 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20 20   causing. *     
98f0: 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73 65      the response
9900: 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73 63   data to be disc
9910: 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54  arded.. *. * RET
9920: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
9930: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
9940: 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20 73  K           On s
9950: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
9960: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
9970: 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72 6f  RIC      On erro
9980: 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  r. *     CACKEY_
9990: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
99a0: 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e 64 69  NT  If the sendi
99b0: 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61 75 73  ng failed becaus
99c0: 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20  e the token is. 
99d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e 4f   absent. *. * NO
9a00: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
9a10: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f  function will co
9a20: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f  nnect to the PC/
9a30: 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61  SC Connection Ma
9a40: 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20  nager via. *    
9a50: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
9a60: 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65 64  nect() if needed
9a70: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77  .. *. *     It w
9a80: 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74  ill connect to t
9a90: 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20 72  he card in the r
9aa0: 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20 74  eader attached t
9ab0: 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20  o the slot. *   
9ac0: 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49 74    specified.  It
9ad0: 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20   will reconnect 
9ae0: 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20 74  to the card if t
9af0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a  he connection. *
9b00: 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a       goes away..
9b10: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
9b20: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
9b30: 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74  send_apdu(struct
9b40: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
9b50: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
9b60: 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65  r class, unsigne
9b70: 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69  d char instructi
9b80: 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  on, unsigned cha
9b90: 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p1, unsigned c
9ba0: 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64  har p2, unsigned
9bb0: 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e 65   int lc, unsigne
9bc0: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
9bd0: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20 75  signed int le, u
9be0: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
9bf0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
9c00: 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65   *respdata, size
9c10: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  _t *respdata_len
9c20: 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a  ) {..uint8_t maj
9c30: 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b  or_rc, minor_rc;
9c40: 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74  ..size_t bytes_t
9c50: 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70  o_copy, tmp_resp
9c60: 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43  data_len;..LPCSC
9c70: 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70  ARD_IO_REQUEST p
9c80: 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52  ioSendPci;..DWOR
9c90: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f  D protocol;..DWO
9ca0: 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63  RD xmit_len, rec
9cb0: 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  v_len;..LONG sca
9cc0: 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61  rd_xmit_ret, sca
9cd0: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09  rd_reconn_ret;..
9ce0: 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30  BYTE xmit_buf[10
9cf0: 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30  24], recv_buf[10
9d00: 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  24];..int pcsc_c
9d10: 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63  onnect_ret, pcsc
9d20: 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69  _getresp_ret;..i
9d30: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  nt idx;...CACKEY
9d40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
9d50: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
9d60: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45  !slot) {...CACKE
9d70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9d80: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65  Invalid slot spe
9d90: 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65  cified.");....re
9da0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9db0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
9dc0: 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
9dd0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
9de0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
9df0: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
9e00: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
9e10: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
9e20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9e30: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
9e40: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
9e50: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
9e60: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
9e70: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9e80: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
9e90: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68   Determine which
9ea0: 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e   protocol to sen
9eb0: 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74  d using */..swit
9ec0: 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ch (slot->protoc
9ed0: 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41  ol) {...case SCA
9ee0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a  RD_PROTOCOL_T0:.
9ef0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9f00: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c  PRINTF("Protocol
9f10: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61   to send datagra
9f20: 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09 09 09  m is T=0");.....
9f30: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
9f40: 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62  RD_PCI_T0;.....b
9f50: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41  reak;...case SCA
9f60: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a  RD_PROTOCOL_T1:.
9f70: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9f80: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c  PRINTF("Protocol
9f90: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61   to send datagra
9fa0: 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09 09 09  m is T=1");.....
9fb0: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
9fc0: 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62  RD_PCI_T1;.....b
9fd0: 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a  reak;...default:
9fe0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9ff0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
a000: 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c   protocol found,
a010: 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09   aborting.");...
a020: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a030: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
a040: 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69  ..}.../* Transmi
a050: 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d  t */..xmit_len =
a060: 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d   0;..xmit_buf[xm
a070: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73  it_len++] = clas
a080: 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  s;..xmit_buf[xmi
a090: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72  t_len++] = instr
a0a0: 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75  uction;..xmit_bu
a0b0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a0c0: 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  p1;..xmit_buf[xm
a0d0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a  it_len++] = p2;.
a0e0: 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09 69  .if (data) {...i
a0f0: 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b 0a 09  f (lc > 255) {..
a100: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a110: 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21 20  RINTF("CAUTION! 
a120: 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67 72 65   Using an Lc gre
a130: 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 69 73  ater than 255 is
a140: 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63 20 3d   untested.  Lc =
a150: 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 09 78   %u", lc);.....x
a160: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a170: 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58  ++] = 0x82; /* X
a180: 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09  XX UNTESTED */..
a190: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a1a0: 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 20 30  len++] = (lc & 0
a1b0: 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09  xff00) >> 8;....
a1c0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a1d0: 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78 66 66  n++] = lc & 0xff
a1e0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
a1f0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a200: 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09  n++] = lc;...}..
a210: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
a220: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20  dx < lc; idx++) 
a230: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
a240: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61  it_len++] = data
a250: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  [idx];...}..}...
a260: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20  if (le != 0x00) 
a270: 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32 35 36  {...if (le > 256
a280: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
a290: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54  BUG_PRINTF("CAUT
a2a0: 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c  ION!  Using an L
a2b0: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32  e greater than 2
a2c0: 35 36 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20  56 is untested. 
a2d0: 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29 3b 0a   Le = %u", le);.
a2e0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a2f0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b  t_len++] = 0x82;
a300: 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44   /* XXX UNTESTED
a310: 20 2a 2f 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 28 6c  xmit_len++] = (l
a330: 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  e & 0xff00) >> 8
a340: 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ;....xmit_buf[xm
a350: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26  it_len++] = le &
a360: 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20   0xff;...} else 
a370: 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b  if (le == 256) {
a380: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a390: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b  t_len++] = 0x00;
a3a0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78  ...} else {....x
a3b0: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a3c0: 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d  ++] = le;...}..}
a3d0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72  .../* Begin Smar
a3e0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a3f0: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67  n */..cackey_beg
a400: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
a410: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73  lot);...if (clas
a420: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53  s == GSCIS_CLASS
a430: 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73 74  _ISO7816 && inst
a440: 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53  ruction == GSCIS
a450: 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26 26  _INSTR_VERIFY &&
a460: 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09   p1 == 0x00) {..
a470: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a480: 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50  INTF("Sending AP
a490: 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e  DU: <<censored>>
a4a0: 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
a4b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a4c0: 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41  NTBUF("Sending A
a4d0: 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c  PDU:", xmit_buf,
a4e0: 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   xmit_len);..}..
a4f0: 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65  .recv_len = size
a500: 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73  of(recv_buf);..s
a510: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20  card_xmit_ret = 
a520: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c  SCardTransmit(sl
a530: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70  ot->pcsc_card, p
a540: 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f  ioSendPci, xmit_
a550: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e  buf, xmit_len, N
a560: 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26  ULL, recv_buf, &
a570: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  recv_len);...if 
a580: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  (scard_xmit_ret 
a590: 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54  == SCARD_E_NOT_T
a5a0: 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 43  RANSACTED) {...C
a5b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a5c0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
a5d0: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
a5e0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
a5f0: 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c   = %s/%lx), will
a600: 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e   ask calling fun
a610: 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 28  ction to retry (
a620: 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63 61  not resetting ca
a630: 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f  rd)...", CACKEY_
a640: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
a650: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
a660: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73  _xmit_ret), (uns
a670: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72  igned long) scar
a680: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09  d_xmit_ret);....
a690: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
a6a0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
a6b0: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  /...cackey_end_t
a6c0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
a6d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
a6e0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
a6f0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64  ;..}...if (scard
a700: 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41  _xmit_ret != SCA
a710: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
a720: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a730: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
a740: 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61   send APDU to ca
a750: 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  rd (SCardTransmi
a760: 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20  t() = %s/%lx)", 
a770: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
a780: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
a790: 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  R(scard_xmit_ret
a7a0: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
a7b0: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
a7c0: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
a7d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b  BUG_PRINTF("Mark
a7e0: 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69  ing slot as havi
a7f0: 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b  ng been reset");
a800: 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
a810: 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
a820: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d  ....if (scard_xm
a830: 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  it_ret == SCARD_
a840: 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a  W_RESET_CARD) {.
a850: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a860: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65  PRINTF("Reset re
a870: 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68  quired, please h
a880: 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63  old...");.....sc
a890: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
a8a0: 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
a8b0: 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41  t_card(slot, SCA
a8c0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
a8d0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
a8e0: 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  T1, &protocol);.
a8f0: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
a900: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
a910: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
a920: 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f  .../* Update pro
a930: 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f  tocol */.....slo
a940: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
a950: 6f 74 6f 63 6f 6c 3b 0a 09 09 09 09 73 77 69 74  otocol;.....swit
a960: 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ch (slot->protoc
a970: 6f 6c 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20  ol) {......case 
a980: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
a990: 30 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64  0:.......pioSend
a9a0: 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f  Pci = SCARD_PCI_
a9b0: 54 30 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  T0;........break
a9c0: 3b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 52  ;......case SCAR
a9d0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09  D_PROTOCOL_T1:..
a9e0: 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20  .....pioSendPci 
a9f0: 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a  = SCARD_PCI_T1;.
aa00: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
aa10: 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09  ...default:.....
aa20: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
aa30: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70  RINTF("Invalid p
aa40: 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62  rotocol found, b
aa50: 75 74 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64  ut too late to d
aa60: 6f 20 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74  o anything about
aa70: 20 69 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e   it now -- tryin
aa80: 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09  g anyway.");....
aa90: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
aaa0: 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61  ....../* Re-esta
aab0: 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f  blish transactio
aac0: 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65  n, if it was pre
aad0: 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28  sent */.....if (
aae0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
aaf0: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
ab00: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
ab10: 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09  ction_depth--;..
ab20: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
ab30: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
ab40: 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63  ck = 1;......cac
ab50: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
ab60: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09  ction(slot);....
ab70: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
ab80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
ab90: 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  et successful, r
aba0: 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b  etransmitting");
abb0: 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d  ......recv_len =
abc0: 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66   sizeof(recv_buf
abd0: 29 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69  );.....scard_xmi
abe0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61  t_ret = SCardTra
abf0: 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nsmit(slot->pcsc
ac00: 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63  _card, pioSendPc
ac10: 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69  i, xmit_buf, xmi
ac20: 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63  t_len, NULL, rec
ac30: 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e  v_buf, &recv_len
ac40: 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72  );......if (scar
ac50: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
ac60: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
ac70: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
ac80: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61  UG_PRINTF("Retra
ac90: 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65  nsmit failed, re
aca0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
acb0: 72 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e  re after disconn
acc0: 65 63 74 69 6e 67 20 74 68 65 20 63 61 72 64 20  ecting the card 
acd0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d  (SCardTransmit =
ace0: 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45   %s/%li)", CACKE
acf0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
ad00: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
ad10: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c  rd_xmit_ret), (l
ad20: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
ad30: 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72  ret);.......SCar
ad40: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
ad50: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
ad60: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
ad70: 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f  .....slot->pcsc_
ad80: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
ad90: 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64   0;......./* End
ada0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
adb0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73  action */......s
adc0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
add0: 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09  _depth = 1;.....
ade0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
adf0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
ae00: 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
ae10: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
ae20: 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09  BSENT);.....}...
ae30: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41  .} else {.....CA
ae40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ae50: 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67  F("Disconnecting
ae60: 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43   card");......SC
ae70: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c  ardDisconnect(sl
ae80: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
ae90: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
aea0: 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  ;.....slot->pcsc
aeb0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
aec0: 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64  = 0;....../* End
aed0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
aee0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c  action */.....sl
aef0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
af00: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63  depth = 1;.....c
af10: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
af20: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
af30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
af40: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
af50: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09   in failure");..
af60: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
af70: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
af80: 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65  ENT);....}...} e
af90: 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
afa0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69  DEBUG_PRINTF("Di
afb0: 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64  sconnecting card
afc0: 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73  ");.....SCardDis
afd0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
afe0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
aff0: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73  EAVE_CARD);....s
b000: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
b010: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
b020: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
b030: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
b040: 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  /....slot->trans
b050: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
b060: 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  ;....cackey_end_
b070: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b080: 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
b090: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
b0a0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b0b0: 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
b0c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
b0d0: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d  NABSENT);...}..}
b0e0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b0f0: 50 52 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e  PRINTBUF("Return
b100: 65 64 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76  ed Value:", recv
b110: 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b  _buf, recv_len);
b120: 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20  ...if (recv_len 
b130: 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69  < 2) {.../* Mini
b140: 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e  mal response len
b150: 67 74 68 20 69 73 20 32 20 62 79 74 65 73 2c 20  gth is 2 bytes, 
b160: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b170: 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59  lure */...CACKEY
b180: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
b190: 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c  esponse too smal
b1a0: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  l, returning in 
b1b0: 66 61 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65  failure (recv_le
b1c0: 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  n = %lu)", (unsi
b1d0: 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f  gned long) recv_
b1e0: 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20  len);..../* End 
b1f0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
b200: 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ction */...cacke
b210: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
b220: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75  n(slot);....retu
b230: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
b240: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
b250: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73  /* Determine res
b260: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a  ult code */..maj
b270: 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66  or_rc = recv_buf
b280: 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a  [recv_len - 2];.
b290: 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76  .minor_rc = recv
b2a0: 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20  _buf[recv_len - 
b2b0: 31 5d 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64  1];..if (respcod
b2c0: 65 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65  e) {...*respcode
b2d0: 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20   = (major_rc << 
b2e0: 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09  8) | minor_rc;..
b2f0: 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65  }.../* Adjust me
b300: 73 73 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a  ssage buffer */.
b310: 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a  .recv_len -= 2;.
b320: 0a 09 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74  ../* Add bytes t
b330: 6f 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  o return value *
b340: 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  /..tmp_respdata_
b350: 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65  len = 0;..if (re
b360: 73 70 64 61 74 61 20 26 26 20 72 65 73 70 64 61  spdata && respda
b370: 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f  ta_len) {...tmp_
b380: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a  respdata_len = *
b390: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09  respdata_len;...
b3a0: 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
b3b0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a   *respdata_len;.
b3c0: 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20  ...if (recv_len 
b3d0: 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  < bytes_to_copy)
b3e0: 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63   {....bytes_to_c
b3f0: 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a  opy = recv_len;.
b400: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
b410: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79  BUG_PRINTF("Copy
b420: 69 6e 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f  ing %lu bytes to
b430: 20 74 68 65 20 62 75 66 66 65 72 20 28 72 65 63   the buffer (rec
b440: 76 27 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62  v'd %lu bytes, b
b450: 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65  ut only %lu byte
b460: 73 20 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75  s left in our bu
b470: 66 66 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65  ffer)", (unsigne
b480: 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f  d long) bytes_to
b490: 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64  _copy, (unsigned
b4a0: 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c   long) recv_len,
b4b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b4c0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b   *respdata_len);
b4d0: 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64  ....memcpy(respd
b4e0: 61 74 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62  ata, recv_buf, b
b4f0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09  ytes_to_copy);..
b500: 09 72 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74  .respdata += byt
b510: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a  es_to_copy;....*
b520: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62  respdata_len = b
b530: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09  ytes_to_copy;...
b540: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
b550: 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70   -= bytes_to_cop
b560: 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  y;..} else {...i
b570: 66 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30  f (recv_len != 0
b580: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
b590: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f  BUG_PRINTF("Thro
b5a0: 77 69 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79  wing away %lu by
b5b0: 74 65 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20  tes, nowhere to 
b5c0: 70 75 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73  put them!", (uns
b5d0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76  igned long) recv
b5e0: 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  _len);...}..}...
b5f0: 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20  if (major_rc == 
b600: 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20  0x61) {.../* We 
b610: 6e 65 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a  need to READ */.
b620: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b630: 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65  RINTF("Buffer re
b640: 61 64 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a  ad required");..
b650: 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d  ..if (minor_rc =
b660: 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e  = 0x00) {....min
b670: 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41  or_rc = CACKEY_A
b680: 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09  PDU_MTU;...}....
b690: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
b6a0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
b6b0: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
b6c0: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
b6d0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
b6e0: 45 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30  ESPONSE, 0x00, 0
b6f0: 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69  x00, 0, NULL, mi
b700: 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65  nor_rc, respcode
b710: 2c 20 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70  , respdata, &tmp
b720: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a  _respdata_len);.
b730: 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65 74 72  ...if (pcsc_getr
b740: 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  esp_ret != CACKE
b750: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
b760: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b770: 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65  RINTF("Buffer re
b780: 61 64 20 66 61 69 6c 65 64 21 20 20 52 65 74 75  ad failed!  Retu
b790: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b7a0: 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53  ");...../* End S
b7b0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b7c0: 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
b7d0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
b7e0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20  n(slot);.....if 
b7f0: 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65  (pcsc_getresp_re
b800: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
b810: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09  _E_RETRY) {.....
b820: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
b830: 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09  SC_E_RETRY);....
b840: 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  }.....return(CAC
b850: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
b860: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  IC);...}....if (
b870: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a  respdata_len) {.
b880: 09 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  ...*respdata_len
b890: 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61   += tmp_respdata
b8a0: 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  _len;...}..../* 
b8b0: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
b8c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
b8d0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b8e0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b8f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b900: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
b910: 6e 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65  n success (buffe
b920: 72 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29  r read complete)
b930: 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
b940: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
b950: 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72  .}.../* End Smar
b960: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
b970: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
b980: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
b990: 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f  t);...if (major_
b9a0: 72 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09  rc == 0x90) {...
b9b0: 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09  /* Success */...
b9c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b9d0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
b9e0: 6e 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72  n success (major
b9f0: 5f 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a  _rc = 0x90)");..
ba00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
ba10: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
ba20: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ba30: 52 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75  RINTF("APDU Retu
ba40: 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72  rned an error, r
ba50: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ba60: 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ure");...return(
ba70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
ba80: 4e 45 52 49 43 29 3b 0a 7d 0a 0a 73 74 61 74 69  NERIC);.}..stati
ba90: 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  c unsigned char 
baa0: 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72  *cackey_read_ber
bab0: 74 6c 76 5f 74 61 67 28 75 6e 73 69 67 6e 65 64  tlv_tag(unsigned
bac0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73   char *buffer, s
bad0: 69 7a 65 5f 74 20 2a 62 75 66 66 65 72 5f 6c 65  ize_t *buffer_le
bae0: 6e 5f 70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  n_p, unsigned ch
baf0: 61 72 20 74 61 67 2c 20 75 6e 73 69 67 6e 65 64  ar tag, unsigned
bb00: 20 63 68 61 72 20 2a 6f 75 74 62 75 66 66 65 72   char *outbuffer
bb10: 2c 20 73 69 7a 65 5f 74 20 2a 6f 75 74 62 75 66  , size_t *outbuf
bb20: 66 65 72 5f 6c 65 6e 5f 70 29 20 7b 0a 09 75 6e  fer_len_p) {..un
bb30: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
bb40: 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 6f  fer_p;..size_t o
bb50: 75 74 62 75 66 66 65 72 5f 6c 65 6e 2c 20 62 75  utbuffer_len, bu
bb60: 66 66 65 72 5f 6c 65 6e 3b 0a 09 73 69 7a 65 5f  ffer_len;..size_
bb70: 74 20 73 69 7a 65 3b 0a 09 69 6e 74 20 69 64 78  t size;..int idx
bb80: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
bb90: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
bba0: 22 29 3b 0a 0a 09 69 66 20 28 62 75 66 66 65 72  ");...if (buffer
bbb0: 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  _len_p == NULL) 
bbc0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
bbd0: 5f 50 52 49 4e 54 46 28 22 62 75 66 66 65 72 5f  _PRINTF("buffer_
bbe0: 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20  len_p is NULL.  
bbf0: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  Returning in fai
bc00: 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75  lure.");....retu
bc10: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
bc20: 66 20 28 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  f (outbuffer_len
bc30: 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  _p == NULL) {...
bc40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
bc50: 4e 54 46 28 22 6f 75 74 62 75 66 66 65 72 5f 6c  NTF("outbuffer_l
bc60: 65 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e 20 20 52  en_p is NULL.  R
bc70: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
bc80: 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ure.");....retur
bc90: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 62 75  n(NULL);..}...bu
bca0: 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f 75 74 62  ffer_len = *outb
bcb0: 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a 09 6f 75  uffer_len_p;..ou
bcc0: 74 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f  tbuffer_len = *o
bcd0: 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a  utbuffer_len_p;.
bce0: 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66  ..buffer_p = buf
bcf0: 66 65 72 3b 0a 09 69 66 20 28 62 75 66 66 65 72  fer;..if (buffer
bd00: 5f 70 5b 30 5d 20 21 3d 20 74 61 67 29 20 7b 0a  _p[0] != tag) {.
bd10: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bd20: 52 49 4e 54 46 28 22 54 61 67 20 66 6f 75 6e 64  RINTF("Tag found
bd30: 20 77 61 73 20 6e 6f 74 20 74 61 67 20 65 78 70   was not tag exp
bd40: 65 63 74 65 64 2e 20 20 54 61 67 20 3d 20 25 30  ected.  Tag = %0
bd50: 32 78 2c 20 45 78 70 65 63 74 65 64 20 3d 20 25  2x, Expected = %
bd60: 30 32 78 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  02x.  Returning 
bd70: 69 6e 20 66 61 69 6c 75 72 65 2e 22 2c 20 28 75  in failure.", (u
bd80: 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 62 75 66  nsigned int) buf
bd90: 66 65 72 5f 70 5b 30 5d 2c 20 74 61 67 29 3b 0a  fer_p[0], tag);.
bda0: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
bdb0: 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f 70 2b 2b  ..}...buffer_p++
bdc0: 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e 2d 2d 3b  ;..buffer_len--;
bdd0: 0a 0a 09 69 66 20 28 28 62 75 66 66 65 72 5f 70  ...if ((buffer_p
bde0: 5b 30 5d 20 26 20 30 78 38 30 29 20 3d 3d 20 30  [0] & 0x80) == 0
bdf0: 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20  x80) {...size = 
be00: 30 3b 0a 09 09 69 64 78 20 3d 20 28 62 75 66 66  0;...idx = (buff
be10: 65 72 5f 70 5b 30 5d 20 26 20 30 78 37 66 29 3b  er_p[0] & 0x7f);
be20: 0a 0a 09 09 69 66 20 28 69 64 78 20 3e 20 62 75  ....if (idx > bu
be30: 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09 09 09 43  ffer_len) {....C
be40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
be50: 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42 45  TF("Malformed BE
be60: 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20 65  R value -- not e
be70: 6e 6f 75 67 68 20 62 79 74 65 73 20 61 76 61 69  nough bytes avai
be80: 6c 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c 65  lable to read le
be90: 6e 67 74 68 20 28 69 64 78 20 3d 20 25 69 2c 20  ngth (idx = %i, 
bea0: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75  buffer_len = %lu
beb0: 29 22 2c 20 69 64 78 2c 20 28 75 6e 73 69 67 6e  )", idx, (unsign
bec0: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f  ed long) buffer_
bed0: 6c 65 6e 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  len);.....return
bee0: 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a 09 09 66  (NULL);...}....f
bef0: 6f 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20 69  or (; idx > 0; i
bf00: 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66 65  dx--) {....buffe
bf10: 72 5f 70 2b 2b 3b 0a 09 09 09 62 75 66 66 65 72  r_p++;....buffer
bf20: 5f 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73 69 7a 65  _len--;.....size
bf30: 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20   <<= 8;....size 
bf40: 7c 3d 20 62 75 66 66 65 72 5f 70 5b 30 5d 3b 0a  |= buffer_p[0];.
bf50: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
bf60: 73 69 7a 65 20 3d 20 62 75 66 66 65 72 5f 70 5b  size = buffer_p[
bf70: 30 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f  0];..}...buffer_
bf80: 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e  p++;..buffer_len
bf90: 2d 2d 3b 0a 0a 09 69 66 20 28 73 69 7a 65 20 3e  --;...if (size >
bfa0: 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 20   outbuffer_len) 
bfb0: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
bfc0: 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20  _PRINTF("Unable 
bfd0: 74 6f 20 63 6f 70 79 20 76 61 6c 75 65 20 62 75  to copy value bu
bfe0: 66 66 65 72 20 74 6f 20 6f 75 74 62 75 66 66 65  ffer to outbuffe
bff0: 72 2c 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 6f  r, not enough ro
c000: 6f 6d 2e 20 20 56 61 6c 75 65 20 62 75 66 66 65  om.  Value buffe
c010: 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20  r length = %lu, 
c020: 6f 75 74 20 62 75 66 66 65 72 20 6c 65 6e 67 74  out buffer lengt
c030: 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  h = %lu", (unsig
c040: 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 2c 20  ned long) size, 
c050: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c060: 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a  outbuffer_len);.
c070: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
c080: 0a 09 7d 0a 0a 09 2a 6f 75 74 62 75 66 66 65 72  ..}...*outbuffer
c090: 5f 6c 65 6e 5f 70 20 3d 20 73 69 7a 65 3b 0a 09  _len_p = size;..
c0a0: 69 66 20 28 6f 75 74 62 75 66 66 65 72 29 20 7b  if (outbuffer) {
c0b0: 0a 09 09 6d 65 6d 63 70 79 28 6f 75 74 62 75 66  ...memcpy(outbuf
c0c0: 66 65 72 2c 20 62 75 66 66 65 72 5f 70 2c 20 73  fer, buffer_p, s
c0d0: 69 7a 65 29 3b 0a 09 09 62 75 66 66 65 72 5f 70  ize);...buffer_p
c0e0: 20 2b 3d 20 73 69 7a 65 3b 0a 09 09 62 75 66 66   += size;...buff
c0f0: 65 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a 65 3b 0a  er_len -= size;.
c100: 0a 09 09 2a 62 75 66 66 65 72 5f 6c 65 6e 5f 70  ...*buffer_len_p
c110: 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 0a   = buffer_len;..
c120: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c130: 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c 56  RINTBUF("BER-TLV
c140: 20 72 65 73 75 6c 74 73 3a 22 2c 20 6f 75 74 62   results:", outb
c150: 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d  uffer, size);..}
c160: 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d 6d 6f 76   else {...memmov
c170: 65 28 62 75 66 66 65 72 2c 20 62 75 66 66 65 72  e(buffer, buffer
c180: 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66  _p, size);...buf
c190: 66 65 72 5f 70 20 3d 20 62 75 66 66 65 72 3b 0a  fer_p = buffer;.
c1a0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c1b0: 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d 54 4c  PRINTBUF("BER-TL
c1c0: 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 62 75 66  V results:", buf
c1d0: 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a  fer, size);..}..
c1e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c1f0: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
c200: 69 6e 20 73 75 63 63 65 73 73 2e 20 20 53 69 7a  in success.  Siz
c210: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73 20 66 6f  e of contents fo
c220: 72 20 74 61 67 20 25 30 32 78 20 69 73 20 25 6c  r tag %02x is %l
c230: 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  u", (unsigned in
c240: 74 29 20 74 61 67 2c 20 28 75 6e 73 69 67 6e 65  t) tag, (unsigne
c250: 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a  d long) size);..
c260: 09 72 65 74 75 72 6e 28 62 75 66 66 65 72 5f 70  .return(buffer_p
c270: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
c280: 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69 7a  OSIS. *     ssiz
c290: 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64  e_t cackey_get_d
c2a0: 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65  ata(struct cacke
c2b0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
c2c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
c2d0: 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75 66 66  fer, size_t buff
c2e0: 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64  er_len, unsigned
c2f0: 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20   char oid[3]);. 
c300: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c310: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c320: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
c330: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
c340: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
c350: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
c360: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c370: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  er. *         [O
c380: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a  UT] Buffer. *. *
c390: 20 20 20 20 20 73 69 7a 65 5f 74 20 62 75 66 66       size_t buff
c3a0: 65 72 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20  er_len. *       
c3b0: 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65    Number of byte
c3c0: 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20  s to attempt to 
c3d0: 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20 75  read. *. *     u
c3e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64  nsigned char oid
c3f0: 5b 33 5d 0a 20 2a 20 20 20 20 20 20 20 20 20 33  [3]. *         3
c400: 2d 62 79 74 65 20 4f 49 44 20 74 6f 20 72 65 61  -byte OID to rea
c410: 64 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  d. *. *. * RETUR
c420: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
c430: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
c440: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
c450: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
c460: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
c470: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
c480: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
c490: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
c4a0: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74  ize_t cackey_get
c4b0: 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63  _data(struct cac
c4c0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
c4d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
c4e0: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62 75  uffer, size_t bu
c4f0: 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67 6e  ffer_len, unsign
c500: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 20  ed char oid[3]) 
c510: 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
c520: 20 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20   cmd[] = {0x5C, 
c530: 30 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30  0x03, 0x00, 0x00
c540: 2c 20 30 78 30 30 7d 3b 0a 09 75 6e 73 69 67 6e  , 0x00};..unsign
c550: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f  ed char *buffer_
c560: 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f  p;..size_t init_
c570: 62 75 66 66 65 72 5f 6c 65 6e 2c 20 73 69 7a 65  buffer_len, size
c580: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
c590: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
c5a0: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
c5b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
c5c0: 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75  ed.");...init_bu
c5d0: 66 66 65 72 5f 6c 65 6e 20 3d 20 62 75 66 66 65  ffer_len = buffe
c5e0: 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b 32 5d 20  r_len;...cmd[2] 
c5f0: 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d 64 5b 33  = oid[0];..cmd[3
c600: 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09 63 6d 64  ] = oid[1];..cmd
c610: 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b 0a 0a 09  [4] = oid[2];...
c620: 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64 69 63 61  /* 256 to indica
c630: 74 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 6d  te the largest m
c640: 65 73 73 61 67 65 20 73 69 7a 65 20 2d 2d 20 6e  essage size -- n
c650: 6f 74 20 63 6c 65 61 72 20 69 66 20 74 68 69 73  ot clear if this
c660: 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 20   will work with 
c670: 61 6c 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  all messages */.
c680: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
c690: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
c6a0: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
c6b0: 53 4f 37 38 31 36 2c 20 4e 49 53 54 53 50 38 30  SO7816, NISTSP80
c6c0: 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 54  0_73_3_INSTR_GET
c6d0: 5f 44 41 54 41 2c 20 30 78 33 46 2c 20 30 78 46  _DATA, 0x3F, 0xF
c6e0: 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20  F, sizeof(cmd), 
c6f0: 63 6d 64 2c 20 32 35 36 2c 20 26 72 65 73 70 63  cmd, 256, &respc
c700: 6f 64 65 2c 20 62 75 66 66 65 72 2c 20 26 62 75  ode, buffer, &bu
c710: 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  ffer_len);...if 
c720: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
c730: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
c740: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c750: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
c760: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
c770: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
c780: 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  ffer");....retur
c790: 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  n(cackey_get_dat
c7a0: 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20  a(slot, buffer, 
c7b0: 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c  init_buffer_len,
c7c0: 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09 69 66 20   oid));..}...if 
c7d0: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
c7e0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
c7f0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c800: 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73  PRINTF("cackey_s
c810: 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65  end_apdu() faile
c820: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
c830: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
c840: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 23 69  turn(-1);..}..#i
c850: 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
c860: 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
c870: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
c880: 69 66 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3e  if (buffer_len >
c890: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
c8a0: 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  X) {...CACKEY_DE
c8b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64  BUG_PRINTF("Read
c8c0: 20 62 79 74 65 73 20 28 62 75 66 66 65 72 5f 6c   bytes (buffer_l
c8d0: 65 6e 29 20 65 78 63 65 65 64 73 20 6d 61 78 69  en) exceeds maxi
c8e0: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
c8f0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
c900: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 62 75 66   (max = %li, buf
c910: 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c  fer_len = %lu)",
c920: 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53   (long) _POSIX_S
c930: 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67  SIZE_MAX, (unsig
c940: 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72  ned long) buffer
c950: 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _len);....return
c960: 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69  (-1);..}.#  endi
c970: 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20 28 62  f.#endif...if (b
c980: 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32 29 20 7b  uffer_len < 2) {
c990: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c9a0: 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54  PRINTF("APDU GET
c9b0: 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20 25   DATA returned %
c9c0: 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  lu bytes, which 
c9d0: 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72  is too short for
c9e0: 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f   a BER-TLV respo
c9f0: 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  nse", (unsigned 
ca00: 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f 6c 65 6e  long) buffer_len
ca10: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
ca20: 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d 20 62 75  ;..}...size = bu
ca30: 66 66 65 72 5f 6c 65 6e 3b 0a 09 62 75 66 66 65  ffer_len;..buffe
ca40: 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  r_p = cackey_rea
ca50: 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66  d_bertlv_tag(buf
ca60: 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
ca70: 2c 20 30 78 35 33 2c 20 4e 55 4c 4c 2c 20 26 73  , 0x53, NULL, &s
ca80: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 62 75 66 66  ize);...if (buff
ca90: 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  er_p == NULL) {.
caa0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
cab0: 52 49 4e 54 46 28 22 54 61 67 20 64 65 63 6f 64  RINTF("Tag decod
cac0: 69 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ing failed, retu
cad0: 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22  rning in error."
cae0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
caf0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
cb00: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 47 45  BUG_PRINTBUF("GE
cb10: 54 20 44 41 54 41 20 72 65 73 75 6c 74 22 2c 20  T DATA result", 
cb20: 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 0a  buffer, size);..
cb30: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cb40: 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
cb50: 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 61 64  in success, read
cb60: 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e   %lu bytes", (un
cb70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
cb80: 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28 73 69 7a  e);...return(siz
cb90: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  e);.}../*. * SYN
cba0: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73 69  POSIS. *     ssi
cbb0: 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64  ze_t cackey_read
cbc0: 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20 63  _buffer(struct c
cbd0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
cbe0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
cbf0: 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20  *buffer, size_t 
cc00: 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20  count, unsigned 
cc10: 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a  char t_or_v, siz
cc20: 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73  e_t initial_offs
cc30: 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  et);. *. * ARGUM
cc40: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
cc50: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cc60: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
cc70: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
cc80: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
cc90: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
cca0: 20 2a 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20   *buffer. *     
ccb0: 20 20 20 20 5b 4f 55 54 5d 20 42 75 66 66 65 72      [OUT] Buffer
ccc0: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
ccd0: 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20 20 20 20  t count. *      
cce0: 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74     Number of byt
ccf0: 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  es to attempt to
cd00: 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20 20 20   read. *. *     
cd10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f  unsigned char t_
cd20: 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20 20 20 20  or_v. *         
cd30: 53 65 6c 65 63 74 20 74 68 65 20 54 2d 62 75 66  Select the T-buf
cd40: 66 65 72 20 28 30 31 29 20 6f 72 20 56 2d 62 75  fer (01) or V-bu
cd50: 66 66 65 72 20 28 30 32 29 20 74 6f 20 72 65 61  ffer (02) to rea
cd60: 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a 20 2a 20  d from.  . *. * 
cd70: 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74 69      size_t initi
cd80: 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20 20  al_offset. *    
cd90: 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68 65       Specify the
cda0: 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
cdb0: 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a 20   the read from. 
cdc0: 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  *. *. * RETURN V
cdd0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73  ALUE. *     This
cde0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
cdf0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
ce00: 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
ce10: 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72  ead, or -1 on er
ce20: 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  ror.. *. * NOTES
ce30: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
ce40: 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
ce50: 5f 74 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62  _t cackey_read_b
ce60: 75 66 66 65 72 28 73 74 72 75 63 74 20 63 61 63  uffer(struct cac
ce70: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
ce80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
ce90: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
cea0: 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  unt, unsigned ch
ceb0: 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f  ar t_or_v, size_
cec0: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
ced0: 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
cee0: 61 72 20 2a 69 6e 69 74 5f 62 75 66 66 65 72 3b  ar *init_buffer;
cef0: 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63 6f  ..size_t init_co
cf00: 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  unt;..size_t ini
cf10: 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t_initial_offset
cf20: 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73 65  ;...size_t offse
cf30: 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66 66 73 65  t = 0, max_offse
cf40: 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a 09 75  t, max_count;..u
cf50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6d 64  nsigned char cmd
cf60: 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  [2];..uint16_t r
cf70: 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65  espcode;..int se
cf80: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
cf90: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
cfa0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74  alled.");...init
cfb0: 5f 62 75 66 66 65 72 20 3d 20 62 75 66 66 65 72  _buffer = buffer
cfc0: 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20  ;..init_count = 
cfd0: 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f 69 6e 69  count;..init_ini
cfe0: 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d 20 69 6e  tial_offset = in
cff0: 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09  itial_offset;...
d000: 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20 63 6f 75  max_offset = cou
d010: 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  nt;..max_count =
d020: 20 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55   CACKEY_APDU_MTU
d030: 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f 76 20 21  ;...if (t_or_v !
d040: 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76 20 21 3d  = 1 && t_or_v !=
d050: 20 32 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   2) {...CACKEY_D
d060: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
d070: 61 6c 69 64 20 54 20 6f 72 20 56 20 70 61 72 61  alid T or V para
d080: 6d 65 74 65 72 20 73 70 65 63 69 66 69 65 64 2c  meter specified,
d090: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d0a0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
d0b0: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 63 6d 64  rn(-1);..}...cmd
d0c0: 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b 0a 0a 09  [0] = t_or_v;...
d0d0: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 09 69 66  while (1) {...if
d0e0: 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d 61 78 5f   (offset >= max_
d0f0: 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43  offset) {....CAC
d100: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d110: 28 22 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61  ("Buffer too sma
d120: 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 77 68  ll, returning wh
d130: 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22 29 3b 0a  at we got...");.
d140: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
d150: 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 6f 66  ..count = max_of
d160: 66 73 65 74 20 2d 20 6f 66 66 73 65 74 3b 0a 09  fset - offset;..
d170: 09 69 66 20 28 63 6f 75 6e 74 20 3e 20 6d 61 78  .if (count > max
d180: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 63 6f 75  _count) {....cou
d190: 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 3b 0a  nt = max_count;.
d1a0: 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d 20 3d 20  ..}....cmd[1] = 
d1b0: 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e 64 5f 72  count;....send_r
d1c0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d1d0: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d1e0: 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50  S_CLASS_GLOBAL_P
d1f0: 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49  LATFORM, GSCIS_I
d200: 4e 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52  NSTR_READ_BUFFER
d210: 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73  , ((initial_offs
d220: 65 74 20 2b 20 6f 66 66 73 65 74 29 20 3e 3e 20  et + offset) >> 
d230: 38 29 20 26 20 30 78 66 66 2c 20 28 69 6e 69 74  8) & 0xff, (init
d240: 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66  ial_offset + off
d250: 73 65 74 29 20 26 20 30 78 66 66 2c 20 73 69 7a  set) & 0xff, siz
d260: 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64 2c 20 30  eof(cmd), cmd, 0
d270: 78 30 30 2c 20 26 72 65 73 70 63 6f 64 65 2c 20  x00, &respcode, 
d280: 62 75 66 66 65 72 20 2b 20 6f 66 66 73 65 74 2c  buffer + offset,
d290: 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09 69 66 20   &count);....if 
d2a0: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
d2b0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
d2c0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
d2d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
d2e0: 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c   Sending failed,
d2f0: 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62   retrying read b
d300: 75 66 66 65 72 22 29 3b 0a 0a 09 09 09 72 65 74  uffer");.....ret
d310: 75 72 6e 28 63 61 63 6b 65 79 5f 72 65 61 64 5f  urn(cackey_read_
d320: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 69 6e 69  buffer(slot, ini
d330: 74 5f 62 75 66 66 65 72 2c 20 69 6e 69 74 5f 63  t_buffer, init_c
d340: 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c 20 69 6e  ount, t_or_v, in
d350: 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  it_initial_offse
d360: 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  t));...}....if (
d370: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
d380: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
d390: 09 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20  ...if (respcode 
d3a0: 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a 09 09 09  == 0x6A86) {....
d3b0: 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e 74 20 3d  .if (max_count =
d3c0: 3d 20 31 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 1) {......brea
d3d0: 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 6d 61  k;.....}......ma
d3e0: 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f  x_count = max_co
d3f0: 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09 09 63 6f  unt / 2;......co
d400: 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09  ntinue;....}....
d410: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d420: 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e  INTF("cackey_sen
d430: 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c  d_apdu() failed,
d440: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
d450: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 72 65 74  ilure");.....ret
d460: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
d470: 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b  offset += count;
d480: 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  ....if (count < 
d490: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  max_count) {....
d4a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d4b0: 4e 54 46 28 22 53 68 6f 72 74 20 72 65 61 64 20  NTF("Short read 
d4c0: 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69 2c 20 63  -- count = %i, c
d4d0: 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20 28 69 6e  md[1] = %i", (in
d4e0: 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  t) count, (int) 
d4f0: 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09 62 72 65  cmd[1]);.....bre
d500: 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64  ak;...}..}..#ifd
d510: 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f  ef CACKEY_PARANO
d520: 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53  ID.#  ifdef _POS
d530: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66  IX_SSIZE_MAX..if
d540: 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53 49   (offset > _POSI
d550: 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
d560: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
d570: 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78 63  INTF("Offset exc
d580: 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
d590: 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
d5a0: 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
d5b0: 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20 25   %li, offset = %
d5c0: 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
d5d0: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
d5e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
d5f0: 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75 72  ffset);....retur
d600: 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
d610: 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b  if.#endif...CACK
d620: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d630: 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75  "Returning in su
d640: 63 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20  ccess, read %lu 
d650: 62 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65  bytes", (unsigne
d660: 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b  d long) offset);
d670: 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66 73 65 74  ...return(offset
d680: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
d690: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
d6a0: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
d6b0: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75  lect_applet(stru
d6c0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d6d0: 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
d6e0: 68 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74  har *aid, size_t
d6f0: 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a   aid_len);. *. *
d700: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
d710: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
d720: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
d730: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
d740: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
d750: 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65  *. *     unsigne
d760: 64 20 63 68 61 72 20 2a 61 69 64 0a 20 2a 20 20  d char *aid. *  
d770: 20 20 20 20 20 20 20 42 75 66 66 65 72 20 63 6f         Buffer co
d780: 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c 65 74 20  ntaining Applet 
d790: 49 44 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a  ID to select. *.
d7a0: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 61 69   *     size_t ai
d7b0: 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  d_len. *        
d7c0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
d7d0: 20 69 6e 20 74 68 65 20 22 61 69 64 22 20 28 41   in the "aid" (A
d7e0: 70 70 6c 65 74 20 49 44 29 20 70 61 72 61 6d 65  pplet ID) parame
d7f0: 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  ter. *. * RETURN
d800: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
d810: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
d820: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
d830: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
d840: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
d850: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
d860: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
d870: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
d880: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
d890: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
d8a0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
d8b0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
d8c0: 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73  ned char *aid, s
d8d0: 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29 20 7b  ize_t aid_len) {
d8e0: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
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 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
d910: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
d920: 5f 50 52 49 4e 54 42 55 46 28 22 53 65 6c 65 63  _PRINTBUF("Selec
d930: 74 69 6e 67 20 61 70 70 6c 65 74 3a 22 2c 20 61  ting applet:", a
d940: 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b 0a 0a 09  id, aid_len);...
d950: 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
d960: 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
d970: 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
d980: 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
d990: 54 52 5f 53 45 4c 45 43 54 2c 20 47 53 43 49 53  TR_SELECT, GSCIS
d9a0: 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54 5f 41 50  _PARAM_SELECT_AP
d9b0: 50 4c 45 54 2c 20 30 78 30 30 2c 20 61 69 64 5f  PLET, 0x00, aid_
d9c0: 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30 30 2c 20  len, aid, 0x00, 
d9d0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
d9e0: 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  );...if (send_re
d9f0: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
da00: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 43 41  _E_RETRY) {...CA
da10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
da20: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
da30: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
da40: 20 73 65 6c 65 63 74 20 61 70 70 6c 65 74 22 29   select applet")
da50: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63 61 63 6b  ;....return(cack
da60: 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74  ey_select_applet
da70: 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61 69 64 5f  (slot, aid, aid_
da80: 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  len));..}...if (
da90: 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
daa0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
dab0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
dac0: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
dad0: 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c 20 72 65   open applet, re
dae0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
daf0: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
db00: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
db10: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43  NERIC);..}...CAC
db20: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
db30: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73  ("Successfully s
db40: 65 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a  elected file");.
db50: 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
db60: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f  PCSC_S_OK);.}../
db70: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
db80: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
db90: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
dba0: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
dbb0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
dbc0: 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a 0a 20 2a  t16_t ef);. *. *
dbd0: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
dbe0: 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f    struct cackey_
dbf0: 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20  slot *slot. *   
dc00: 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65        Slot to se
dc10: 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20  nd commands to. 
dc20: 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74 31 36 5f  *. *     uint16_
dc30: 74 20 65 66 0a 20 2a 20 20 20 20 20 20 20 20 20  t ef. *         
dc40: 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c 65 20 74  Elemental File t
dc50: 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 52  o select. *. * R
dc60: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
dc70: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53     CACKEY_PCSC_S
dc80: 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73  _OK         On s
dc90: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
dca0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
dcb0: 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a  RIC    On error.
dcc0: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
dcd0: 20 20 20 54 68 69 73 20 73 65 6c 65 63 74 73 20     This selects 
dce0: 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79 20 46 69  an Elementary Fi
dcf0: 6c 65 20 28 45 46 29 20 75 6e 64 65 72 20 74 68  le (EF) under th
dd00: 65 20 63 75 72 72 65 6e 74 6c 79 20 73 65 6c 65  e currently sele
dd10: 63 74 65 64 0a 20 2a 20 20 20 20 20 44 65 64 69  cted. *     Dedi
dd20: 63 61 74 65 64 20 46 69 6c 65 20 28 44 46 29 0a  cated File (DF).
dd30: 20 2a 0a 20 2a 20 20 20 20 20 54 79 70 69 63 61   *. *     Typica
dd40: 6c 6c 79 20 74 68 69 73 20 69 73 20 63 61 6c 6c  lly this is call
dd50: 65 64 20 61 66 74 65 72 20 73 65 6c 65 63 74 69  ed after selecti
dd60: 6e 67 20 74 68 65 20 63 6f 72 72 65 63 74 20 41  ng the correct A
dd70: 70 70 6c 65 74 20 28 75 73 69 6e 67 0a 20 2a 20  pplet (using. * 
dd80: 20 20 20 20 63 61 63 6b 65 79 5f 73 65 6c 65 63      cackey_selec
dd90: 74 5f 61 70 70 6c 65 74 29 20 66 6f 72 20 56 4d  t_applet) for VM
dda0: 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f 0a 73 74   cards. *. */.st
ddb0: 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20  atic cackey_ret 
ddc0: 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
ddd0: 6c 65 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  le(struct cackey
dde0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 69 6e  _slot *slot, uin
ddf0: 74 31 36 5f 74 20 65 66 29 20 7b 0a 09 75 6e 73  t16_t ef) {..uns
de00: 69 67 6e 65 64 20 63 68 61 72 20 66 69 64 5f 62  igned char fid_b
de10: 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73 65 6e 64  uf[2];..int send
de20: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
de30: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
de40: 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20 4f 70 65  led.");.../* Ope
de50: 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74 61 72 79  n the elementary
de60: 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64 5f 62 75   file */..fid_bu
de70: 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e 20 38 29  f[0] = (ef >> 8)
de80: 20 26 20 30 78 66 66 3b 0a 09 66 69 64 5f 62 75   & 0xff;..fid_bu
de90: 66 5b 31 5d 20 3d 20 65 66 20 26 20 30 78 66 66  f[1] = ef & 0xff
dea0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
deb0: 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69  _PRINTF("Selecti
dec0: 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c 78 22 2c  ng file: %04lx",
ded0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
dee0: 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74   ef);...send_ret
def0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
df00: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
df10: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
df20: 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43  SCIS_INSTR_SELEC
df30: 54 2c 20 30 78 30 32 2c 20 30 78 30 43 2c 20 73  T, 0x02, 0x0C, s
df40: 69 7a 65 6f 66 28 66 69 64 5f 62 75 66 29 2c 20  izeof(fid_buf), 
df50: 66 69 64 5f 62 75 66 2c 20 30 78 30 30 2c 20 4e  fid_buf, 0x00, N
df60: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
df70: 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ;..if (send_ret 
df80: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
df90: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
dfa0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
dfb0: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 66 69 6c  iled to open fil
dfc0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
dfd0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
dfe0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
dff0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
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 53 75 63 63 65 73 73 66 75  RINTF("Successfu
e020: 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c  lly selected fil
e030: 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  e");...return(CA
e040: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
e050: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53  .}../*. * SYNPOS
e060: 49 53 0a 20 2a 20 20 20 20 20 76 6f 69 64 20 63  IS. *     void c
e070: 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73  ackey_free_tlv(s
e080: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
e090: 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 3b 0a  _entity *root);.
e0a0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
e0b0: 20 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61   *     struct ca
e0c0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
e0d0: 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20 20 20 20  *root. *        
e0e0: 20 52 6f 6f 74 20 6f 66 20 74 68 65 20 54 4c 56   Root of the TLV
e0f0: 20 6c 69 73 74 20 74 6f 20 73 74 61 72 74 20 66   list to start f
e100: 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20 52 45 54  reeing. *. * RET
e110: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
e120: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
e130: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
e140: 6e 63 74 69 6f 6e 20 66 72 65 65 73 20 74 68 65  nction frees the
e150: 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c 69 73 74   TLV linked list
e160: 65 64 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d  ed returned from
e170: 0a 20 2a 20 20 20 20 20 22 63 61 63 6b 65 79 5f  . *     "cackey_
e180: 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a 20 2a 2f  read_tlv". *. */
e190: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 61 63  .static void cac
e1a0: 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 73 74 72  key_free_tlv(str
e1b0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
e1c0: 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20 7b 0a 09  ntity *root) {..
e1d0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
e1e0: 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 2c 20  v_entity *curr, 
e1f0: 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28 72 6f 6f  *next;...if (roo
e200: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  t == NULL) {...r
e210: 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20  eturn;..}...for 
e220: 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b 20 63 75  (curr = root; cu
e230: 72 72 3b 20 63 75 72 72 20 3d 20 6e 65 78 74 29  rr; curr = next)
e240: 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63 75 72 72   {...next = curr
e250: 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73 77 69 74  ->_next;....swit
e260: 63 68 20 28 63 75 72 72 2d 3e 74 61 67 29 20 7b  ch (curr->tag) {
e270: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
e280: 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09  AG_ACR_TABLE:...
e290: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
e2a0: 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09  CERTIFICATE:....
e2b0: 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65  .if (curr->value
e2c0: 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75  ) {......free(cu
e2d0: 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09 09 09 09  rr->value);.....
e2e0: 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
e2f0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
e300: 41 52 44 55 52 4c 3a 0a 09 09 09 09 69 66 20 28  ARDURL:.....if (
e310: 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
e320: 75 72 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65  url) {......free
e330: 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  (curr->value_car
e340: 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a 09 09 09  durl);.....}....
e350: 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 66  .break;...}....f
e360: 72 65 65 28 63 75 72 72 29 3b 0a 09 7d 0a 0a 09  ree(curr);..}...
e370: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
e380: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
e390: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
e3a0: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
e3b0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
e3c0: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
e3d0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
e3e0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
e3f0: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
e400: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 61 63  _tlv_entity *cac
e410: 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 74 72  key_read_tlv(str
e420: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
e430: 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *slot) {..struct
e440: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
e450: 74 79 20 2a 63 75 72 72 5f 65 6e 74 69 74 79 2c  ty *curr_entity,
e460: 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c 2c 20 2a   *root = NULL, *
e470: 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 75 6e  last = NULL;..un
e480: 73 69 67 6e 65 64 20 63 68 61 72 20 74 6c 65 6e  signed char tlen
e490: 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c 5f 62 75  _buf[2], tval_bu
e4a0: 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61 6c 3b 0a  f[1024], *tval;.
e4b0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 76  .unsigned char v
e4c0: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76 76 61 6c  len_buf[2], vval
e4d0: 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a 76 76 61  _buf[8192], *vva
e4e0: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  l;..unsigned cha
e4f0: 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75 6e 73 69  r *tmpbuf;..unsi
e500: 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70 62 75 66  gned long tmpbuf
e510: 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 74 6c  len;..ssize_t tl
e520: 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73 69 7a 65  en, vlen;..ssize
e530: 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69  _t read_ret;..si
e540: 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74 20 3d 20  ze_t offset_t = 
e550: 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d 20 30 3b  0, offset_v = 0;
e560: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
e570: 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  tag;..size_t len
e580: 67 74 68 3b 0a 23 69 66 64 65 66 20 48 41 56 45  gth;.#ifdef HAVE
e590: 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e 63 6f 6d  _LIBZ..int uncom
e5a0: 70 72 65 73 73 5f 72 65 74 3b 0a 23 65 6e 64 69  press_ret;.#endi
e5b0: 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  f...CACKEY_DEBUG
e5c0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
e5d0: 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  ");...read_ret =
e5e0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
e5f0: 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65 6e 5f 62  fer(slot, tlen_b
e600: 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c 65 6e 5f  uf, sizeof(tlen_
e610: 62 75 66 29 2c 20 31 2c 20 6f 66 66 73 65 74 5f  buf), 1, offset_
e620: 74 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  t);..if (read_re
e630: 74 20 21 3d 20 73 69 7a 65 6f 66 28 74 6c 65 6e  t != sizeof(tlen
e640: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
e650: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e660: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
e670: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e680: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
e690: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c 65 6e 20  ULL);..}...tlen 
e6a0: 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (tlen_buf[1] <
e6b0: 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62 75 66 5b  < 8) | tlen_buf[
e6c0: 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d  0];...read_ret =
e6d0: 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66   cackey_read_buf
e6e0: 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65 6e 5f 62  fer(slot, vlen_b
e6f0: 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c 65 6e 5f  uf, sizeof(vlen_
e700: 62 75 66 29 2c 20 32 2c 20 6f 66 66 73 65 74 5f  buf), 2, offset_
e710: 76 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65  v);..if (read_re
e720: 74 20 21 3d 20 73 69 7a 65 6f 66 28 76 6c 65 6e  t != sizeof(vlen
e730: 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45  _buf)) {...CACKE
e740: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e750: 52 65 61 64 20 66 61 69 6c 65 64 2c 20 72 65 74  Read failed, ret
e760: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
e770: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  e");....return(N
e780: 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c 65 6e 20  ULL);..}...vlen 
e790: 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31 5d 20 3c  = (vlen_buf[1] <
e7a0: 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62 75 66 5b  < 8) | vlen_buf[
e7b0: 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  0];...CACKEY_DEB
e7c0: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 4c  UG_PRINTF("Tag L
e7d0: 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20 56 61 6c  ength = %lu, Val
e7e0: 75 65 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 22  ue Length = %lu"
e7f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e800: 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65  ) tlen, (unsigne
e810: 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29 3b 0a 0a  d long) vlen);..
e820: 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20 32 3b 0a  .offset_t += 2;.
e830: 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20 32 3b 0a  .offset_v += 2;.
e840: 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20 73 69 7a  ..if (tlen > siz
e850: 65 6f 66 28 74 76 61 6c 5f 62 75 66 29 29 20 7b  eof(tval_buf)) {
e860: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e870: 50 52 49 4e 54 46 28 22 54 61 67 20 6c 65 6e 67  PRINTF("Tag leng
e880: 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c  th is too large,
e890: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
e8a0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
e8b0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
e8c0: 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a 65 6f 66  f (vlen > sizeof
e8d0: 28 76 76 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09  (vval_buf)) {...
e8e0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e8f0: 4e 54 46 28 22 56 61 6c 75 65 20 6c 65 6e 67 74  NTF("Value lengt
e900: 68 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 2c 20  h is too large, 
e910: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
e920: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
e930: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
e940: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
e950: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
e960: 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74 6c 65 6e  , tval_buf, tlen
e970: 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a  , 1, offset_t);.
e980: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
e990: 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   tlen) {...CACKE
e9a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e9b0: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
e9c0: 6e 74 69 72 65 20 54 2d 62 75 66 66 65 72 2c 20  ntire T-buffer, 
e9d0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
e9e0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
e9f0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
ea00: 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f  ad_ret = cackey_
ea10: 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74  read_buffer(slot
ea20: 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76 6c 65 6e  , vval_buf, vlen
ea30: 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a  , 2, offset_v);.
ea40: 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d  .if (read_ret !=
ea50: 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41 43 4b 45   vlen) {...CACKE
ea60: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ea70: 55 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 65  Unable to read e
ea80: 6e 74 69 72 65 20 56 2d 62 75 66 66 65 72 2c 20  ntire V-buffer, 
ea90: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
eaa0: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
eab0: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 76  n(NULL);..}...tv
eac0: 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66 3b 0a 09  al = tval_buf;..
ead0: 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62 75 66 3b  vval = vval_buf;
eae0: 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e 20 3e 20  ..while (tlen > 
eaf0: 30 20 26 26 20 76 6c 65 6e 20 3e 20 30 29 20 7b  0 && vlen > 0) {
eb00: 0a 09 09 74 61 67 20 3d 20 2a 74 76 61 6c 3b 0a  ...tag = *tval;.
eb10: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74 6c 65 6e  ..tval++;...tlen
eb20: 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74 76 61 6c  --;....if (*tval
eb30: 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09 09 09 6c   == 0xff) {....l
eb40: 65 6e 67 74 68 20 3d 20 28 74 76 61 6c 5b 32 5d  ength = (tval[2]
eb50: 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c 5b 31 5d   << 8) | tval[1]
eb60: 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20 33 3b 0a  ;....tval += 3;.
eb70: 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b 0a 09 09  ...tlen -= 3;...
eb80: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 65 6e 67  } else {....leng
eb90: 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 09 74  th = *tval;....t
eba0: 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65 6e 2d 2d  val++;....tlen--
ebb0: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
ebc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
ebd0: 67 3a 20 25 73 20 28 25 30 32 78 29 22 2c 20 43  g: %s (%02x)", C
ebe0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
ebf0: 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74 61 67 29  _TAG_TO_STR(tag)
ec00: 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
ec10: 20 74 61 67 29 3b 0a 09 09 43 41 43 4b 45 59 5f   tag);...CACKEY_
ec20: 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
ec30: 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c 2c 20 6c  Value:", vval, l
ec40: 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75 72 72 5f  ength);....curr_
ec50: 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09  entity = NULL;..
ec60: 09 73 77 69 74 63 68 20 28 74 61 67 29 20 7b 0a  .switch (tag) {.
ec70: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
ec80: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 63  G_CARDURL:.....c
ec90: 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c  urr_entity = mal
eca0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72  loc(sizeof(*curr
ecb0: 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 63  _entity));.....c
ecc0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
ecd0: 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d 61 6c 6c  e_cardurl = mall
ece0: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
ecf0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
ed00: 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09 09 6d 65  rdurl));......me
ed10: 6d 63 70 79 28 63 75 72 72 5f 65 6e 74 69 74 79  mcpy(curr_entity
ed20: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
ed30: 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35 29 3b 0a  >rid, vval, 5);.
ed40: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
ed50: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
ed60: 61 70 70 74 79 70 65 20 3d 20 76 76 61 6c 5b 35  apptype = vval[5
ed70: 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ];.....curr_enti
ed80: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
ed90: 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d 20 28 76  l->objectid = (v
eda0: 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20 7c 20 76  val[6] << 8) | v
edb0: 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63 75 72 72  val[7];.....curr
edc0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
edd0: 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3d 20  ardurl->appid = 
ede0: 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38 29 20 7c  (vval[8] << 8) |
edf0: 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09 09 09 63   vval[9];......c
ee00: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
ee10: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
ee20: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
ee30: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
ee40: 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f  ;....case GSCIS_
ee50: 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a 0a 09  TAG_ACR_TABLE:..
ee60: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d  ...curr_entity =
ee70: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
ee80: 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09  curr_entity));..
ee90: 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c  ...tmpbuf = mall
eea0: 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09  oc(length);.....
eeb0: 09 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20  .memcpy(tmpbuf, 
eec0: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
eed0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
eee0: 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09  >tag = tag;.....
eef0: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e  curr_entity->len
ef00: 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09  gth = length;...
ef10: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
ef20: 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09  alue = tmpbuf;..
ef30: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
ef40: 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  _next = NULL;...
ef50: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
ef60: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  e GSCIS_TAG_CERT
ef70: 49 46 49 43 41 54 45 3a 0a 09 09 09 09 63 75 72  IFICATE:.....cur
ef80: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
ef90: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
efa0: 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66 64 65 66  ntity));..#ifdef
efb0: 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09 09 09 74   HAVE_LIBZ.....t
efc0: 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74  mpbuflen = lengt
efd0: 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d 70 62 75  h * 2;.....tmpbu
efe0: 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
eff0: 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75 6e 63 6f  flen);......unco
f000: 6d 70 72 65 73 73 5f 72 65 74 20 3d 20 75 6e 63  mpress_ret = unc
f010: 6f 6d 70 72 65 73 73 28 74 6d 70 62 75 66 2c 20  ompress(tmpbuf, 
f020: 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76 76 61 6c  &tmpbuflen, vval
f030: 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 69  , length);.....i
f040: 66 20 28 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  f (uncompress_re
f050: 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 09 09 09  t != Z_OK) {....
f060: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
f070: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
f080: 20 64 65 63 6f 6d 70 72 65 73 73 2c 20 75 6e 63   decompress, unc
f090: 6f 6d 70 72 65 73 73 28 29 20 72 65 74 75 72 6e  ompress() return
f0a0: 65 64 20 25 69 20 2d 2d 20 72 65 73 6f 72 74 69  ed %i -- resorti
f0b0: 6e 67 20 74 6f 20 64 69 72 65 63 74 20 63 6f 70  ng to direct cop
f0c0: 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72  y", uncompress_r
f0d0: 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d 70 62 75  et);.......tmpbu
f0e0: 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09  flen = length;..
f0f0: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
f100: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
f110: 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  ;.....}......CAC
f120: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
f130: 55 46 28 22 44 65 63 6f 6d 70 72 65 73 73 65 64  UF("Decompressed
f140: 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74   to:", tmpbuf, t
f150: 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65 6c 73 65  mpbuflen);.#else
f160: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f170: 47 5f 50 52 49 4e 54 46 28 22 4d 69 73 73 69 6e  G_PRINTF("Missin
f180: 67 20 5a 4c 49 42 20 53 75 70 70 6f 72 74 2c 20  g ZLIB Support, 
f190: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65  this certificate
f1a0: 20 69 73 20 6c 69 6b 65 6c 79 20 75 73 65 6c 65   is likely usele
f1b0: 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09 09 74 6d  ss...");......tm
f1c0: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
f1d0: 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70  ;.....memcpy(tmp
f1e0: 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74  buf, vval, lengt
f1f0: 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 09 09 09  h);.#endif......
f200: 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67  curr_entity->tag
f210: 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72   = tag;.....curr
f220: 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20  _entity->length 
f230: 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 09 09  = tmpbuflen;....
f240: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
f250: 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b 0a 09 09  lue = tmpbuf;...
f260: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
f270: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
f280: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
f290: 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31   GSCIS_TAG_PKCS1
f2a0: 35 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  5:.....curr_enti
f2b0: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
f2c0: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
f2d0: 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  );......curr_ent
f2e0: 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a  ity->tag = tag;.
f2f0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f300: 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d 20 76 76  >value_byte = vv
f310: 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75 72 72 5f  al[0];.....curr_
f320: 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20  entity->_next = 
f330: 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b  NULL;......break
f340: 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c 20 2b 3d  ;...}....vval +=
f350: 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c 65 6e 20   length;...vlen 
f360: 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09 09 69 66  -= length;....if
f370: 20 28 63 75 72 72 5f 65 6e 74 69 74 79 20 21 3d   (curr_entity !=
f380: 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66 20 28   NULL) {....if (
f390: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
f3a0: 09 09 09 09 72 6f 6f 74 20 3d 20 63 75 72 72 5f  ....root = curr_
f3b0: 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09  entity;....}....
f3c0: 09 69 66 20 28 6c 61 73 74 20 21 3d 20 4e 55 4c  .if (last != NUL
f3d0: 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74 2d 3e 5f  L) {.....last->_
f3e0: 6e 65 78 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  next = curr_enti
f3f0: 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09 6c 61 73  ty;....}.....las
f400: 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b  t = curr_entity;
f410: 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ...}..}...return
f420: 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  (root);.}../*. *
f430: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
f440: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
f450: 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
f460: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
f470: 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
f480: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
f490: 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
f4a0: 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66  ic void cackey_f
f4b0: 72 65 65 5f 63 65 72 74 73 28 73 74 72 75 63 74  ree_certs(struct
f4c0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
f4d0: 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69  ntity *start, si
f4e0: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69 6e 74 20  ze_t count, int 
f4f0: 66 72 65 65 5f 73 74 61 72 74 29 20 7b 0a 09 73  free_start) {..s
f500: 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20  ize_t idx;...if 
f510: 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  (start == NULL) 
f520: 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
f530: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
f540: 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b  dx < count; idx+
f550: 2b 29 20 7b 0a 09 09 69 66 20 28 73 74 61 72 74  +) {...if (start
f560: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
f570: 65 29 20 7b 0a 09 09 09 66 72 65 65 28 73 74 61  e) {....free(sta
f580: 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt[idx].certific
f590: 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ate);...}..}...i
f5a0: 66 20 28 66 72 65 65 5f 73 74 61 72 74 29 20 7b  f (free_start) {
f5b0: 0a 09 09 66 72 65 65 28 73 74 61 72 74 29 3b 0a  ...free(start);.
f5c0: 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a  .}...return;.}..
f5d0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
f5e0: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
f5f0: 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f 70 79 5f  ty *cackey_copy_
f600: 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63  certs(struct cac
f610: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
f620: 79 20 2a 64 65 73 74 2c 20 73 74 72 75 63 74 20  y *dest, struct 
f630: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f640: 74 69 74 79 20 2a 73 74 61 72 74 2c 20 73 69 7a  tity *start, siz
f650: 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a 09 73 69  e_t count) {..si
f660: 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69 66 20 28  ze_t idx;...if (
f670: 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  start == NULL) {
f680: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
f690: 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73 74 20 3d  ..}...if (dest =
f6a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64 65 73 74  = NULL) {...dest
f6b0: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
f6c0: 28 2a 64 65 73 74 29 20 2a 20 63 6f 75 6e 74 29  (*dest) * count)
f6d0: 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
f6e0: 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74  = 0; idx < count
f6f0: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 64 65 73  ; idx++) {...des
f700: 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70 65 20 3d  t[idx].id_type =
f710: 20 73 74 61 72 74 5b 69 64 78 5d 2e 69 64 5f 74   start[idx].id_t
f720: 79 70 65 3b 0a 0a 09 09 73 77 69 74 63 68 20 28  ype;....switch (
f730: 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70  dest[idx].id_typ
f740: 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43  e) {....case CAC
f750: 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
f760: 0a 09 09 09 09 6d 65 6d 63 70 79 28 64 65 73 74  .....memcpy(dest
f770: 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61  [idx].card.cac.a
f780: 70 70 6c 65 74 2c 20 73 74 61 72 74 5b 69 64 78  pplet, start[idx
f790: 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ].card.cac.apple
f7a0: 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69  t, sizeof(dest[i
f7b0: 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70 70  dx].card.cac.app
f7c0: 6c 65 74 29 29 3b 0a 09 09 09 09 64 65 73 74 5b  let));.....dest[
f7d0: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69  idx].card.cac.fi
f7e0: 6c 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  le = start[idx].
f7f0: 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 3b 0a 09  card.cac.file;..
f800: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
f810: 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
f820: 5f 50 49 56 3a 0a 09 09 09 09 64 65 73 74 5b 69  _PIV:.....dest[i
f830: 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79  dx].card.piv.key
f840: 5f 69 64 20 3d 20 73 74 61 72 74 5b 69 64 78 5d  _id = start[idx]
f850: 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  .card.piv.key_id
f860: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
f870: 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
f880: 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09  YPE_CERT_ONLY:..
f890: 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09  ...break;...}...
f8a0: 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
f8b0: 69 63 61 74 65 5f 6c 65 6e 20 3d 20 73 74 61 72  icate_len = star
f8c0: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
f8d0: 74 65 5f 6c 65 6e 3b 0a 09 09 64 65 73 74 5b 69  te_len;...dest[i
f8e0: 64 78 5d 2e 6b 65 79 73 69 7a 65 20 3d 20 73 74  dx].keysize = st
f8f0: 61 72 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65  art[idx].keysize
f900: 3b 0a 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63  ;....dest[idx].c
f910: 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c  ertificate = mal
f920: 6c 6f 63 28 64 65 73 74 5b 69 64 78 5d 2e 63 65  loc(dest[idx].ce
f930: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
f940: 09 09 6d 65 6d 63 70 79 28 64 65 73 74 5b 69 64  ..memcpy(dest[id
f950: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20  x].certificate, 
f960: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
f970: 66 69 63 61 74 65 2c 20 64 65 73 74 5b 69 64 78  ficate, dest[idx
f980: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
f990: 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  n);..}...return(
f9a0: 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  dest);.}../*. * 
f9b0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
f9c0: 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  .... *. * ARGUME
f9d0: 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  NTS. *     .... 
f9e0: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
f9f0: 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  E. *     .... *.
fa00: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
fa10: 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  .... *. */.stati
fa20: 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  c struct cackey_
fa30: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
fa40: 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
fa50: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
fa60: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63  lot *slot, struc
fa70: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
fa80: 65 6e 74 69 74 79 20 2a 63 65 72 74 73 2c 20 75  entity *certs, u
fa90: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 63 6f  nsigned long *co
faa0: 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63  unt) {..struct c
fab0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
fac0: 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 73  ity *curr_id;..s
fad0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76  truct cackey_tlv
fae0: 5f 65 6e 74 69 74 79 20 2a 63 63 63 5f 74 6c 76  _entity *ccc_tlv
faf0: 2c 20 2a 63 63 63 5f 63 75 72 72 2c 20 2a 61 70  , *ccc_curr, *ap
fb00: 70 5f 74 6c 76 2c 20 2a 61 70 70 5f 63 75 72 72  p_tlv, *app_curr
fb10: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
fb20: 20 63 63 63 5f 61 69 64 5b 5d 20 3d 20 7b 47 53   ccc_aid[] = {GS
fb30: 43 49 53 5f 41 49 44 5f 43 43 43 7d 2c 20 70 69  CIS_AID_CCC}, pi
fb40: 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e 49 53 54 53  v_aid[] = {NISTS
fb50: 50 38 30 30 5f 37 33 5f 33 5f 50 49 56 5f 41 49  P800_73_3_PIV_AI
fb60: 44 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  D};..unsigned ch
fb70: 61 72 20 2a 70 69 76 5f 6f 69 64 2c 20 70 69 76  ar *piv_oid, piv
fb80: 5f 6f 69 64 5f 70 69 76 61 75 74 68 5b 5d 20 3d  _oid_pivauth[] =
fb90: 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33   {NISTSP800_73_3
fba0: 5f 4f 49 44 5f 50 49 56 41 55 54 48 7d 2c 20 70  _OID_PIVAUTH}, p
fbb0: 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65  iv_oid_signature
fbc0: 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
fbd0: 37 33 5f 33 5f 4f 49 44 5f 53 49 47 4e 41 54 55  73_3_OID_SIGNATU
fbe0: 52 45 7d 2c 20 70 69 76 5f 6f 69 64 5f 6b 65 79  RE}, piv_oid_key
fbf0: 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  mgt[] = {NISTSP8
fc00: 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 4b 45 59 4d  00_73_3_OID_KEYM
fc10: 47 54 7d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  GT};..unsigned c
fc20: 68 61 72 20 63 75 72 72 5f 61 69 64 5b 37 5d 3b  har curr_aid[7];
fc30: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
fc40: 62 75 66 66 65 72 5b 38 31 39 32 5d 2c 20 2a 62  buffer[8192], *b
fc50: 75 66 66 65 72 5f 70 3b 0a 09 75 6e 73 69 67 6e  uffer_p;..unsign
fc60: 65 64 20 6c 6f 6e 67 20 6f 75 74 69 64 78 20 3d  ed long outidx =
fc70: 20 30 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20   0;..cackey_ret 
fc80: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 3b  transaction_ret;
fc90: 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
fca0: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 62 75 66 66  et;..size_t buff
fcb0: 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 63 65 72  er_len;..int cer
fcc0: 74 73 5f 72 65 73 69 7a 61 62 6c 65 3b 0a 09 69  ts_resizable;..i
fcd0: 6e 74 20 73 65 6e 64 5f 72 65 74 2c 20 73 65 6c  nt send_ret, sel
fce0: 65 63 74 5f 72 65 74 3b 0a 09 69 6e 74 20 70 69  ect_ret;..int pi
fcf0: 76 5f 6b 65 79 2c 20 70 69 76 20 3d 20 30 3b 0a  v_key, piv = 0;.
fd00: 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b  .int idx;...CACK
fd10: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fd20: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
fd30: 20 28 63 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29   (count == NULL)
fd40: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
fd50: 47 5f 50 52 49 4e 54 46 28 22 63 6f 75 6e 74 20  G_PRINTF("count 
fd60: 69 73 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 69  is NULL, returni
fd70: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
fd80: 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
fd90: 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73  ;..}...if (certs
fda0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
fdb0: 20 28 2a 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b   (*count == 0) {
fdc0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
fdd0: 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
fde0: 65 64 20 77 65 20 72 65 74 75 72 6e 20 30 20 6f  ed we return 0 o
fdf0: 62 6a 65 63 74 73 2c 20 73 68 6f 72 74 2d 63 69  bjects, short-ci
fe00: 72 63 75 69 74 22 29 3b 0a 0a 09 09 09 72 65 74  rcuit");.....ret
fe10: 75 72 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a  urn(certs);...}.
fe20: 09 7d 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e  .}...if (!slot->
fe30: 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09  slot_reset) {...
fe40: 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64  if (slot->cached
fe50: 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 69 66 20  _certs) {....if 
fe60: 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c 4c 29 20  (certs == NULL) 
fe70: 7b 0a 09 09 09 09 63 65 72 74 73 20 3d 20 6d 61  {.....certs = ma
fe80: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65 72  lloc(sizeof(*cer
fe90: 74 73 29 20 2a 20 73 6c 6f 74 2d 3e 63 61 63 68  ts) * slot->cach
fea0: 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 29 3b  ed_certs_count);
feb0: 0a 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20 73 6c  .....*count = sl
fec0: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
fed0: 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 7d 20 65 6c  _count;.....} el
fee0: 73 65 20 7b 0a 09 09 09 09 69 66 20 28 2a 63 6f  se {.....if (*co
fef0: 75 6e 74 20 3e 20 73 6c 6f 74 2d 3e 63 61 63 68  unt > slot->cach
ff00: 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 29 20  ed_certs_count) 
ff10: 7b 0a 09 09 09 09 09 2a 63 6f 75 6e 74 20 3d 20  {......*count = 
ff20: 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72  slot->cached_cer
ff30: 74 73 5f 63 6f 75 6e 74 3b 0a 09 09 09 09 7d 0a  ts_count;.....}.
ff40: 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
ff50: 63 6f 70 79 5f 63 65 72 74 73 28 63 65 72 74 73  copy_certs(certs
ff60: 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  , slot->cached_c
ff70: 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 0a  erts, *count);..
ff80: 09 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29  ...return(certs)
ff90: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 73  ;...}..}...if (s
ffa0: 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
ffb0: 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 66 72  s) {...cackey_fr
ffc0: 65 65 5f 63 65 72 74 73 28 73 6c 6f 74 2d 3e 63  ee_certs(slot->c
ffd0: 61 63 68 65 64 5f 63 65 72 74 73 2c 20 73 6c 6f  ached_certs, slo
ffe0: 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  t->cached_certs_
fff0: 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 73 6c  count, 1);....sl
10000 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
10010 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2f 2a   = NULL;..}.../*
10020 20 42 65 67 69 6e 20 61 20 53 6d 61 72 74 43 61   Begin a SmartCa
10030 72 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd transaction *
10040 2f 0a 09 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72  /..transaction_r
10050 65 74 20 3d 20 63 61 63 6b 65 79 5f 62 65 67 69  et = cackey_begi
10060 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  n_transaction(sl
10070 6f 74 29 3b 0a 09 69 66 20 28 74 72 61 6e 73 61  ot);..if (transa
10080 63 74 69 6f 6e 5f 72 65 74 20 21 3d 20 43 41 43  ction_ret != CAC
10090 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
100a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
100b0 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 62  PRINTF("Unable b
100c0 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egin transaction
100d0 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
100e0 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
100f0 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
10100 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e 55 4c  if (certs == NUL
10110 4c 29 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 6d  L) {...certs = m
10120 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 65  alloc(sizeof(*ce
10130 72 74 73 29 20 2a 20 35 29 3b 0a 09 09 2a 63 6f  rts) * 5);...*co
10140 75 6e 74 20 3d 20 35 3b 0a 09 09 63 65 72 74 73  unt = 5;...certs
10150 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 31 3b 0a  _resizable = 1;.
10160 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 65 72 74  .} else {...cert
10170 73 5f 72 65 73 69 7a 61 62 6c 65 20 3d 20 30 3b  s_resizable = 0;
10180 0a 09 7d 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20  ..}.../* Select 
10190 74 68 65 20 43 43 43 20 41 70 70 6c 65 74 20 2a  the CCC Applet *
101a0 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  /..send_ret = ca
101b0 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
101c0 65 74 28 73 6c 6f 74 2c 20 63 63 63 5f 61 69 64  et(slot, ccc_aid
101d0 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 61 69 64  , sizeof(ccc_aid
101e0 29 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72 65  ));..if (send_re
101f0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
10200 5f 53 5f 4f 4b 29 20 7b 0a 09 09 2f 2a 20 54 72  _S_OK) {.../* Tr
10210 79 20 50 49 56 20 61 70 70 6c 69 63 61 74 69 6f  y PIV applicatio
10220 6e 20 2a 2f 0a 09 09 73 65 6e 64 5f 72 65 74 20  n */...send_ret 
10230 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f  = cackey_select_
10240 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 70 69 76  applet(slot, piv
10250 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 76  _aid, sizeof(piv
10260 5f 61 69 64 29 29 3b 0a 09 09 69 66 20 28 73 65  _aid));...if (se
10270 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59  nd_ret == CACKEY
10280 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
10290 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
102a0 49 4e 54 46 28 22 57 65 20 68 61 76 65 20 61 20  INTF("We have a 
102b0 50 49 56 20 63 61 72 64 20 2d 2d 20 6e 6f 74 20  PIV card -- not 
102c0 75 73 69 6e 67 20 74 68 65 20 43 43 43 2c 20 70  using the CCC, p
102d0 75 6c 6c 69 6e 67 20 70 72 65 2d 73 65 6c 65 63  ulling pre-selec
102e0 74 65 64 20 6b 65 79 73 22 29 3b 0a 0a 09 09 09  ted keys");.....
102f0 70 69 76 20 3d 20 31 3b 0a 09 09 7d 20 65 6c 73  piv = 1;...} els
10300 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  e {....CACKEY_DE
10310 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
10320 6c 65 20 74 6f 20 73 65 6c 65 63 74 20 43 43 43  le to select CCC
10330 20 41 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69   Applet, returni
10340 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
10350 0a 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74  ...../* Terminat
10360 65 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e  e SmartCard Tran
10370 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61  saction */....ca
10380 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
10390 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
103a0 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09  return(NULL);...
103b0 7d 0a 09 7d 0a 0a 09 69 66 20 28 70 69 76 29 20  }..}...if (piv) 
103c0 7b 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  {...for (idx = 0
103d0 3b 20 69 64 78 20 3c 20 33 3b 20 69 64 78 2b 2b  ; idx < 3; idx++
103e0 29 20 7b 0a 09 09 09 73 77 69 74 63 68 20 28 69  ) {....switch (i
103f0 64 78 29 20 7b 0a 09 09 09 09 63 61 73 65 20 30  dx) {.....case 0
10400 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d  :......piv_oid =
10410 20 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68   piv_oid_pivauth
10420 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d  ;......piv_key =
10430 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
10440 4b 45 59 5f 50 49 56 41 55 54 48 3b 0a 09 09 09  KEY_PIVAUTH;....
10450 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
10460 65 20 31 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69  e 1:......piv_oi
10470 64 20 3d 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e  d = piv_oid_sign
10480 61 74 75 72 65 3b 0a 09 09 09 09 09 70 69 76 5f  ature;......piv_
10490 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30 5f  key = NISTSP800_
104a0 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54 55  78_3_KEY_SIGNATU
104b0 52 45 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  RE;......break;.
104c0 09 09 09 09 63 61 73 65 20 32 3a 0a 09 09 09 09  ....case 2:.....
104d0 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f  .piv_oid = piv_o
104e0 69 64 5f 6b 65 79 6d 67 74 3b 0a 09 09 09 09 09  id_keymgt;......
104f0 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50  piv_key = NISTSP
10500 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 4b 45 59  800_78_3_KEY_KEY
10510 4d 47 54 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  MGT;......break;
10520 0a 09 09 09 7d 0a 0a 09 09 09 72 65 61 64 5f 72  ....}.....read_r
10530 65 74 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  et = cackey_get_
10540 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65  data(slot, buffe
10550 72 2c 20 73 69 7a 65 6f 66 28 62 75 66 66 65 72  r, sizeof(buffer
10560 29 2c 20 70 69 76 5f 6f 69 64 29 3b 0a 0a 09 09  ), piv_oid);....
10570 09 69 66 20 28 72 65 61 64 5f 72 65 74 20 3c 3d  .if (read_ret <=
10580 20 30 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e   0) {.....contin
10590 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 75 72  ue;....}.....cur
105a0 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75  r_id = &certs[ou
105b0 74 69 64 78 5d 3b 0a 09 09 09 6f 75 74 69 64 78  tidx];....outidx
105c0 2b 2b 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d  ++;.....curr_id-
105d0 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 09  >keysize = -1;..
105e0 09 09 63 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79  ..curr_id->id_ty
105f0 70 65 20 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  pe = CACKEY_ID_T
10600 59 50 45 5f 50 49 56 3b 0a 09 09 09 63 75 72 72  YPE_PIV;....curr
10610 5f 69 64 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65  _id->card.piv.ke
10620 79 5f 69 64 20 3d 20 70 69 76 5f 6b 65 79 3b 0a  y_id = piv_key;.
10630 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
10640 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 72  tificate_len = r
10650 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75 72 72  ead_ret;....curr
10660 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10670 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69   = malloc(curr_i
10680 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
10690 65 6e 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f  en);.....CACKEY_
106a0 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
106b0 50 72 65 2d 73 68 72 69 6e 6b 20 28 2d 34 68 65  Pre-shrink (-4he
106c0 61 64 65 72 2c 20 2d 35 74 72 61 69 6c 65 72 29  ader, -5trailer)
106d0 20 3d 3d 20 22 2c 20 62 75 66 66 65 72 2c 20 63   == ", buffer, c
106e0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
106f0 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75  ate_len);.....bu
10700 66 66 65 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f  ffer_len = sizeo
10710 66 28 62 75 66 66 65 72 29 3b 0a 09 09 09 62 75  f(buffer);....bu
10720 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f  ffer_p = cackey_
10730 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28  read_bertlv_tag(
10740 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f  buffer, &buffer_
10750 6c 65 6e 2c 20 30 78 37 30 2c 20 63 75 72 72 5f  len, 0x70, curr_
10760 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c  id->certificate,
10770 20 26 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69   &curr_id->certi
10780 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09  ficate_len);....
10790 09 69 66 20 28 62 75 66 66 65 72 5f 70 20 3d 3d  .if (buffer_p ==
107a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43   NULL) {.....CAC
107b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
107c0 28 22 52 65 61 64 69 6e 67 20 63 65 72 74 69 66  ("Reading certif
107d0 69 63 61 74 65 20 66 72 6f 6d 20 42 45 52 2d 54  icate from BER-T
107e0 4c 56 20 72 65 73 70 6f 6e 73 65 20 66 61 69 6c  LV response fail
107f0 65 64 2c 20 73 6b 69 70 70 69 6e 67 20 6b 65 79  ed, skipping key
10800 20 25 69 22 2c 20 69 64 78 29 3b 0a 09 09 09 09   %i", idx);.....
10810 66 72 65 65 28 63 75 72 72 5f 69 64 2d 3e 63 65  free(curr_id->ce
10820 72 74 69 66 69 63 61 74 65 29 3b 0a 0a 09 09 09  rtificate);.....
10830 09 6f 75 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 09  .outidx--;......
10840 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
10850 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10860 50 52 49 4e 54 42 55 46 28 22 50 6f 73 74 2d 73  PRINTBUF("Post-s
10870 68 72 69 6e 6b 20 28 2d 34 68 65 61 64 65 72 2c  hrink (-4header,
10880 20 2d 35 74 72 61 69 6c 65 72 29 20 3d 3d 20 22   -5trailer) == "
10890 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
108a0 66 69 63 61 74 65 2c 20 63 75 72 72 5f 69 64 2d  ficate, curr_id-
108b0 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
108c0 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
108d0 0a 09 09 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74  .../* Read all t
108e0 68 65 20 61 70 70 6c 65 74 73 20 66 72 6f 6d 20  he applets from 
108f0 74 68 65 20 43 43 43 27 73 20 54 4c 56 20 2a 2f  the CCC's TLV */
10900 0a 09 09 63 63 63 5f 74 6c 76 20 3d 20 63 61 63  ...ccc_tlv = cac
10910 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f  key_read_tlv(slo
10920 74 29 3b 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66  t);..../* Look f
10930 6f 72 20 43 41 52 44 55 52 4c 73 20 74 68 61 74  or CARDURLs that
10940 20 63 6f 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50   coorespond to P
10950 4b 49 20 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09  KI applets */...
10960 66 6f 72 20 28 63 63 63 5f 63 75 72 72 20 3d 20  for (ccc_curr = 
10970 63 63 63 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72  ccc_tlv; ccc_cur
10980 72 3b 20 63 63 63 5f 63 75 72 72 20 3d 20 63 63  r; ccc_curr = cc
10990 63 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b  c_curr->_next) {
109a0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
109b0 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 74  _PRINTF("Found t
109c0 61 67 3a 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41  ag: %s ... ", CA
109d0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
109e0 54 41 47 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  TAG_TO_STR(ccc_c
109f0 75 72 72 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09  urr->tag));.....
10a00 69 66 20 28 63 63 63 5f 63 75 72 72 2d 3e 74 61  if (ccc_curr->ta
10a10 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43  g != GSCIS_TAG_C
10a20 41 52 44 55 52 4c 29 20 7b 0a 09 09 09 09 43 41  ARDURL) {.....CA
10a30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10a40 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e  F("  ... skippin
10a50 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61  g it (we only ca
10a60 72 65 20 61 62 6f 75 74 20 43 41 52 44 55 52 4c  re about CARDURL
10a70 73 29 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69  s)");......conti
10a80 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  nue;....}.....if
10a90 20 28 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c   ((ccc_curr->val
10aa0 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
10ab0 79 70 65 20 26 20 43 41 43 4b 45 59 5f 54 4c 56  ype & CACKEY_TLV
10ac0 5f 41 50 50 5f 50 4b 49 29 20 21 3d 20 43 41 43  _APP_PKI) != CAC
10ad0 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29  KEY_TLV_APP_PKI)
10ae0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10af0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
10b00 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
10b10 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
10b20 74 20 50 4b 49 20 61 70 70 6c 65 74 73 2c 20 74  t PKI applets, t
10b30 68 69 73 20 61 70 70 6c 65 74 20 73 75 70 70 6f  his applet suppo
10b40 72 74 73 3a 20 25 73 2f 25 30 32 78 29 22 2c 20  rts: %s/%02x)", 
10b50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
10b60 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
10b70 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
10b80 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
10b90 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  e), (unsigned in
10ba0 74 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  t) ccc_curr->val
10bb0 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74  ue_cardurl->appt
10bc0 79 70 65 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69  ype);......conti
10bd0 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41  nue;....}.....CA
10be0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10bf0 42 55 46 28 22 52 49 44 3a 22 2c 20 63 63 63 5f  BUF("RID:", ccc_
10c00 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10c10 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66  url->rid, sizeof
10c20 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
10c30 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b  _cardurl->rid));
10c40 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10c50 5f 50 52 49 4e 54 46 28 22 41 70 70 49 44 20 3d  _PRINTF("AppID =
10c60 20 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b   %s/%04lx", CACK
10c70 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42  EY_DEBUG_FUNC_OB
10c80 4a 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63  JID_TO_STR(ccc_c
10c90 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10ca0 72 6c 2d 3e 61 70 70 69 64 29 2c 20 28 75 6e 73  rl->appid), (uns
10cb0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f  igned long) ccc_
10cc0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10cd0 75 72 6c 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09  url->appid);....
10ce0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10cf0 4e 54 46 28 22 4f 62 6a 65 63 74 49 44 20 3d 20  NTF("ObjectID = 
10d00 25 73 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45  %s/%04lx", CACKE
10d10 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a  Y_DEBUG_FUNC_OBJ
10d20 49 44 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  ID_TO_STR(ccc_cu
10d30 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10d40 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 2c 20 28 75  l->objectid), (u
10d50 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63  nsigned long) cc
10d60 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10d70 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
10d80 3b 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 75 72  ;.....memcpy(cur
10d90 72 5f 61 69 64 2c 20 63 63 63 5f 63 75 72 72 2d  r_aid, ccc_curr-
10da0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10db0 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f  rid, sizeof(ccc_
10dc0 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10dd0 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63  url->rid));....c
10de0 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63  urr_aid[sizeof(c
10df0 75 72 72 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20  urr_aid) - 2] = 
10e00 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
10e10 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20  _cardurl->appid 
10e20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 09 09  >> 8) & 0xff;...
10e30 09 63 75 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66  .curr_aid[sizeof
10e40 28 63 75 72 72 5f 61 69 64 29 20 2d 20 31 5d 20  (curr_aid) - 1] 
10e50 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
10e60 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
10e70 20 26 20 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20   & 0xff;...../* 
10e80 53 65 6c 65 63 74 20 66 6f 75 6e 64 20 61 70 70  Select found app
10e90 6c 65 74 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65  let ... */....se
10ea0 6c 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  lect_ret = cacke
10eb0 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28  y_select_applet(
10ec0 73 6c 6f 74 2c 20 63 75 72 72 5f 61 69 64 2c 20  slot, curr_aid, 
10ed0 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
10ee0 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74  );....if (select
10ef0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
10f00 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09  CSC_S_OK) {.....
10f10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10f20 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73  NTF("Failed to s
10f30 65 6c 65 63 74 20 61 70 70 6c 65 74 2c 20 73 6b  elect applet, sk
10f40 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
10f50 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
10f60 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
10f70 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e  e;....}...../* .
10f80 2e 2e 20 61 6e 64 20 6f 62 6a 65 63 74 20 28 66  .. and object (f
10f90 69 6c 65 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63  ile) */....selec
10fa0 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
10fb0 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c  elect_file(slot,
10fc0 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65   ccc_curr->value
10fd0 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
10fe0 69 64 29 3b 0a 09 09 09 69 66 20 28 73 65 6c 65  id);....if (sele
10ff0 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
11000 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
11010 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11020 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
11030 20 73 65 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b   select file, sk
11040 69 70 70 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  ipping processin
11050 67 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  g of this object
11060 22 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75  ");......continu
11070 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50  e;....}...../* P
11080 72 6f 63 65 73 73 20 74 68 69 73 20 66 69 6c 65  rocess this file
11090 27 73 20 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66  's TLV looking f
110a0 6f 72 20 63 65 72 74 69 66 69 63 61 74 65 73 20  or certificates 
110b0 2a 2f 0a 09 09 09 61 70 70 5f 74 6c 76 20 3d 20  */....app_tlv = 
110c0 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
110d0 73 6c 6f 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20  slot);......for 
110e0 28 61 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f  (app_curr = app_
110f0 74 6c 76 3b 20 61 70 70 5f 63 75 72 72 3b 20 61  tlv; app_curr; a
11100 70 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 63 75  pp_curr = app_cu
11110 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09  rr->_next) {....
11120 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11130 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
11140 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42   %s", CACKEY_DEB
11150 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
11160 54 52 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67  TR(app_curr->tag
11170 29 29 3b 0a 09 09 09 09 69 66 20 28 61 70 70 5f  ));.....if (app_
11180 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43  curr->tag != GSC
11190 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
111a0 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  TE) {......CACKE
111b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
111c0 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
111d0 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
111e0 61 62 6f 75 74 20 43 45 52 54 49 46 49 43 41 54  about CERTIFICAT
111f0 45 73 29 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e  Es)");.......con
11200 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09  tinue;.....}....
11210 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 65 72  ..curr_id = &cer
11220 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09  ts[outidx];.....
11230 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63  outidx++;......c
11240 75 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20  urr_id->id_type 
11250 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  = CACKEY_ID_TYPE
11260 5f 43 41 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79  _CAC;.....memcpy
11270 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63  (curr_id->card.c
11280 61 63 2e 61 70 70 6c 65 74 2c 20 63 75 72 72 5f  ac.applet, curr_
11290 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72 72  aid, sizeof(curr
112a0 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  _id->card.cac.ap
112b0 70 6c 65 74 29 29 3b 0a 09 09 09 09 63 75 72 72  plet));.....curr
112c0 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69  _id->card.cac.fi
112d0 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76  le = ccc_curr->v
112e0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
112f0 6a 65 63 74 69 64 3b 0a 09 09 09 09 63 75 72 72  jectid;.....curr
11300 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d  _id->keysize = -
11310 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  1;......CACKEY_D
11320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c  EBUG_PRINTF("Fil
11330 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 63 61  ling curr_id->ca
11340 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 20 28 25  rd.cac.applet (%
11350 70 29 20 77 69 74 68 20 25 6c 75 20 62 79 74 65  p) with %lu byte
11360 73 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61  s:", curr_id->ca
11370 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 28  rd.cac.applet, (
11380 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
11390 69 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63  izeof(curr_id->c
113a0 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
113b0 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ;.....CACKEY_DEB
113c0 55 47 5f 50 52 49 4e 54 42 55 46 28 22 56 41 4c  UG_PRINTBUF("VAL
113d0 3a 22 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72  :", curr_id->car
113e0 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69  d.cac.applet, si
113f0 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61  zeof(curr_id->ca
11400 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
11410 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ......curr_id->c
11420 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
11430 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74   app_curr->lengt
11440 68 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  h;......curr_id-
11450 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
11460 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63  alloc(curr_id->c
11470 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
11480 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
11490 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
114a0 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75  , app_curr->valu
114b0 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  e, curr_id->cert
114c0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
114d0 09 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d  ...if (outidx >=
114e0 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09   *count) {......
114f0 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
11500 62 6c 65 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f  ble) {.......*co
11510 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09  unt *= 2;.......
11520 63 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28  certs = realloc(
11530 63 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63  certs, sizeof(*c
11540 65 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29  erts) * (*count)
11550 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  );......} else {
11560 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
11570 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  ...}.....}....}.
11580 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
11590 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09  tlv(app_tlv);...
115a0 09 09 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20  ..if (outidx >= 
115b0 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72  *count) {.....br
115c0 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
115d0 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
115e0 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09  (ccc_tlv);..}...
115f0 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b  *count = outidx;
11600 0a 0a 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
11610 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63 65 72 74  izable) {...cert
11620 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72 74  s = realloc(cert
11630 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74 73  s, sizeof(*certs
11640 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09  ) * (*count));..
11650 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64  }...slot->cached
11660 5f 63 65 72 74 73 20 3d 20 63 61 63 6b 65 79 5f  _certs = cackey_
11670 63 6f 70 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c  copy_certs(NULL,
11680 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b   certs, *count);
11690 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  ..slot->cached_c
116a0 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f  erts_count = *co
116b0 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e  unt;.../* Termin
116c0 61 74 65 20 53 6d 61 72 74 43 61 72 64 20 54 72  ate SmartCard Tr
116d0 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61  ansaction */..ca
116e0 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
116f0 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65  tion(slot);...re
11700 74 75 72 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a  turn(certs);.}..
11710 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
11720 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
11730 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
11740 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
11750 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
11760 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
11770 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
11780 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20  .static ssize_t 
11790 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79  cackey_signdecry
117a0 70 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  pt(struct cackey
117b0 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72  _slot *slot, str
117c0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
117d0 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
117e0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
117f0 66 2c 20 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  f, size_t buflen
11800 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
11810 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65 5f 74 20  *outbuf, size_t 
11820 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70  outbuflen, int p
11830 61 64 49 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70  adInput, int unp
11840 61 64 4f 75 74 70 75 74 29 20 7b 0a 09 63 61 63  adOutput) {..cac
11850 6b 65 79 5f 70 63 73 63 5f 69 64 5f 74 79 70 65  key_pcsc_id_type
11860 20 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67   id_type;..unsig
11870 6e 65 64 20 63 68 61 72 20 64 79 6e 5f 61 75 74  ned char dyn_aut
11880 68 5f 74 65 6d 70 6c 61 74 65 5b 31 30 5d 3b 0a  h_template[10];.
11890 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
118a0 74 6d 70 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f  tmpbuf, *tmpbuf_
118b0 73 2c 20 2a 6f 75 74 62 75 66 5f 73 2c 20 2a 6f  s, *outbuf_s, *o
118c0 75 74 62 75 66 5f 70 3b 0a 09 75 6e 73 69 67 6e  utbuf_p;..unsign
118d0 65 64 20 63 68 61 72 20 62 79 74 65 73 5f 74 6f  ed char bytes_to
118e0 5f 73 65 6e 64 2c 20 70 31 2c 20 63 6c 61 73 73  _send, p1, class
118f0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
11900 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63 61 63   blocktype;..cac
11910 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72 65 74  key_ret send_ret
11920 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
11930 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74 20 72  code;..ssize_t r
11940 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70 61 64  etval = 0, unpad
11950 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f 74 20  offset;..size_t 
11960 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64 6c 65  tmpbuflen, padle
11970 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 2c  n, tmpoutbuflen,
11980 20 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 09 69 6e   outbuf_len;..in
11990 74 20 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20  t free_tmpbuf = 
119a0 30 3b 0a 09 69 6e 74 20 6c 65 3b 0a 0a 09 43 41  0;..int le;...CA
119b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
119c0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
119d0 69 66 20 28 73 6c 6f 74 20 3d 3d 20 4e 55 4c 4c  if (slot == NULL
119e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
119f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11a00 2e 20 20 73 6c 6f 74 20 69 73 20 4e 55 4c 4c 22  .  slot is NULL"
11a10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
11a20 3b 0a 09 7d 0a 0a 09 69 66 20 28 62 75 66 20 3d  ;..}...if (buf =
11a30 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
11a40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
11a50 22 45 72 72 6f 72 2e 20 20 62 75 66 20 69 73 20  "Error.  buf is 
11a60 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
11a70 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
11a80 6f 75 74 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  outbuf == NULL) 
11a90 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
11aa0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
11ab0 20 6f 75 74 62 75 66 20 69 73 20 4e 55 4c 4c 22   outbuf is NULL"
11ac0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
11ad0 3b 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74  ;..}...if (ident
11ae0 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ity == NULL) {..
11af0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11b00 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64  INTF("Error.  id
11b10 65 6e 74 69 74 79 20 69 73 20 4e 55 4c 4c 22 29  entity is NULL")
11b20 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
11b30 0a 09 7d 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  ..}...if (identi
11b40 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11b50 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  y == NULL) {...C
11b60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11b70 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e  TF("Error.  iden
11b80 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11b90 69 74 79 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  ity is NULL");..
11ba0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
11bb0 0a 0a 09 69 64 5f 74 79 70 65 20 3d 20 69 64 65  ...id_type = ide
11bc0 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
11bd0 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 3b 0a 09  tity->id_type;..
11be0 69 66 20 28 69 64 5f 74 79 70 65 20 3d 3d 20 43  if (id_type == C
11bf0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45  ACKEY_ID_TYPE_CE
11c00 52 54 5f 4f 4e 4c 59 29 20 7b 0a 09 09 43 41 43  RT_ONLY) {...CAC
11c10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11c20 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
11c30 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11c40 79 20 69 73 20 43 41 43 4b 45 59 5f 49 44 5f 54  y is CACKEY_ID_T
11c50 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 2c 20 77  YPE_CERT_ONLY, w
11c60 68 69 63 68 20 63 61 6e 6e 6f 74 20 62 65 20 75  hich cannot be u
11c70 73 65 64 20 66 6f 72 20 73 69 67 6e 2f 64 65 63  sed for sign/dec
11c80 72 79 70 74 22 29 3b 0a 0a 09 09 72 65 74 75 72  rypt");....retur
11c90 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74  n(-1);..}...swit
11ca0 63 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09  ch (id_type) {..
11cb0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
11cc0 54 59 50 45 5f 50 49 56 3a 0a 09 09 63 61 73 65  TYPE_PIV:...case
11cd0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
11ce0 43 41 43 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09  CAC:....break;..
11cf0 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43  .default:....CAC
11d00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11d10 28 22 45 72 72 6f 72 2e 20 20 69 64 65 6e 74 69  ("Error.  identi
11d20 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11d30 79 20 69 73 20 6e 6f 74 20 61 20 73 75 70 70 6f  y is not a suppo
11d40 72 74 65 64 20 76 61 6c 75 65 2e 20 54 79 70 65  rted value. Type
11d50 20 69 73 3a 20 30 78 25 6c 78 20 28 50 49 56 20   is: 0x%lx (PIV 
11d60 3d 20 30 78 25 6c 78 2c 20 43 41 43 20 3d 20 30  = 0x%lx, CAC = 0
11d70 78 25 6c 78 29 22 2c 20 28 75 6e 73 69 67 6e 65  x%lx)", (unsigne
11d80 64 20 6c 6f 6e 67 29 20 69 64 5f 74 79 70 65 2c  d long) id_type,
11d90 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11da0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
11db0 50 49 56 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  PIV, (unsigned l
11dc0 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44 5f 54  ong) CACKEY_ID_T
11dd0 59 50 45 5f 43 41 43 29 3b 0a 0a 09 09 09 72 65  YPE_CAC);.....re
11de0 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f  turn(-1);..}.../
11df0 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 64 65 6e  * Determine iden
11e00 74 69 74 79 20 4b 65 79 20 73 69 7a 65 20 2a 2f  tity Key size */
11e10 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e  ..if (identity->
11e20 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
11e30 65 79 73 69 7a 65 20 3c 20 30 29 20 7b 0a 09 09  eysize < 0) {...
11e40 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
11e50 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
11e60 20 3d 20 78 35 30 39 5f 74 6f 5f 6b 65 79 73 69   = x509_to_keysi
11e70 7a 65 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  ze(identity->pcs
11e80 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  c_identity->cert
11e90 69 66 69 63 61 74 65 2c 20 69 64 65 6e 74 69 74  ificate, identit
11ea0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11eb0 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
11ec0 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 50 61 64 20  n);..}.../* Pad 
11ed0 6d 65 73 73 61 67 65 20 74 6f 20 6b 65 79 20 73  message to key s
11ee0 69 7a 65 20 2a 2f 0a 09 69 66 20 28 70 61 64 49  ize */..if (padI
11ef0 6e 70 75 74 29 20 7b 0a 09 09 69 66 20 28 69 64  nput) {...if (id
11f00 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65  entity->pcsc_ide
11f10 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3e  ntity->keysize >
11f20 20 30 29 20 7b 0a 09 09 09 69 66 20 28 62 75 66   0) {....if (buf
11f30 6c 65 6e 20 21 3d 20 69 64 65 6e 74 69 74 79 2d  len != identity-
11f40 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
11f50 6b 65 79 73 69 7a 65 29 20 7b 0a 09 09 09 09 69  keysize) {.....i
11f60 66 20 28 62 75 66 6c 65 6e 20 3e 20 28 69 64 65  f (buflen > (ide
11f70 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
11f80 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 2b 20  tity->keysize + 
11f90 33 29 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  3)) {......CACKE
11fa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11fb0 45 72 72 6f 72 2e 20 20 4d 65 73 73 61 67 65 20  Error.  Message 
11fc0 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20  is too large to 
11fd0 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a  sign/decrypt");.
11fe0 0a 09 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
11ff0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 74 6d 70  ;.....}......tmp
12000 62 75 66 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74  buflen = identit
12010 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
12020 2d 3e 6b 65 79 73 69 7a 65 3b 0a 09 09 09 09 74  ->keysize;.....t
12030 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74  mpbuf = malloc(t
12040 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 66  mpbuflen);.....f
12050 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 31 3b 0a  ree_tmpbuf = 1;.
12060 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 74 6d  .....padlen = tm
12070 70 62 75 66 6c 65 6e 20 2d 20 62 75 66 6c 65 6e  pbuflen - buflen
12080 20 2d 20 33 3b 0a 0a 09 09 09 09 2f 2a 20 52 53   - 3;....../* RS
12090 41 20 50 4b 43 53 23 31 20 45 4d 53 41 2d 50 4b  A PKCS#1 EMSA-PK
120a0 43 53 31 2d 76 31 5f 35 20 50 61 64 64 69 6e 67  CS1-v1_5 Padding
120b0 20 2a 2f 0a 09 09 09 09 74 6d 70 62 75 66 5b 30   */.....tmpbuf[0
120c0 5d 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 74 6d  ] = 0x00;.....tm
120d0 70 62 75 66 5b 31 5d 20 3d 20 30 78 30 31 3b 0a  pbuf[1] = 0x01;.
120e0 09 09 09 09 6d 65 6d 73 65 74 28 26 74 6d 70 62  ....memset(&tmpb
120f0 75 66 5b 32 5d 2c 20 30 78 46 46 2c 20 70 61 64  uf[2], 0xFF, pad
12100 6c 65 6e 29 3b 0a 09 09 09 09 74 6d 70 62 75 66  len);.....tmpbuf
12110 5b 70 61 64 6c 65 6e 20 2b 20 32 5d 3d 20 30 78  [padlen + 2]= 0x
12120 30 30 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 26  00;.....memcpy(&
12130 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20  tmpbuf[padlen + 
12140 33 5d 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29  3], buf, buflen)
12150 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
12160 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 55 6e  BUG_PRINTBUF("Un
12170 70 61 64 64 65 64 3a 22 2c 20 62 75 66 2c 20 62  padded:", buf, b
12180 75 66 6c 65 6e 29 3b 0a 09 09 09 09 43 41 43 4b  uflen);.....CACK
12190 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
121a0 46 28 22 50 61 64 64 65 64 3a 22 2c 20 74 6d 70  F("Padded:", tmp
121b0 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b  buf, tmpbuflen);
121c0 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
121d0 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09  .tmpbuf = buf;..
121e0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62  ...tmpbuflen = b
121f0 75 66 6c 65 6e 3b 0a 09 09 09 09 66 72 65 65 5f  uflen;.....free_
12200 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 09 09  tmpbuf = 0;.....
12210 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09 09 7d  padlen = 0;....}
12220 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
12230 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12240 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 64 65  TF("Unable to de
12250 74 65 72 6d 69 6e 65 20 6b 65 79 20 73 69 7a 65  termine key size
12260 2c 20 68 6f 70 69 6e 67 20 74 68 65 20 6d 65 73  , hoping the mes
12270 73 61 67 65 20 69 73 20 70 72 6f 70 65 72 6c 79  sage is properly
12280 20 70 61 64 64 65 64 21 22 29 3b 0a 0a 09 09 09   padded!");.....
12290 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09  tmpbuf = buf;...
122a0 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66  .tmpbuflen = buf
122b0 6c 65 6e 3b 0a 09 09 09 66 72 65 65 5f 74 6d 70  len;....free_tmp
122c0 62 75 66 20 3d 20 30 3b 0a 09 09 09 70 61 64 6c  buf = 0;....padl
122d0 65 6e 20 3d 20 30 3b 0a 09 09 7d 0a 09 7d 20 65  en = 0;...}..} e
122e0 6c 73 65 20 7b 0a 09 09 74 6d 70 62 75 66 20 3d  lse {...tmpbuf =
122f0 20 62 75 66 3b 0a 09 09 74 6d 70 62 75 66 6c 65   buf;...tmpbufle
12300 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 66 72  n = buflen;...fr
12310 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
12320 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a  .padlen = 0;..}.
12330 0a 09 2f 2a 20 42 65 67 69 6e 20 74 72 61 6e 73  ../* Begin trans
12340 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
12350 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
12360 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20  ion(slot);.../* 
12370 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 61  Select correct a
12380 70 70 6c 65 74 20 2a 2f 0a 09 73 77 69 74 63 68  pplet */..switch
12390 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63   (id_type) {...c
123a0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
123b0 50 45 5f 43 41 43 3a 0a 09 09 09 43 41 43 4b 45  PE_CAC:....CACKE
123c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
123d0 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74  Selecting applet
123e0 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e 2e 2e   found at %p ...
123f0 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  ", identity->pcs
12400 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
12410 2e 63 61 63 2e 61 70 70 6c 65 74 29 3b 0a 09 09  .cac.applet);...
12420 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61  .cackey_select_a
12430 70 70 6c 65 74 28 73 6c 6f 74 2c 20 69 64 65 6e  pplet(slot, iden
12440 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
12450 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  ity->card.cac.ap
12460 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65  plet, sizeof(ide
12470 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12480 74 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61  tity->card.cac.a
12490 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 2f 2a 20  pplet));...../* 
124a0 53 65 6c 65 63 74 20 63 6f 72 72 65 63 74 20 66  Select correct f
124b0 69 6c 65 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ile */....cackey
124c0 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 6c 6f  _select_file(slo
124d0 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  t, identity->pcs
124e0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
124f0 2e 63 61 63 2e 66 69 6c 65 29 3b 0a 09 09 09 62  .cac.file);....b
12500 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43  reak;...case CAC
12510 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a  KEY_ID_TYPE_PIV:
12520 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
12530 70 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37 43 3b  plate[0] = 0x7C;
12540 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
12550 70 6c 61 74 65 5b 31 5d 20 3d 20 30 78 38 32 3b  plate[1] = 0x82;
12560 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d  ....dyn_auth_tem
12570 70 6c 61 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70  plate[2] = ((tmp
12580 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78  buflen + 6) & 0x
12590 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64  ff00) >> 8;....d
125a0 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
125b0 5b 33 5d 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e  [3] = (tmpbuflen
125c0 20 2b 20 36 29 20 26 20 30 78 30 30 66 66 3b 0a   + 6) & 0x00ff;.
125d0 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ...dyn_auth_temp
125e0 6c 61 74 65 5b 34 5d 20 3d 20 30 78 38 32 3b 0a  late[4] = 0x82;.
125f0 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ...dyn_auth_temp
12600 6c 61 74 65 5b 35 5d 20 3d 20 30 78 30 30 3b 0a  late[5] = 0x00;.
12610 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ...dyn_auth_temp
12620 6c 61 74 65 5b 36 5d 20 3d 20 30 78 38 31 3b 0a  late[6] = 0x81;.
12630 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ...dyn_auth_temp
12640 6c 61 74 65 5b 37 5d 20 3d 20 30 78 38 32 3b 0a  late[7] = 0x82;.
12650 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ...dyn_auth_temp
12660 6c 61 74 65 5b 38 5d 20 3d 20 28 74 6d 70 62 75  late[8] = (tmpbu
12670 66 6c 65 6e 20 26 20 30 78 66 66 30 30 29 20 3e  flen & 0xff00) >
12680 3e 20 38 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68  > 8;....dyn_auth
12690 5f 74 65 6d 70 6c 61 74 65 5b 39 5d 20 3d 20 74  _template[9] = t
126a0 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 30 30 66  mpbuflen & 0x00f
126b0 66 3b 0a 0a 09 09 09 73 65 6e 64 5f 72 65 74 20  f;.....send_ret 
126c0 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
126d0 64 75 28 73 6c 6f 74 2c 20 30 78 31 30 2c 20 4e  du(slot, 0x10, N
126e0 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e  ISTSP800_73_3_IN
126f0 53 54 52 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53  STR_GENAUTH, NIS
12700 54 53 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f  TSP800_78_3_ALGO
12710 5f 52 53 41 32 30 34 38 2c 20 69 64 65 6e 74 69  _RSA2048, identi
12720 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
12730 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f  y->card.piv.key_
12740 69 64 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61  id, sizeof(dyn_a
12750 75 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c 20 64  uth_template), d
12760 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65  yn_auth_template
12770 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55  , 0x00, NULL, NU
12780 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 62 72  LL, NULL);....br
12790 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41 43 4b  eak;...case CACK
127a0 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
127b0 4f 4e 4c 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a  ONLY:....break;.
127c0 09 7d 0a 0a 09 74 6d 70 62 75 66 5f 73 20 3d 20  .}...tmpbuf_s = 
127d0 74 6d 70 62 75 66 3b 0a 09 6f 75 74 62 75 66 5f  tmpbuf;..outbuf_
127e0 73 20 3d 20 6f 75 74 62 75 66 3b 0a 09 77 68 69  s = outbuf;..whi
127f0 6c 65 20 28 74 6d 70 62 75 66 6c 65 6e 29 20 7b  le (tmpbuflen) {
12800 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c 65 6e 20  ...tmpoutbuflen 
12810 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a 0a 09 09  = outbuflen;....
12820 69 66 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20  if (tmpbuflen > 
12830 43 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29  CACKEY_APDU_MTU)
12840 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73   {....bytes_to_s
12850 65 6e 64 20 3d 20 43 41 43 4b 45 59 5f 41 50 44  end = CACKEY_APD
12860 55 5f 4d 54 55 3b 0a 09 09 7d 20 65 6c 73 65 20  U_MTU;...} else 
12870 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 73 65  {....bytes_to_se
12880 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  nd = tmpbuflen;.
12890 09 09 7d 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20  ..}....send_ret 
128a0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
128b0 47 45 4e 45 52 49 43 3b 0a 09 09 73 77 69 74 63  GENERIC;...switc
128c0 68 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09  h (id_type) {...
128d0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
128e0 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 09 69 66  TYPE_CAC:.....if
128f0 20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41   (tmpbuflen > CA
12900 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b  CKEY_APDU_MTU) {
12910 0a 09 09 09 09 09 70 31 20 3d 20 30 78 38 30 3b  ......p1 = 0x80;
12920 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b  ......le = 0x00;
12930 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
12940 09 09 09 70 31 20 3d 20 30 78 30 30 3b 0a 09 09  ...p1 = 0x00;...
12950 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09  ...le = 0x00;...
12960 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65  ..}......send_re
12970 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
12980 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
12990 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c  _CLASS_GLOBAL_PL
129a0 41 54 46 4f 52 4d 2c 20 47 53 43 49 53 5f 49 4e  ATFORM, GSCIS_IN
129b0 53 54 52 5f 53 49 47 4e 44 45 43 52 59 50 54 2c  STR_SIGNDECRYPT,
129c0 20 70 31 2c 20 30 78 30 30 2c 20 62 79 74 65 73   p1, 0x00, bytes
129d0 5f 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66  _to_send, tmpbuf
129e0 2c 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c  , le, &respcode,
129f0 20 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74   outbuf, &tmpout
12a00 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65  buflen);.....bre
12a10 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ak;....case CACK
12a20 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
12a30 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65  ....if (tmpbufle
12a40 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  n > CACKEY_APDU_
12a50 4d 54 55 29 20 7b 0a 09 09 09 09 09 63 6c 61 73  MTU) {......clas
12a60 73 20 3d 20 30 78 31 30 3b 0a 09 09 09 09 09 6c  s = 0x10;......l
12a70 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20  e = 0x00;.....} 
12a80 65 6c 73 65 20 7b 0a 09 09 09 09 09 63 6c 61 73  else {......clas
12a90 73 20 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  s = GSCIS_CLASS_
12aa0 49 53 4f 37 38 31 36 3b 0a 09 09 09 09 09 6c 65  ISO7816;......le
12ab0 20 3d 20 32 35 36 3b 0a 09 09 09 09 7d 0a 0a 09   = 256;.....}...
12ac0 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
12ad0 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
12ae0 6c 6f 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54  lot, class, NIST
12af0 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52  SP800_73_3_INSTR
12b00 5f 47 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50  _GENAUTH, NISTSP
12b10 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53  800_78_3_ALGO_RS
12b20 41 32 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d  A2048, identity-
12b30 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12b40 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64 2c  card.piv.key_id,
12b50 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20   bytes_to_send, 
12b60 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73  tmpbuf, le, &res
12b70 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26  pcode, outbuf, &
12b80 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09  tmpoutbuflen);..
12b90 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
12ba0 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
12bb0 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 09  _CERT_ONLY:.....
12bc0 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
12bd0 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
12be0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
12bf0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
12c00 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
12c10 65 6e 64 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d  ending Failed --
12c20 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
12c30 72 6f 72 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28  ror.");.....if (
12c40 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09  free_tmpbuf) {..
12c50 09 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29  ...if (tmpbuf_s)
12c60 20 7b 0a 09 09 09 09 09 66 72 65 65 28 74 6d 70   {......free(tmp
12c70 62 75 66 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09  buf_s);.....}...
12c80 09 7d 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72  .}...../* End tr
12c90 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
12ca0 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73  cackey_end_trans
12cb0 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09  action(slot);...
12cc0 09 09 69 66 20 28 72 65 73 70 63 6f 64 65 20 3d  ..if (respcode =
12cd0 3d 20 30 78 36 39 38 32 29 20 7b 0a 09 09 09 09  = 0x6982) {.....
12ce0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12cf0 4e 54 46 28 22 53 65 63 75 72 69 74 79 20 73 74  NTF("Security st
12d00 61 74 75 73 20 6e 6f 74 20 73 61 74 69 73 69 66  atus not satisif
12d10 69 65 64 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ied.  Returning 
12d20 4e 45 45 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09  NEEDLOGIN");....
12d30 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c  ..cackey_mark_sl
12d40 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a  ot_reset(slot);.
12d50 09 09 09 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f  ....slot->token_
12d60 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49  flags = CKF_LOGI
12d70 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a 09 09 09  N_REQUIRED;.....
12d80 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
12d90 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29  CSC_E_NEEDLOGIN)
12da0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 73  ;....}.....if (s
12db0 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  end_ret == CACKE
12dc0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
12dd0 53 45 4e 54 29 20 7b 0a 09 09 09 09 43 41 43 4b  SENT) {.....CACK
12de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
12df0 22 54 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20  "Token absent.  
12e00 52 65 74 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41  Returning TOKENA
12e10 42 53 45 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61  BSENT");......ca
12e20 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
12e30 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  eset(slot);.....
12e40 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
12e50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
12e60 54 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  T);....}.....ret
12e70 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
12e80 74 6d 70 62 75 66 20 2b 3d 20 62 79 74 65 73 5f  tmpbuf += bytes_
12e90 74 6f 5f 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75  to_send;...tmpbu
12ea0 66 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f  flen -= bytes_to
12eb0 5f 73 65 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66  _send;....outbuf
12ec0 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e   += tmpoutbuflen
12ed0 3b 0a 09 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d  ;...outbuflen -=
12ee0 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
12ef0 09 72 65 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75  .retval += tmpou
12f00 74 62 75 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66  tbuflen;..}...if
12f10 20 28 66 72 65 65 5f 74 6d 70 62 75 66 29 20 7b   (free_tmpbuf) {
12f20 0a 09 09 69 66 20 28 74 6d 70 62 75 66 5f 73 29  ...if (tmpbuf_s)
12f30 20 7b 0a 09 09 09 66 72 65 65 28 74 6d 70 62 75   {....free(tmpbu
12f40 66 5f 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f  f_s);...}..}...o
12f50 75 74 62 75 66 20 3d 20 6f 75 74 62 75 66 5f 73  utbuf = outbuf_s
12f60 3b 0a 0a 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ;.../* End trans
12f70 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
12f80 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
12f90 6e 28 73 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66  n(slot);..#ifdef
12fa0 20 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44   CACKEY_PARANOID
12fb0 0a 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58  .#  ifdef _POSIX
12fc0 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28  _SSIZE_MAX..if (
12fd0 6f 75 74 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53  outbuflen > _POS
12fe0 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
12ff0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13000 52 49 4e 54 46 28 22 4f 75 74 62 75 66 6c 65 6e  RINTF("Outbuflen
13010 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
13020 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
13030 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
13040 61 78 20 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66  ax = %li, outbuf
13050 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  len = %lu)", (lo
13060 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
13070 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
13080 6c 6f 6e 67 29 20 6f 75 74 62 75 66 6c 65 6e 29  long) outbuflen)
13090 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
130a0 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
130b0 64 69 66 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74  dif.../* We must
130c0 20 72 65 6d 6f 76 65 20 74 68 65 20 22 37 43 22   remove the "7C"
130d0 20 74 61 67 20 74 6f 20 67 65 74 20 74 6f 20 74   tag to get to t
130e0 68 65 20 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a  he signature */.
130f0 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65  .switch (id_type
13100 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45  ) {...case CACKE
13110 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09  Y_ID_TYPE_PIV:..
13120 09 09 6f 75 74 62 75 66 5f 6c 65 6e 20 3d 20 72  ..outbuf_len = r
13130 65 74 76 61 6c 3b 0a 09 09 09 6f 75 74 62 75 66  etval;....outbuf
13140 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  _p = cackey_read
13150 5f 62 65 72 74 6c 76 5f 74 61 67 28 6f 75 74 62  _bertlv_tag(outb
13160 75 66 2c 20 26 6f 75 74 62 75 66 5f 6c 65 6e 2c  uf, &outbuf_len,
13170 20 30 78 37 43 2c 20 4e 55 4c 4c 2c 20 20 26 6f   0x7C, NULL,  &o
13180 75 74 62 75 66 5f 6c 65 6e 29 3b 0a 09 09 09 69  utbuf_len);....i
13190 66 20 28 6f 75 74 62 75 66 5f 70 20 3d 3d 20 4e  f (outbuf_p == N
131a0 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  ULL) {.....CACKE
131b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
131c0 52 65 73 70 6f 6e 73 65 20 66 72 6f 6d 20 50 49  Response from PI
131d0 56 20 66 6f 72 20 47 45 4e 45 52 41 54 45 20 41  V for GENERATE A
131e0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 77 61  UTHENTICATION wa
131f0 73 20 6e 6f 74 20 61 20 30 78 37 43 20 74 61 67  s not a 0x7C tag
13200 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
13210 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 09 72  ailure");......r
13220 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
13230 0a 09 09 09 72 65 74 76 61 6c 20 3d 20 6f 75 74  ....retval = out
13240 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09 6f 75 74  buf_len;.....out
13250 62 75 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c  buf_len = retval
13260 3b 0a 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20  ;....outbuf_p = 
13270 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74  cackey_read_bert
13280 6c 76 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26  lv_tag(outbuf, &
13290 6f 75 74 62 75 66 5f 6c 65 6e 2c 20 30 78 38 32  outbuf_len, 0x82
132a0 2c 20 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66  , NULL,  &outbuf
132b0 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75  _len);....if (ou
132c0 74 62 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20  tbuf_p == NULL) 
132d0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
132e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f  UG_PRINTF("Respo
132f0 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72  nse from PIV for
13300 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e   GENERATE AUTHEN
13310 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74  TICATION was not
13320 20 61 20 30 78 38 32 20 77 69 74 68 20 74 68 65   a 0x82 with the
13330 6e 20 30 78 37 43 20 74 61 67 2c 20 72 65 74 75  n 0x7C tag, retu
13340 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
13350 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
13360 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65  -1);....}.....re
13370 74 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65  tval = outbuf_le
13380 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  n;.....break;...
13390 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
133a0 59 50 45 5f 43 41 43 3a 0a 09 09 63 61 73 65 20  YPE_CAC:...case 
133b0 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
133c0 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62 72 65  ERT_ONLY:....bre
133d0 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 6e 70 61  ak;..}.../* Unpa
133e0 64 20 72 65 70 6c 79 20 2a 2f 0a 09 69 66 20 28  d reply */..if (
133f0 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09  unpadOutput) {..
13400 09 69 66 20 28 72 65 74 76 61 6c 20 3c 20 33 29  .if (retval < 3)
13410 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
13420 55 47 5f 50 52 49 4e 54 46 28 22 52 65 70 6c 79  UG_PRINTF("Reply
13430 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 77   is too small, w
13440 65 20 61 72 65 20 6e 6f 74 20 61 62 6c 65 20 74  e are not able t
13450 6f 20 75 6e 70 61 64 20 2d 2d 20 70 61 73 73 69  o unpad -- passi
13460 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69  ng back and hopi
13470 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21  ng for the best!
13480 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ");.....CACKEY_D
13490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
134a0 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
134b0 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
134c0 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
134d0 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74   retval);....ret
134e0 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d  urn(retval);...}
134f0 0a 0a 09 09 69 66 20 28 6f 75 74 62 75 66 5b 30  ....if (outbuf[0
13500 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] != 0x00) {....
13510 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
13520 4e 54 46 28 22 55 6e 72 65 63 6f 67 6e 69 7a 65  NTF("Unrecognize
13530 64 20 70 61 64 64 69 6e 67 20 73 63 68 65 6d 65  d padding scheme
13540 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b   -- passing back
13550 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20   and hoping for 
13560 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09  the best!");....
13570 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13580 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
13590 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 76  in success, retv
135a0 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29  al = %li (bytes)
135b0 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c  ", (long) retval
135c0 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
135d0 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 62 6c 6f  val);...}....blo
135e0 63 6b 74 79 70 65 20 3d 20 6f 75 74 62 75 66 5b  cktype = outbuf[
135f0 31 5d 3b 0a 09 09 75 6e 70 61 64 6f 66 66 73 65  1];...unpadoffse
13600 74 20 3d 20 30 3b 0a 0a 09 09 73 77 69 74 63 68  t = 0;....switch
13610 20 28 62 6c 6f 63 6b 74 79 70 65 29 20 7b 0a 09   (blocktype) {..
13620 09 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09  ..case 0x00:....
13630 09 2f 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65  ./* Padding Sche
13640 6d 65 20 31 2c 20 74 68 65 20 66 69 72 73 74 20  me 1, the first 
13650 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 20 69 73  non-zero byte is
13660 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 64 61   the start of da
13670 74 61 20 2a 2f 0a 09 09 09 09 66 6f 72 20 28 75  ta */.....for (u
13680 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 32 3b 20  npadoffset = 2; 
13690 75 6e 70 61 64 6f 66 66 73 65 74 20 3c 20 72 65  unpadoffset < re
136a0 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66 66 73 65  tval; unpadoffse
136b0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28  t++) {......if (
136c0 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73  outbuf[unpadoffs
136d0 65 74 5d 20 21 3d 20 30 78 30 30 29 20 7b 0a 09  et] != 0x00) {..
136e0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
136f0 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  .}.....}.....bre
13700 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 31  ak;....case 0x01
13710 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67  :...../* Padding
13720 20 53 63 68 65 6d 65 20 32 2c 20 70 61 64 20 62   Scheme 2, pad b
13730 79 74 65 73 20 61 72 65 20 30 78 46 46 20 66 6f  ytes are 0xFF fo
13740 6c 6c 6f 77 65 64 20 62 79 20 30 78 30 30 20 2a  llowed by 0x00 *
13750 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
13760 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
13770 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
13780 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
13790 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
137a0 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
137b0 21 3d 20 30 78 46 46 29 20 7b 0a 09 09 09 09 09  != 0xFF) {......
137c0 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61  .if (outbuf[unpa
137d0 64 6f 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30  doffset] == 0x00
137e0 29 20 7b 0a 09 09 09 09 09 09 09 75 6e 70 61 64  ) {........unpad
137f0 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09  offset++;.......
13800 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 7d  ..break;.......}
13810 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 43   else {........C
13820 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13830 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64 64  TF("Invalid padd
13840 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c 20  ing data found, 
13850 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
13860 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61 76  lure, should hav
13870 65 20 62 65 65 6e 20 30 78 30 30 20 66 6f 75 6e  e been 0x00 foun
13880 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73 69  d 0x%02x", (unsi
13890 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75 66  gned int) outbuf
138a0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b 0a  [unpadoffset]);.
138b0 0a 09 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d  ........return(-
138c0 31 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09  1);.......}.....
138d0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
138e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
138f0 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70 61 64  NTF("Invalid pad
13900 64 69 6e 67 20 64 61 74 61 20 66 6f 75 6e 64 2c  ding data found,
13910 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
13920 69 6c 75 72 65 2c 20 73 68 6f 75 6c 64 20 68 61  ilure, should ha
13930 76 65 20 62 65 65 6e 20 30 78 46 46 20 66 6f 75  ve been 0xFF fou
13940 6e 64 20 30 78 25 30 32 78 22 2c 20 28 75 6e 73  nd 0x%02x", (uns
13950 69 67 6e 65 64 20 69 6e 74 29 20 6f 75 74 62 75  igned int) outbu
13960 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 29 3b  f[unpadoffset]);
13970 0a 0a 09 09 09 09 09 09 72 65 74 75 72 6e 28 2d  ........return(-
13980 31 29 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  1);......}.....}
13990 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
139a0 61 73 65 20 30 78 30 32 3a 0a 09 09 09 09 2f 2a  ase 0x02:...../*
139b0 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20   Padding Scheme 
139c0 33 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 65  3, pad bytes are
139d0 20 6e 6f 6e 2d 7a 65 72 6f 20 66 69 72 73 74 20   non-zero first 
139e0 7a 65 72 6f 20 62 79 74 65 20 66 6f 75 6e 64 20  zero byte found 
139f0 69 73 20 74 68 65 20 73 65 70 65 72 61 74 6f 72  is the seperator
13a00 20 62 79 74 65 20 2a 2f 0a 09 09 09 09 66 6f 72   byte */.....for
13a10 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
13a20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c  2; unpadoffset <
13a30 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66   retval; unpadof
13a40 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69  fset++) {......i
13a50 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
13a60 66 66 73 65 74 5d 20 3d 3d 20 30 78 30 30 29 20  ffset] == 0x00) 
13a70 7b 0a 09 09 09 09 09 09 75 6e 70 61 64 6f 66 66  {.......unpadoff
13a80 73 65 74 2b 2b 3b 0a 0a 09 09 09 09 09 09 62 72  set++;........br
13a90 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  eak;......}.....
13aa0 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  }.....break;...}
13ab0 0a 0a 09 09 69 66 20 28 75 6e 70 61 64 6f 66 66  ....if (unpadoff
13ac0 73 65 74 20 3e 20 72 65 74 76 61 6c 29 20 7b 0a  set > retval) {.
13ad0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13ae0 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 67  PRINTF("Offset g
13af0 72 65 61 74 65 72 20 74 68 61 6e 20 72 65 70 6c  reater than repl
13b00 79 20 73 69 7a 65 2c 20 61 62 6f 72 74 69 6e 67  y size, aborting
13b10 2e 20 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  .  (unpadoffset 
13b20 3d 20 25 6c 75 2c 20 72 65 74 76 61 6c 20 3d 20  = %lu, retval = 
13b30 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
13b40 20 6c 6f 6e 67 29 20 75 6e 70 61 64 6f 66 66 73   long) unpadoffs
13b50 65 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  et, (unsigned lo
13b60 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  ng) retval);....
13b70 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
13b80 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13b90 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64 65  _PRINTBUF("Padde
13ba0 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72 65 74  d:", outbuf, ret
13bb0 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20  val);....retval 
13bc0 2d 3d 20 75 6e 70 61 64 6f 66 66 73 65 74 3b 0a  -= unpadoffset;.
13bd0 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75 66  ..memmove(outbuf
13be0 2c 20 6f 75 74 62 75 66 20 2b 20 75 6e 70 61 64  , outbuf + unpad
13bf0 6f 66 66 73 65 74 2c 20 72 65 74 76 61 6c 29 3b  offset, retval);
13c00 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
13c10 5f 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64  _PRINTBUF("Unpad
13c20 64 65 64 3a 22 2c 20 6f 75 74 62 75 66 2c 20 72  ded:", outbuf, r
13c30 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 0a 09 43 41  etval);..}....CA
13c40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
13c50 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  F("Returning in 
13c60 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c 20  success, retval 
13c70 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c 20  = %li (bytes)", 
13c80 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b 0a  (long) retval);.
13c90 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
13ca0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
13cb0 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
13cc0 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
13cd0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
13ce0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
13cf0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
13d00 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
13d10 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
13d20 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 6c  key_ret cackey_l
13d30 6f 67 69 6e 28 73 74 72 75 63 74 20 63 61 63 6b  ogin(struct cack
13d40 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75  ey_slot *slot, u
13d50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 69  nsigned char *pi
13d60 6e 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  n, unsigned long
13d70 20 70 69 6e 5f 6c 65 6e 2c 20 69 6e 74 20 2a 74   pin_len, int *t
13d80 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
13d90 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ) {..unsigned ch
13da0 61 72 20 63 61 63 5f 70 69 6e 5b 38 5d 20 3d 20  ar cac_pin[8] = 
13db0 7b 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46  {0xFF, 0xFF, 0xF
13dc0 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30  F, 0xFF, 0xFF, 0
13dd0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 7d  xFF, 0xFF, 0xFF}
13de0 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
13df0 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e 74 20  onse_code;..int 
13e00 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b  tries_remaining;
13e10 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
13e20 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72 65 6e  .int key_referen
13e30 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f 2a 20  ce = 0x00;.../* 
13e40 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 77 65  Indicate that we
13e50 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61 62 6f   do not know abo
13e60 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72 69 65  ut how many trie
13e70 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e 67 20  s are remaining 
13e80 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f 72 65  */..if (tries_re
13e90 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 2a  maining_p) {...*
13ea0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
13eb0 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f 2a 20  p = -1;..}.../* 
13ec0 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41 43 20  Apparently, CAC 
13ed0 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43 54 4c  PINs are *EXACTL
13ee0 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e 67 20  Y* 8 bytes long 
13ef0 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78 46 46  -- pad with 0xFF
13f00 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20 2a 2f   if too short */
13f10 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20 3e 3d  ..if (pin_len >=
13f20 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63   8) {...memcpy(c
13f30 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38 29 3b  ac_pin, pin, 8);
13f40 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
13f50 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e  cpy(cac_pin, pin
13f60 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a  , pin_len);..}..
13f70 09 2f 2a 20 49 73 73 75 65 20 50 49 4e 20 56 65  ./* Issue PIN Ve
13f80 72 69 66 79 20 2a 2f 0a 09 73 65 6e 64 5f 72 65  rify */..send_re
13f90 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
13fa0 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53  apdu(slot, GSCIS
13fb0 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20  _CLASS_ISO7816, 
13fc0 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49  GSCIS_INSTR_VERI
13fd0 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65  FY, 0x00, key_re
13fe0 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28  ference, sizeof(
13ff0 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69  cac_pin), cac_pi
14000 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e  n, 0x00, &respon
14010 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e  se_code, NULL, N
14020 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f  ULL);..if (send_
14030 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
14040 53 43 5f 53 5f 4f 4b 20 26 26 20 72 65 73 70 6f  SC_S_OK && respo
14050 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 41  nse_code == 0x6A
14060 38 38 29 20 7b 0a 09 09 6b 65 79 5f 72 65 66 65  88) {...key_refe
14070 72 65 6e 63 65 20 3d 20 30 78 38 30 3b 0a 0a 09  rence = 0x80;...
14080 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
14090 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
140a0 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  t, GSCIS_CLASS_I
140b0 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e  SO7816, GSCIS_IN
140c0 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30  STR_VERIFY, 0x00
140d0 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c  , key_reference,
140e0 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29   sizeof(cac_pin)
140f0 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c  , cac_pin, 0x00,
14100 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c   &response_code,
14110 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 7d   NULL, NULL);..}
14120 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
14130 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
14140 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 28 72 65  _OK) {...if ((re
14150 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20 30 78  sponse_code & 0x
14160 36 33 43 30 29 20 3d 3d 20 30 78 36 33 43 30 29  63C0) == 0x63C0)
14170 20 7b 0a 09 09 09 74 72 69 65 73 5f 72 65 6d 61   {....tries_rema
14180 69 6e 69 6e 67 20 3d 20 28 72 65 73 70 6f 6e 73  ining = (respons
14190 65 5f 63 6f 64 65 20 26 20 30 78 46 29 3b 0a 0a  e_code & 0xF);..
141a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
141b0 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65 72 69  PRINTF("PIN Veri
141c0 66 69 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 2c  fication failed,
141d0 20 25 69 20 74 72 69 65 73 20 72 65 6d 61 69 6e   %i tries remain
141e0 69 6e 67 22 2c 20 74 72 69 65 73 5f 72 65 6d 61  ing", tries_rema
141f0 69 6e 69 6e 67 29 3b 0a 0a 09 09 09 69 66 20 28  ining);.....if (
14200 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f  tries_remaining_
14210 70 29 20 7b 0a 09 09 09 09 2a 74 72 69 65 73 5f  p) {.....*tries_
14220 72 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 74 72  remaining_p = tr
14230 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 3b 0a 09  ies_remaining;..
14240 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ..}.....return(C
14250 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44  ACKEY_PCSC_E_BAD
14260 50 49 4e 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  PIN);...}....if 
14270 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 3d  (response_code =
14280 3d 20 30 78 36 39 38 33 29 20 7b 0a 09 09 09 43  = 0x6983) {....C
14290 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
142a0 54 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61  TF("PIN Verifica
142b0 74 69 6f 6e 20 66 61 69 6c 65 64 2c 20 64 65 76  tion failed, dev
142c0 69 63 65 20 69 73 20 6c 6f 63 6b 65 64 22 29 3b  ice is locked");
142d0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
142e0 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
142f0 29 3b 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e  );...}....return
14300 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
14310 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
14320 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14330 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
14340 69 6f 6e 20 73 75 63 63 65 65 64 65 64 22 29 3b  ion succeeded");
14350 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
14360 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
14370 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
14380 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
14390 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
143a0 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
143b0 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
143c0 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
143d0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
143e0 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
143f0 65 74 20 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  et cackey_token_
14400 70 72 65 73 65 6e 74 28 73 74 72 75 63 74 20 63  present(struct c
14410 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
14420 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
14430 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
14440 3b 0a 09 44 57 4f 52 44 20 72 65 61 64 65 72 5f  ;..DWORD reader_
14450 6c 65 6e 20 3d 20 30 2c 20 73 74 61 74 65 20 3d  len = 0, state =
14460 20 30 2c 20 70 72 6f 74 6f 63 6f 6c 20 3d 20 30   0, protocol = 0
14470 2c 20 61 74 72 5f 6c 65 6e 3b 0a 09 42 59 54 45  , atr_len;..BYTE
14480 20 61 74 72 5b 4d 41 58 5f 41 54 52 5f 53 49 5a   atr[MAX_ATR_SIZ
14490 45 5d 3b 0a 09 4c 4f 4e 47 20 73 74 61 74 75 73  E];..LONG status
144a0 5f 72 65 74 2c 20 73 63 61 72 64 5f 72 65 63 6f  _ret, scard_reco
144b0 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nn_ret;...CACKEY
144c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
144d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
144e0 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61 6c 29 20  slot->internal) 
144f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
14500 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
14510 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74  ng token present
14520 20 28 69 6e 74 65 72 6e 61 6c 20 74 6f 6b 65 6e   (internal token
14530 29 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  )");....return(C
14540 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
14550 45 4e 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a 0a  ENPRESENT);..}..
14560 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  .pcsc_connect_re
14570 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
14580 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
14590 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
145a0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
145b0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
145c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
145d0 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e  F("Unable to con
145e0 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65  nect to card, re
145f0 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62  turning token ab
14600 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75 72  sent");....retur
14610 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
14620 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 7d  TOKENABSENT);..}
14630 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d 20 73 69 7a  ...atr_len = siz
14640 65 6f 66 28 61 74 72 29 3b 0a 09 73 74 61 74 75  eof(atr);..statu
14650 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61  s_ret = SCardSta
14660 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  tus(slot->pcsc_c
14670 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64  ard, NULL, &read
14680 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20  er_len, &state, 
14690 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20  &protocol, atr, 
146a0 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  &atr_len);...if 
146b0 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53  (status_ret == S
146c0 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48  CARD_E_INVALID_H
146d0 41 4e 44 4c 45 29 20 7b 0a 09 09 43 41 43 4b 45  ANDLE) {...CACKE
146e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
146f0 53 43 61 72 64 53 74 61 74 75 73 28 29 20 72 65  SCardStatus() re
14700 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 49  turned SCARD_E_I
14710 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 2c 20 6d  NVALID_HANDLE, m
14720 61 72 6b 69 6e 67 20 69 73 20 6e 6f 74 20 61 6c  arking is not al
14730 72 65 61 64 79 20 63 6f 6e 6e 65 63 74 65 64 20  ready connected 
14740 61 6e 64 20 74 72 79 69 6e 67 20 61 67 61 69 6e  and trying again
14750 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  ");...cackey_mar
14760 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
14770 74 29 3b 0a 0a 09 09 70 63 73 63 5f 63 6f 6e 6e  t);....pcsc_conn
14780 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ect_ret = cackey
14790 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  _connect_card(sl
147a0 6f 74 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f  ot);...if (pcsc_
147b0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
147c0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
147d0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
147e0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
147f0 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20  e to connect to 
14800 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  card, returning 
14810 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a  token absent");.
14820 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
14830 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
14840 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a 09 09 61 74  SENT);...}....at
14850 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61  r_len = sizeof(a
14860 74 72 29 3b 0a 09 09 73 74 61 74 75 73 5f 72 65  tr);...status_re
14870 74 20 3d 20 53 43 61 72 64 53 74 61 74 75 73 28  t = SCardStatus(
14880 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
14890 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c   NULL, &reader_l
148a0 65 6e 2c 20 26 73 74 61 74 65 2c 20 26 70 72 6f  en, &state, &pro
148b0 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72  tocol, atr, &atr
148c0 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _len);..}...if (
148d0 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20 53 43  status_ret != SC
148e0 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
148f0 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
14900 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
14910 0a 0a 09 09 69 66 20 28 73 74 61 74 75 73 5f 72  ....if (status_r
14920 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52 45  et == SCARD_W_RE
14930 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09 43  SET_CARD) {....C
14940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14950 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69 72  TF("Reset requir
14960 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64 2e  ed, please hold.
14970 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f  ..");.....scard_
14980 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63  reconn_ret = cac
14990 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61  key_reconnect_ca
149a0 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f 50  rd(slot, SCARD_P
149b0 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
149c0 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
149d0 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 69  &protocol);....i
149e0 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  f (scard_reconn_
149f0 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
14a00 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 2f 2a  UCCESS) {...../*
14a10 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63 6f 6c   Update protocol
14a20 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 72   */.....slot->pr
14a30 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f 63 6f  otocol = protoco
14a40 6c 3b 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73  l;....../* Re-es
14a50 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74  tablish transact
14a60 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70  ion, if it was p
14a70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66  resent */.....if
14a80 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
14a90 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
14aa0 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
14ab0 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
14ac0 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e  ......slot->tran
14ad0 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
14ae0 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63  lock = 1;......c
14af0 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e  ackey_begin_tran
14b00 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09  saction(slot);..
14b10 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
14b20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14b30 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c  eset successful,
14b40 20 72 65 71 75 65 72 79 69 6e 67 22 29 3b 0a 09   requerying");..
14b50 09 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20  ...status_ret = 
14b60 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74  SCardStatus(slot
14b70 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c  ->pcsc_card, NUL
14b80 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20  L, &reader_len, 
14b90 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f  &state, &protoco
14ba0 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e  l, atr, &atr_len
14bb0 29 3b 0a 09 09 09 09 69 66 20 28 73 74 61 74 75  );.....if (statu
14bc0 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  s_ret != SCARD_S
14bd0 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
14be0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14bf0 49 4e 54 46 28 22 53 74 69 6c 6c 20 75 6e 61 62  INTF("Still unab
14c00 6c 65 20 74 6f 20 71 75 65 72 79 20 63 61 72 64  le to query card
14c10 20 73 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69   status, returni
14c20 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e  ng token absent.
14c30 20 20 53 43 61 72 64 53 74 61 74 75 73 28 29 20    SCardStatus() 
14c40 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45  = %s", CACKEY_DE
14c50 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
14c60 52 5f 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f  R_TO_STR(status_
14c70 72 65 74 29 29 3b 0a 0a 09 09 09 09 09 72 65 74  ret));.......ret
14c80 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
14c90 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
14ca0 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20  ....}....} else 
14cb0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
14cc0 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c  UG_PRINTF("Unabl
14cd0 65 20 74 6f 20 72 65 63 6f 6e 6e 65 63 74 20 74  e to reconnect t
14ce0 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e  o card, returnin
14cf0 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20  g token absent. 
14d00 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28   SCardReconnect(
14d10 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59 5f  ) = %s", CACKEY_
14d20 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
14d30 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
14d40 5f 72 65 63 6f 6e 6e 5f 72 65 74 29 29 3b 0a 0a  _reconn_ret));..
14d50 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
14d60 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
14d70 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20  SENT);....}...} 
14d80 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
14d90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
14da0 6e 61 62 6c 65 20 74 6f 20 71 75 65 72 79 20 63  nable to query c
14db0 61 72 64 20 73 74 61 74 75 73 2c 20 72 65 74 75  ard status, retu
14dc0 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65  rning token abse
14dd0 6e 74 2e 20 20 53 43 61 72 64 53 74 61 74 75 73  nt.  SCardStatus
14de0 28 29 20 3d 20 25 73 22 2c 20 43 41 43 4b 45 59  () = %s", CACKEY
14df0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
14e00 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 74 61 74  DERR_TO_STR(stat
14e10 75 73 5f 72 65 74 29 29 3b 0a 0a 09 09 09 72 65  us_ret));.....re
14e20 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
14e30 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
14e40 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 28 73  ...}..}...if ((s
14e50 74 61 74 65 20 26 20 53 43 41 52 44 5f 41 42 53  tate & SCARD_ABS
14e60 45 4e 54 29 20 3d 3d 20 53 43 41 52 44 5f 41 42  ENT) == SCARD_AB
14e70 53 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  SENT) {...CACKEY
14e80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
14e90 61 72 64 20 69 73 20 61 62 73 65 6e 74 2c 20 72  ard is absent, r
14ea0 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
14eb0 62 73 65 6e 74 22 29 3b 0a 0a 09 09 72 65 74 75  bsent");....retu
14ec0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
14ed0 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09  _TOKENABSENT);..
14ee0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
14ef0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
14f00 6e 67 20 74 6f 6b 65 6e 20 70 72 65 73 65 6e 74  ng token present
14f10 2e 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  .");...return(CA
14f20 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45  CKEY_PCSC_S_TOKE
14f30 4e 50 52 45 53 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a  NPRESENT);.}../*
14f40 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
14f50 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
14f60 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
14f70 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
14f80 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
14f90 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
14fa0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
14fb0 74 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61  tatic ssize_t ca
14fc0 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
14fd0 74 79 5f 74 6f 5f 6c 61 62 65 6c 28 73 74 72 75  ty_to_label(stru
14fe0 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
14ff0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
15000 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  y, unsigned char
15010 20 2a 6c 61 62 65 6c 5f 62 75 66 2c 20 75 6e 73   *label_buf, uns
15020 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 61 62 65 6c  igned long label
15030 5f 62 75 66 5f 6c 65 6e 29 20 7b 0a 09 75 6e 73  _buf_len) {..uns
15040 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 69  igned long certi
15050 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 76 6f 69  ficate_len;..voi
15060 64 20 2a 6c 61 62 65 6c 5f 61 73 6e 31 3b 0a 09  d *label_asn1;..
15070 76 6f 69 64 20 2a 63 65 72 74 69 66 69 63 61 74  void *certificat
15080 65 3b 0a 09 69 6e 74 20 78 35 30 39 5f 72 65 61  e;..int x509_rea
15090 64 5f 72 65 74 3b 0a 0a 09 63 65 72 74 69 66 69  d_ret;...certifi
150a0 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  cate = identity-
150b0 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63  >certificate;..c
150c0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
150d0 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69   identity->certi
150e0 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66  ficate_len;...if
150f0 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
15100 6e 20 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72  n < 0) {...retur
15110 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39  n(-1);..}...x509
15120 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
15130 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72 74  _to_subject(cert
15140 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69  ificate, certifi
15150 63 61 74 65 5f 6c 65 6e 2c 20 28 76 6f 69 64 20  cate_len, (void 
15160 2a 2a 29 20 26 6c 61 62 65 6c 5f 61 73 6e 31 29  **) &label_asn1)
15170 3b 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ;..if (x509_read
15180 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 72 65  _ret < 0) {...re
15190 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 78  turn(-1);..}...x
151a0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
151b0 35 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67  509_dn_to_string
151c0 28 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30  (label_asn1, x50
151d0 39 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61  9_read_ret, (cha
151e0 72 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20  r *) label_buf, 
151f0 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 22  label_buf_len, "
15200 43 4e 22 29 3b 0a 09 69 66 20 28 78 35 30 39 5f  CN");..if (x509_
15210 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b  read_ret <= 0) {
15220 0a 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
15230 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f 5f 73 74   = x509_dn_to_st
15240 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73 6e 31 2c  ring(label_asn1,
15250 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 2c 20   x509_read_ret, 
15260 28 63 68 61 72 20 2a 29 20 6c 61 62 65 6c 5f 62  (char *) label_b
15270 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  uf, label_buf_le
15280 6e 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 69 66 20  n, NULL);....if 
15290 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
152a0 3d 20 30 29 20 7b 0a 09 09 09 72 65 74 75 72 6e  = 0) {....return
152b0 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69  (-1);...}..}..#i
152c0 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41  fdef CACKEY_PARA
152d0 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50  NOID.#  ifdef _P
152e0 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09  OSIX_SSIZE_MAX..
152f0 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
15300 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  t > _POSIX_SSIZE
15310 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59  _MAX) {...CACKEY
15320 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 78  _DEBUG_PRINTF("x
15330 35 30 39 5f 72 65 61 64 5f 72 65 74 20 65 78 63  509_read_ret exc
15340 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c  eeds maximum val
15350 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ue, returning in
15360 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d   failure. (max =
15370 20 25 6c 69 2c 20 78 35 30 39 5f 72 65 61 64 5f   %li, x509_read_
15380 72 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  ret = %lu)", (lo
15390 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
153a0 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
153b0 6c 6f 6e 67 29 20 78 35 30 39 5f 72 65 61 64 5f  long) x509_read_
153c0 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
153d0 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64 69 66  -1);..}.#  endif
153e0 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e  .#endif...return
153f0 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b  (x509_read_ret);
15400 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30  .}../* Returns 0
15410 20 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73   on success */.s
15420 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
15430 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 76 6f  _mutex_create(vo
15440 69 64 20 2a 2a 6d 75 74 65 78 29 20 7b 0a 09 70  id **mutex) {..p
15450 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a  thread_mutex_t *
15460 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
15470 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74 76  int pthread_retv
15480 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f  al;..CK_RV custo
15490 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  m_retval;...CACK
154a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
154b0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
154c0 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 66   ((cackey_args.f
154d0 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f  lags & CKF_OS_LO
154e0 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46  CKING_OK) == CKF
154f0 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20  _OS_LOCKING_OK) 
15500 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74 65  {...pthread_mute
15510 78 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  x = malloc(sizeo
15520 66 28 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78  f(*pthread_mutex
15530 29 29 3b 0a 09 09 69 66 20 28 21 70 74 68 72 65  ));...if (!pthre
15540 61 64 5f 6d 75 74 65 78 29 20 7b 0a 09 09 09 43  ad_mutex) {....C
15550 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15560 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 61 6c  TF("Failed to al
15570 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 2e 22 29  locate memory.")
15580 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
15590 3b 0a 09 09 7d 0a 0a 09 09 70 74 68 72 65 61 64  ;...}....pthread
155a0 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
155b0 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70 74 68  d_mutex_init(pth
155c0 72 65 61 64 5f 6d 75 74 65 78 2c 20 4e 55 4c 4c  read_mutex, NULL
155d0 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64  );...if (pthread
155e0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
155f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15600 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f  PRINTF("pthread_
15610 6d 75 74 65 78 5f 69 6e 69 74 28 29 20 72 65 74  mutex_init() ret
15620 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
15630 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
15640 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
15650 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2a 6d 75 74  -1);...}....*mut
15660 65 78 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  ex = pthread_mut
15670 65 78 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ex;..} else {...
15680 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  if (cackey_args.
15690 43 72 65 61 74 65 4d 75 74 65 78 29 20 7b 0a 09  CreateMutex) {..
156a0 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20  ..custom_retval 
156b0 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72  = cackey_args.Cr
156c0 65 61 74 65 4d 75 74 65 78 28 6d 75 74 65 78 29  eateMutex(mutex)
156d0 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f 6d  ;.....if (custom
156e0 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f 4f  _retval != CKR_O
156f0 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
15700 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61  DEBUG_PRINTF("ca
15710 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
15720 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64  Mutex() returned
15730 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20   error (%li).", 
15740 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65  (long) custom_re
15750 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75  tval);......retu
15760 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d  rn(-1);....}...}
15770 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
15780 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
15790 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79  ning sucessfully
157a0 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e   (0)");...return
157b0 28 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  (0);.}../* Retur
157c0 6e 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20  ns 0 on success 
157d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  */.static int ca
157e0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
157f0 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a 09  void *mutex) {..
15800 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20  pthread_mutex_t 
15810 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a  *pthread_mutex;.
15820 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65 74  .int pthread_ret
15830 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73 74  val;..CK_RV cust
15840 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  om_retval;...CAC
15850 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15860 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
15870 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  f ((cackey_args.
15880 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f 4c  flags & CKF_OS_L
15890 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b  OCKING_OK) == CK
158a0 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
158b0 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75 74   {...pthread_mut
158c0 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09 70  ex = mutex;....p
158d0 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d 20  thread_retval = 
158e0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f  pthread_mutex_lo
158f0 63 6b 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ck(pthread_mutex
15900 29 3b 0a 09 09 69 66 20 28 70 74 68 72 65 61 64  );...if (pthread
15910 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
15920 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15930 50 52 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f  PRINTF("pthread_
15940 6d 75 74 65 78 5f 6c 6f 63 6b 28 29 20 72 65 74  mutex_lock() ret
15950 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
15960 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
15970 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
15980 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  -1);...}..} else
15990 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
159a0 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 29 20  args.LockMutex) 
159b0 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
159c0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
159d0 2e 4c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78  .LockMutex(mutex
159e0 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
159f0 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
15a00 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
15a10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
15a20 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d  ackey_args.LockM
15a30 75 74 65 78 28 29 20 72 65 74 75 72 6e 65 64 20  utex() returned 
15a40 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c 20 28  error (%li).", (
15a50 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72 65 74  long) custom_ret
15a60 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  val);......retur
15a70 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a  n(-1);....}...}.
15a80 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
15a90 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15aa0 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c 79 20  ing sucessfully 
15ab0 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  (0)");...return(
15ac0 30 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  0);.}../* Return
15ad0 73 20 30 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  s 0 on success *
15ae0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  /.static int cac
15af0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
15b00 28 76 6f 69 64 20 2a 6d 75 74 65 78 29 20 7b 0a  (void *mutex) {.
15b10 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 74  .pthread_mutex_t
15b20 20 2a 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b   *pthread_mutex;
15b30 0a 09 69 6e 74 20 70 74 68 72 65 61 64 5f 72 65  ..int pthread_re
15b40 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 63 75 73  tval;..CK_RV cus
15b50 74 6f 6d 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tom_retval;...CA
15b60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15b70 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
15b80 69 66 20 28 28 63 61 63 6b 65 79 5f 61 72 67 73  if ((cackey_args
15b90 2e 66 6c 61 67 73 20 26 20 43 4b 46 5f 4f 53 5f  .flags & CKF_OS_
15ba0 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 3d 3d 20 43  LOCKING_OK) == C
15bb0 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
15bc0 29 20 7b 0a 09 09 70 74 68 72 65 61 64 5f 6d 75  ) {...pthread_mu
15bd0 74 65 78 20 3d 20 6d 75 74 65 78 3b 0a 0a 09 09  tex = mutex;....
15be0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
15bf0 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
15c00 6e 6c 6f 63 6b 28 70 74 68 72 65 61 64 5f 6d 75  nlock(pthread_mu
15c10 74 65 78 29 3b 0a 09 09 69 66 20 28 70 74 68 72  tex);...if (pthr
15c20 65 61 64 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  ead_retval != 0)
15c30 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
15c40 55 47 5f 50 52 49 4e 54 46 28 22 70 74 68 72 65  UG_PRINTF("pthre
15c50 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ad_mutex_unlock(
15c60 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
15c70 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65 61 64   (%i).", pthread
15c80 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 72 65  _retval);.....re
15c90 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 09 7d  turn(-1);...}..}
15ca0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61   else {...if (ca
15cb0 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b  ckey_args.Unlock
15cc0 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
15cd0 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
15ce0 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
15cf0 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
15d00 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
15d10 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
15d20 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15d30 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
15d40 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28  rgs.UnlockMutex(
15d50 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
15d60 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
15d70 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
15d80 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
15d90 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
15da0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15db0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
15dc0 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
15dd0 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
15de0 0a 0a 73 74 61 74 69 63 20 43 4b 5f 41 54 54 52  ..static CK_ATTR
15df0 49 42 55 54 45 5f 50 54 52 20 63 61 63 6b 65 79  IBUTE_PTR cackey
15e00 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
15e10 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53 20  CK_OBJECT_CLASS 
15e20 6f 62 6a 65 63 74 63 6c 61 73 73 2c 20 73 74 72  objectclass, str
15e30 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
15e40 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
15e50 74 79 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ty, unsigned lon
15e60 67 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 2c 20  g identity_num, 
15e70 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
15e80 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63  Count) {..static
15e90 20 43 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 74 72 75   CK_BBOOL ck_tru
15ea0 65 20 3d 20 31 3b 0a 09 73 74 61 74 69 63 20 43  e = 1;..static C
15eb0 4b 5f 42 42 4f 4f 4c 20 63 6b 5f 66 61 6c 73 65  K_BBOOL ck_false
15ec0 20 3d 20 30 3b 0a 09 73 74 61 74 69 63 20 43 4b   = 0;..static CK
15ed0 5f 54 52 55 53 54 20 63 6b 5f 74 72 75 73 74 65  _TRUST ck_truste
15ee0 64 20 3d 20 43 4b 5f 54 52 55 53 54 45 44 5f 44  d = CK_TRUSTED_D
15ef0 45 4c 45 47 41 54 4f 52 3b 0a 09 43 4b 5f 55 4c  ELEGATOR;..CK_UL
15f00 4f 4e 47 20 6e 75 6d 61 74 74 72 73 20 3d 20 30  ONG numattrs = 0
15f10 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 3b 0a  , retval_count;.
15f20 09 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 54 59  .CK_ATTRIBUTE_TY
15f30 50 45 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  PE curr_attr_typ
15f40 65 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  e;..CK_ATTRIBUTE
15f50 20 63 75 72 72 5f 61 74 74 72 2c 20 2a 72 65 74   curr_attr, *ret
15f60 76 61 6c 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54  val;..CK_VOID_PT
15f70 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55 4c  R pValue;..CK_UL
15f80 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  ONG ulValueLen;.
15f90 09 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53  .CK_OBJECT_CLASS
15fa0 20 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73   ck_object_class
15fb0 3b 0a 09 43 4b 5f 43 45 52 54 49 46 49 43 41 54  ;..CK_CERTIFICAT
15fc0 45 5f 54 59 50 45 20 63 6b 5f 63 65 72 74 69 66  E_TYPE ck_certif
15fd0 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 43 4b 5f  icate_type;..CK_
15fe0 4b 45 59 5f 54 59 50 45 20 63 6b 5f 6b 65 79 5f  KEY_TYPE ck_key_
15ff0 74 79 70 65 3b 0a 09 43 4b 5f 55 54 46 38 43 48  type;..CK_UTF8CH
16000 41 52 20 75 63 54 6d 70 42 75 66 5b 31 30 32 34  AR ucTmpBuf[1024
16010 5d 3b 0a 09 53 48 41 31 43 6f 6e 74 65 78 74 20  ];..SHA1Context 
16020 73 68 61 31 5f 63 74 78 3b 0a 09 4d 44 35 5f 43  sha1_ctx;..MD5_C
16030 54 58 20 6d 64 35 5f 63 74 78 3b 0a 09 75 69 6e  TX md5_ctx;..uin
16040 74 38 5f 74 20 73 68 61 31 5f 68 61 73 68 5b 53  t8_t sha1_hash[S
16050 48 41 31 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75  HA1HashSize];..u
16060 69 6e 74 38 5f 74 20 6d 64 35 5f 68 61 73 68 5b  int8_t md5_hash[
16070 4d 44 35 48 61 73 68 53 69 7a 65 5d 3b 0a 09 75  MD5HashSize];..u
16080 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
16090 72 74 69 66 69 63 61 74 65 3b 0a 09 73 73 69 7a  rtificate;..ssiz
160a0 65 5f 74 20 63 65 72 74 69 66 69 63 61 74 65 5f  e_t certificate_
160b0 6c 65 6e 20 3d 20 2d 31 2c 20 78 35 30 39 5f 72  len = -1, x509_r
160c0 65 61 64 5f 72 65 74 3b 0a 09 69 6e 74 20 70 56  ead_ret;..int pV
160d0 61 6c 75 65 5f 66 72 65 65 3b 0a 0a 09 43 41 43  alue_free;...CAC
160e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
160f0 28 22 43 61 6c 6c 65 64 20 28 6f 62 6a 65 63 74  ("Called (object
16100 43 6c 61 73 73 20 3d 20 25 6c 75 2c 20 69 64 65  Class = %lu, ide
16110 6e 74 69 74 79 5f 6e 75 6d 20 3d 20 25 6c 75 29  ntity_num = %lu)
16120 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
16130 6e 67 29 20 6f 62 6a 65 63 74 63 6c 61 73 73 2c  ng) objectclass,
16140 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a   identity_num);.
16150 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 30 3b  ..*pulCount = 0;
16160 0a 0a 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
16170 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46  ss != CKO_CERTIF
16180 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74 63  ICATE && objectc
16190 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c  lass != CKO_PUBL
161a0 49 43 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  IC_KEY && object
161b0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49  class != CKO_PRI
161c0 56 41 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65  VATE_KEY && obje
161d0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
161e0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
161f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16200 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
16210 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
16220 4c 29 2c 20 69 6e 76 61 6c 69 64 20 6f 62 6a 65  L), invalid obje
16230 63 74 20 63 6c 61 73 73 22 29 3b 0a 0a 09 09 72  ct class");....r
16240 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
16250 0a 09 2f 2a 20 47 65 74 20 43 65 72 74 20 2a 2f  ../* Get Cert */
16260 0a 09 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d  ..if (identity =
16270 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
16280 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16290 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a  "Returning 0 obj
162a0 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76  ects (NULL), inv
162b0 61 6c 69 64 20 69 64 65 6e 74 69 79 20 70 72 6f  alid identiy pro
162c0 76 69 64 65 64 22 29 3b 0a 0a 09 09 72 65 74 75  vided");....retu
162d0 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 63  rn(NULL);..}...c
162e0 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64 65  ertificate = ide
162f0 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61  ntity->certifica
16300 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74 65  te;..certificate
16310 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d  _len = identity-
16320 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
16330 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69 63  ;...if (certific
16340 61 74 65 5f 6c 65 6e 20 3d 3d 20 2d 31 20 7c 7c  ate_len == -1 ||
16350 20 63 65 72 74 69 66 69 63 61 74 65 20 3d 3d 20   certificate == 
16360 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
16370 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
16380 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
16390 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 69 73 20  ts (NULL), this 
163a0 69 64 65 6e 74 69 74 79 20 64 6f 65 73 20 6e 6f  identity does no
163b0 74 20 68 61 76 65 20 61 6e 20 58 2e 35 30 39 20  t have an X.509 
163c0 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73 6f  certificate asso
163d0 63 69 61 74 65 64 20 77 69 74 68 20 69 74 20 61  ciated with it a
163e0 6e 64 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  nd will not work
163f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
16400 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72  LL);..}.../* Ver
16410 69 66 79 20 74 68 61 74 20 63 65 72 74 69 66 69  ify that certifi
16420 63 61 74 65 20 69 73 20 41 53 4e 2e 31 20 65 6e  cate is ASN.1 en
16430 63 6f 64 65 64 20 58 2e 35 30 39 20 63 65 72 74  coded X.509 cert
16440 69 66 69 63 61 74 65 20 2a 2f 0a 09 69 66 20 28  ificate */..if (
16450 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63  x509_to_serial(c
16460 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
16470 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 4e 55 4c  ificate_len, NUL
16480 4c 29 20 3c 20 30 29 20 7b 0a 09 09 43 41 43 4b  L) < 0) {...CACK
16490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
164a0 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a  "Returning 0 obj
164b0 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 74 68 65  ects (NULL), the
164c0 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
164d0 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  te associated wi
164e0 74 68 20 74 68 69 73 20 69 64 65 6e 74 69 74 79  th this identity
164f0 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 22 29 3b   is not valid");
16500 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29  ....return(NULL)
16510 3b 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 5f 63 6f  ;..}...retval_co
16520 75 6e 74 20 3d 20 36 34 3b 0a 09 72 65 74 76 61  unt = 64;..retva
16530 6c 20 3d 20 6d 61 6c 6c 6f 63 28 72 65 74 76 61  l = malloc(retva
16540 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  l_count * sizeof
16550 28 2a 72 65 74 76 61 6c 29 29 3b 0a 0a 09 66 6f  (*retval));...fo
16560 72 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  r (curr_attr_typ
16570 65 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74 72  e = 0; curr_attr
16580 5f 74 79 70 65 20 3c 20 30 78 63 65 35 33 36 33  _type < 0xce5363
16590 62 66 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79  bf; curr_attr_ty
165a0 70 65 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 75  pe++) {...if (cu
165b0 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 3d 20  rr_attr_type == 
165c0 30 78 38 30 30 29 20 7b 0a 09 09 09 63 75 72 72  0x800) {....curr
165d0 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 78 63  _attr_type = 0xc
165e0 65 35 33 36 33 30 30 3b 0a 09 09 7d 0a 0a 09 09  e536300;...}....
165f0 70 56 61 6c 75 65 5f 66 72 65 65 20 3d 20 30 3b  pValue_free = 0;
16600 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
16610 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ;...ulValueLen =
16620 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a   (CK_LONG) -1;..
16630 09 09 73 77 69 74 63 68 20 28 63 75 72 72 5f 61  ..switch (curr_a
16640 74 74 72 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  ttr_type) {....c
16650 61 73 65 20 43 4b 41 5f 43 4c 41 53 53 3a 0a 09  ase CKA_CLASS:..
16660 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16670 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
16680 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
16690 5f 43 4c 41 53 53 20 28 30 78 25 30 38 6c 78 29  _CLASS (0x%08lx)
166a0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
166b0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
166c0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 63 6b 5f  _type);......ck_
166d0 6f 62 6a 65 63 74 5f 63 6c 61 73 73 20 3d 20 6f  object_class = o
166e0 62 6a 65 63 74 63 6c 61 73 73 3b 0a 0a 09 09 09  bjectclass;.....
166f0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6f 62  .pValue = &ck_ob
16700 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 09 09 09  ject_class;.....
16710 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
16720 65 6f 66 28 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c  eof(ck_object_cl
16730 61 73 73 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ass);......CACKE
16740 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16750 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
16760 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
16770 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
16780 28 43 4b 5f 4f 42 4a 45 43 54 5f 43 4c 41 53 53  (CK_OBJECT_CLASS
16790 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
167a0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
167b0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
167c0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
167d0 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a  .case CKA_TOKEN:
167e0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
167f0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
16800 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
16810 4b 41 5f 54 4f 4b 45 4e 20 28 30 78 25 30 38 6c  KA_TOKEN (0x%08l
16820 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
16830 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
16840 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
16850 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
16860 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
16870 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75   = sizeof(ck_tru
16880 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
16890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
168a0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
168b0 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
168c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
168d0 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
168e0 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
168f0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
16900 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
16910 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
16920 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 09 43 41  _PRIVATE:.....CA
16930 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16940 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
16950 74 72 69 62 75 74 65 20 43 4b 41 5f 50 52 49 56  tribute CKA_PRIV
16960 41 54 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ATE (0x%08lx) ..
16970 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
16980 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
16990 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
169a0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
169b0 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
169c0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
169d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
169e0 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
169f0 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
16a00 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61  are not a Netsca
16a10 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
16a20 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
16a30 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c 75  ....}......pValu
16a40 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
16a50 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
16a60 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
16a70 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
16a80 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
16a90 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
16aa0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
16ab0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
16ac0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
16ad0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
16ae0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
16af0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
16b00 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  k;....case CKA_T
16b10 52 55 53 54 45 44 3a 0a 09 09 09 09 43 41 43 4b  RUSTED:.....CACK
16b20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16b30 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
16b40 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 45  ibute CKA_TRUSTE
16b50 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  D (0x%08lx) ..."
16b60 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16b70 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
16b80 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
16b90 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
16ba0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
16bb0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
16bc0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
16bd0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
16be0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
16bf0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
16c00 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
16c10 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
16c20 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
16c30 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56 61  k_true;.....ulVa
16c40 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
16c50 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09 43  ck_true);......C
16c60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16c70 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69  TF(" ... returni
16c80 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22  ng %lu (%p/%lu)"
16c90 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16ca0 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29  ) *((CK_BBOOL *)
16cb0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
16cc0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16cd0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
16ce0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
16cf0 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c  se CKA_MODIFIABL
16d00 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
16d10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
16d20 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
16d30 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 20   CKA_MODIFIABLE 
16d40 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
16d50 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
16d60 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
16d70 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
16d80 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c  ck_false;.....ul
16d90 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
16da0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09  f(ck_false);....
16db0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16dc0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
16dd0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
16de0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
16df0 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
16e00 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
16e10 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
16e20 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
16e30 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
16e40 09 63 61 73 65 20 43 4b 41 5f 4c 41 42 45 4c 3a  .case CKA_LABEL:
16e50 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16e60 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
16e70 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
16e80 4b 41 5f 4c 41 42 45 4c 20 28 30 78 25 30 38 6c  KA_LABEL (0x%08l
16e90 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
16ea0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
16eb0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 2f  tr_type);....../
16ec0 2a 20 58 58 58 3a 20 44 65 74 65 72 6d 69 6e 65  * XXX: Determine
16ed0 20 6e 61 6d 65 20 2a 2f 0a 09 09 09 09 75 6c 56   name */.....ulV
16ee0 61 6c 75 65 4c 65 6e 20 3d 20 73 6e 70 72 69 6e  alueLen = snprin
16ef0 74 66 28 28 63 68 61 72 20 2a 29 20 75 63 54 6d  tf((char *) ucTm
16f00 70 42 75 66 2c 20 73 69 7a 65 6f 66 28 75 63 54  pBuf, sizeof(ucT
16f10 6d 70 42 75 66 29 2c 20 22 49 64 65 6e 74 69 74  mpBuf), "Identit
16f20 79 20 23 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  y #%lu", (unsign
16f30 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74  ed long) identit
16f40 79 5f 6e 75 6d 29 3b 0a 09 09 09 09 70 56 61 6c  y_num);.....pVal
16f50 75 65 20 3d 20 75 63 54 6d 70 42 75 66 3b 0a 0a  ue = ucTmpBuf;..
16f60 09 09 09 09 69 66 20 28 75 6c 56 61 6c 75 65 4c  ....if (ulValueL
16f70 65 6e 20 3e 3d 20 73 69 7a 65 6f 66 28 75 63 54  en >= sizeof(ucT
16f80 6d 70 42 75 66 29 29 20 7b 0a 09 09 09 09 09 75  mpBuf)) {......u
16f90 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 30 3b 0a 09  lValueLen = 0;..
16fa0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
16fb0 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  L;.....}......CA
16fc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16fd0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16fe0 67 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61  g (%p/%lu)", pVa
16ff0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17000 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17010 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
17020 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45 3a  .case CKA_VALUE:
17030 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17040 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
17050 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
17060 4b 41 5f 56 41 4c 55 45 20 28 30 78 25 30 38 6c  KA_VALUE (0x%08l
17070 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
17080 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
17090 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 73  tr_type);......s
170a0 77 69 74 63 68 20 28 6f 62 6a 65 63 74 63 6c 61  witch (objectcla
170b0 73 73 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20  ss) {......case 
170c0 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3a  CKO_PRIVATE_KEY:
170d0 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
170e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
170f0 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
17100 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
17110 72 65 20 61 20 70 72 69 76 61 74 65 20 6b 65 79  re a private key
17120 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  .");........brea
17130 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f  k;......case CKO
17140 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 3a  _NETSCAPE_TRUST:
17150 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
17160 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17170 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
17180 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
17190 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  re a Netscape tr
171a0 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
171b0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
171c0 09 63 61 73 65 20 43 4b 4f 5f 50 55 42 4c 49 43  .case CKO_PUBLIC
171d0 5f 4b 45 59 3a 0a 09 09 09 09 09 09 69 66 20 28  _KEY:.......if (
171e0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
171f0 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 78  >= 0) {........x
17200 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
17210 35 30 39 5f 74 6f 5f 70 75 62 6b 65 79 28 63 65  509_to_pubkey(ce
17220 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
17230 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
17240 6c 75 65 29 3b 0a 09 09 09 09 09 09 09 69 66 20  lue);........if 
17250 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
17260 20 30 29 20 7b 20 0a 09 09 09 09 09 09 09 09 70   0) { .........p
17270 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
17280 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
17290 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
172a0 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
172b0 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09  ;........}......
172c0 09 7d 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  .}........break;
172d0 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 43  ......case CKO_C
172e0 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
172f0 09 09 70 56 61 6c 75 65 20 3d 20 63 65 72 74 69  ..pValue = certi
17300 66 69 63 61 74 65 3b 0a 09 09 09 09 09 09 75 6c  ficate;.......ul
17310 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65 72 74 69  ValueLen = certi
17320 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 09 09  ficate_len;.....
17330 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
17340 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17350 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
17360 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
17370 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
17380 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
17390 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
173a0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49  k;....case CKA_I
173b0 53 53 55 45 52 3a 0a 09 09 09 09 43 41 43 4b 45  SSUER:.....CACKE
173c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
173d0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
173e0 62 75 74 65 20 43 4b 41 5f 49 53 53 55 45 52 20  bute CKA_ISSUER 
173f0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
17400 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17410 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
17420 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
17430 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52  class != CKO_CER
17440 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65  TIFICATE && obje
17450 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e  ctclass != CKO_N
17460 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
17470 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17480 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17490 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
174a0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
174b0 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
174c0 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20  ate or Netscape 
174d0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
174e0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
174f0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
17500 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
17510 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
17520 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
17530 5f 69 73 73 75 65 72 28 63 65 72 74 69 66 69 63  _issuer(certific
17540 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
17550 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a  _len, &pValue);.
17560 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65  .....if (x509_re
17570 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09  ad_ret < 0) {...
17580 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c  ....pValue = NUL
17590 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  L;......} else {
175a0 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
175b0 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n = x509_read_re
175c0 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  t;......}.....}.
175d0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
175e0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
175f0 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22  eturning %p/%lu"
17600 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
17610 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
17620 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
17630 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
17640 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09  ERIAL_NUMBER:...
17650 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17660 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
17670 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
17680 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 20 28 30  SERIAL_NUMBER (0
17690 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
176a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
176b0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
176c0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
176d0 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49  ass != CKO_CERTI
176e0 46 49 43 41 54 45 20 26 26 20 6f 62 6a 65 63 74  FICATE && object
176f0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
17700 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
17710 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17720 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
17730 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
17740 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
17750 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74  not a certificat
17760 65 20 6f 72 20 4e 65 74 73 63 61 70 65 20 74 72  e or Netscape tr
17770 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
17780 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
17790 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66  ......if (certif
177a0 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20  icate_len >= 0) 
177b0 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64  {......x509_read
177c0 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73  _ret = x509_to_s
177d0 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74  erial(certificat
177e0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
177f0 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
17800 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
17810 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
17820 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
17830 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
17840 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
17850 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
17860 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
17870 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17880 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
17890 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
178a0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
178b0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
178c0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
178d0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53  k;....case CKA_S
178e0 55 42 4a 45 43 54 3a 0a 09 09 09 09 43 41 43 4b  UBJECT:.....CACK
178f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17900 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
17910 69 62 75 74 65 20 43 4b 41 5f 53 55 42 4a 45 43  ibute CKA_SUBJEC
17920 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  T (0x%08lx) ..."
17930 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17940 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
17950 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
17960 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
17970 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
17980 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17990 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
179a0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
179b0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
179c0 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
179d0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
179e0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
179f0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
17a00 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
17a10 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
17a20 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28 63 65 72  9_to_subject(cer
17a30 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
17a40 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
17a50 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
17a60 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
17a70 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
17a80 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
17a90 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
17aa0 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
17ab0 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
17ac0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
17ad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17ae0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70  ... returning %p
17af0 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28  /%lu", pValue, (
17b00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17b10 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17b20 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17b30 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43 41 43 4b  CKA_ID:.....CACK
17b40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17b50 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
17b60 69 62 75 74 65 20 43 4b 41 5f 49 44 20 28 30 78  ibute CKA_ID (0x
17b70 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
17b80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
17b90 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
17ba0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
17bb0 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
17bc0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
17bd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17be0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
17bf0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
17c00 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
17c10 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
17c20 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
17c30 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
17c40 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d 20 28 28  ucTmpBuf[0] = ((
17c50 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31  identity_num + 1
17c60 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
17c70 09 09 09 09 75 63 54 6d 70 42 75 66 5b 31 5d 20  ....ucTmpBuf[1] 
17c80 3d 20 20 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d  =  (identity_num
17c90 20 2b 20 31 29 20 26 20 30 78 66 66 3b 0a 0a 09   + 1) & 0xff;...
17ca0 09 09 09 70 56 61 6c 75 65 20 3d 20 26 75 63 54  ...pValue = &ucT
17cb0 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c 56 61 6c  mpBuf;.....ulVal
17cc0 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09 09 09 09  ueLen = 2;......
17cd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17ce0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
17cf0 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
17d00 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17d10 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17d20 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
17d30 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49 46  .case CKA_CERTIF
17d40 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09 09  ICATE_TYPE:.....
17d50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17d60 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
17d70 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43 45  attribute CKA_CE
17d80 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 28  RTIFICATE_TYPE (
17d90 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
17da0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
17db0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
17dc0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
17dd0 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45 52 54  lass != CKO_CERT
17de0 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09 09  IFICATE) {......
17df0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17e00 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
17e10 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
17e20 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
17e30 61 20 63 65 72 74 69 66 69 63 61 74 65 2e 22 29  a certificate.")
17e40 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
17e50 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20  ...}....../* We 
17e60 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65  only support one
17e70 20 63 65 72 74 69 66 69 63 61 74 65 20 74 79 70   certificate typ
17e80 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63 65 72 74  e */.....ck_cert
17e90 69 66 69 63 61 74 65 5f 74 79 70 65 20 3d 20 43  ificate_type = C
17ea0 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09 09 09 70  KC_X_509;......p
17eb0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63 65 72 74  Value = &ck_cert
17ec0 69 66 69 63 61 74 65 5f 74 79 70 65 3b 0a 09 09  ificate_type;...
17ed0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
17ee0 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74 69 66 69  izeof(ck_certifi
17ef0 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a 09 09 09  cate_type);.....
17f00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17f10 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
17f20 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30 39 20 28  ning CKC_X_509 (
17f30 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20  %lu) (%p/%lu)", 
17f40 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17f50 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54  *((CK_CERTIFICAT
17f60 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65  E_TYPE *) pValue
17f70 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
17f80 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
17f90 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
17fa0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
17fb0 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 09 43 41  KEY_TYPE:.....CA
17fc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17fd0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
17fe0 74 72 69 62 75 74 65 20 43 4b 41 5f 4b 45 59 5f  tribute CKA_KEY_
17ff0 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TYPE (0x%08lx) .
18000 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18010 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18020 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
18030 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
18040 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 26 26  O_PRIVATE_KEY &&
18050 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
18060 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29 20  CKO_PUBLIC_KEY) 
18070 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
18080 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18090 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
180a0 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
180b0 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e 22 29 3b  re not a key.");
180c0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
180d0 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 6f  ..}....../* We o
180e0 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f 6e 65 20  nly support one 
180f0 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09 09 09 09  key type */.....
18100 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d 20 43 4b  ck_key_type = CK
18110 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70 56 61 6c  K_RSA;......pVal
18120 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f 74 79 70  ue = &ck_key_typ
18130 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
18140 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6b 65  n = sizeof(ck_ke
18150 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 43 41  y_type);......CA
18160 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18170 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18180 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c 75 29 20  g CKK_RSA (%lu) 
18190 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
181a0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
181b0 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
181c0 45 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  E *) pValue), pV
181d0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
181e0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
181f0 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18200 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 3a  ..case CKA_SIGN:
18210 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18220 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18230 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
18240 4b 41 5f 53 49 47 4e 20 28 30 78 25 30 38 6c 78  KA_SIGN (0x%08lx
18250 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
18260 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
18270 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
18280 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
18290 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52   CKO_NETSCAPE_TR
182a0 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  UST) {......CACK
182b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
182c0 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
182d0 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
182e0 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61   we are a Netsca
182f0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
18300 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
18310 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f  ....}......if (o
18320 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
18330 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b  O_PRIVATE_KEY) {
18340 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
18350 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c  ck_true;......ul
18360 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
18370 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
18380 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
18390 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65  alue = &ck_false
183a0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
183b0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
183c0 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lse);.....}.....
183d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
183e0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
183f0 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
18400 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
18410 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
18420 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
18430 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18440 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18450 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18460 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f 52 45  case CKA_SIGN_RE
18470 43 4f 56 45 52 3a 0a 09 09 09 09 43 41 43 4b 45  COVER:.....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 53 49 47 4e 5f 52 45  bute CKA_SIGN_RE
184b0 43 4f 56 45 52 20 28 30 78 25 30 38 6c 78 29 20  COVER (0x%08lx) 
184c0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
184d0 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
184e0 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
184f0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
18500 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
18510 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
18520 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18530 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
18540 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
18550 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
18560 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
18570 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
18580 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57 65 20 63  ..}....../* We c
18590 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 73 75  urrently only su
185a0 70 70 6f 72 74 20 22 53 69 67 6e 20 77 69 74 68  pport "Sign with
185b0 20 41 70 70 65 6e 64 69 78 22 20 2a 2f 0a 09 09   Appendix" */...
185c0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
185d0 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alse;.....ulValu
185e0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
185f0 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41  _false);......CA
18600 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18610 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18620 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
18630 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18640 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
18650 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18660 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18670 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18680 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18690 65 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09  e CKA_DECRYPT:..
186a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
186b0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
186c0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
186d0 5f 44 45 43 52 59 50 54 20 28 30 78 25 30 38 6c  _DECRYPT (0x%08l
186e0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
186f0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
18700 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
18710 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
18720 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
18730 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
18740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18750 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18760 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
18770 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
18780 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
18790 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
187a0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
187b0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
187c0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 7c  KO_PRIVATE_KEY |
187d0 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d  | objectclass ==
187e0 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 29   CKO_PUBLIC_KEY)
187f0 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
18800 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
18810 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
18820 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09  eof(ck_true);...
18830 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
18840 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c  pValue = &ck_fal
18850 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  se;......ulValue
18860 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
18870 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09  false);.....}...
18880 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18890 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
188a0 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25  urning %lu (%p/%
188b0 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  lu)", (unsigned 
188c0 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f  long) *((CK_BBOO
188d0 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56  L *) pValue), pV
188e0 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
188f0 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
18900 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
18910 09 09 63 61 73 65 20 43 4b 41 5f 53 45 4e 53 49  ..case CKA_SENSI
18920 54 49 56 45 3a 0a 09 09 09 09 43 41 43 4b 45 59  TIVE:.....CACKEY
18930 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18940 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18950 75 74 65 20 43 4b 41 5f 53 45 4e 53 49 54 49 56  ute CKA_SENSITIV
18960 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
18970 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18980 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
18990 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
189a0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
189b0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
189c0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
189d0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
189e0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
189f0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
18a00 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
18a10 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
18a20 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
18a30 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
18a40 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
18a50 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  ATE_KEY) {......
18a60 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
18a70 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
18a80 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
18a90 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
18aa0 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
18ab0 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09   &ck_false;.....
18ac0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
18ad0 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
18ae0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
18af0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
18b00 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
18b10 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
18b20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18b30 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
18b40 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
18b50 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18b60 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18b70 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18b80 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a  KA_EXTRACTABLE:.
18b90 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18ba0 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
18bb0 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
18bc0 41 5f 45 58 54 52 41 43 54 41 42 4c 45 20 28 30  A_EXTRACTABLE (0
18bd0 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
18be0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
18bf0 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
18c00 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
18c10 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43  ass == CKO_NETSC
18c20 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09  APE_TRUST) {....
18c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18c40 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20  RINTF(" ... but 
18c50 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62  not getting it b
18c60 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20  ecause we are a 
18c70 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
18c80 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
18c90 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
18ca0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18cb0 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   == CKO_PRIVATE_
18cc0 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c  KEY) {......pVal
18cd0 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a  ue = &ck_false;.
18ce0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18cf0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
18d00 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
18d10 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18d20 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56  k_true;......ulV
18d30 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
18d40 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09  (ck_false);.....
18d50 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
18d60 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
18d70 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
18d80 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
18d90 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
18da0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
18db0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
18dc0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
18dd0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
18de0 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d  k;....case CKA_M
18df0 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43 41 43 4b  ODULUS:.....CACK
18e00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18e10 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
18e20 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 55 4c 55  ibute CKA_MODULU
18e30 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  S (0x%08lx) ..."
18e40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18e50 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
18e60 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
18e70 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
18e80 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
18e90 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18ea0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18eb0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
18ec0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
18ed0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
18ee0 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
18ef0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
18f00 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
18f10 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
18f20 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
18f30 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 6d 6f  ret = x509_to_mo
18f40 64 75 6c 75 73 28 63 65 72 74 69 66 69 63 61 74  dulus(certificat
18f50 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
18f60 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
18f70 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
18f80 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
18f90 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
18fa0 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
18fb0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
18fc0 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
18fd0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
18fe0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18ff0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
19000 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22  urning (%p/%lu)"
19010 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
19020 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
19030 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
19040 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 50  k;....case CKA_P
19050 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54 3a 0a  UBLIC_EXPONENT:.
19060 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19070 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
19080 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
19090 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e  A_PUBLIC_EXPONEN
190a0 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  T (0x%08lx) ..."
190b0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
190c0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
190d0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
190e0 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
190f0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
19100 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
19110 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
19120 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
19130 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
19140 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
19150 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
19160 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
19170 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
19180 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
19190 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
191a0 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 65 78  ret = x509_to_ex
191b0 70 6f 6e 65 6e 74 28 63 65 72 74 69 66 69 63 61  ponent(certifica
191c0 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
191d0 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
191e0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
191f0 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09  d_ret < 0) {....
19200 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c  ...pValue = NULL
19210 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  ;......} else {.
19220 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
19230 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74   = x509_read_ret
19240 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a  ;......}.....}..
19250 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19260 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
19270 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29  turning (%p/%lu)
19280 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
19290 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
192a0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
192b0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
192c0 54 52 55 53 54 5f 44 49 47 49 54 41 4c 5f 53 49  TRUST_DIGITAL_SI
192d0 47 4e 41 54 55 52 45 3a 0a 09 09 09 63 61 73 65  GNATURE:....case
192e0 20 43 4b 41 5f 54 52 55 53 54 5f 4e 4f 4e 5f 52   CKA_TRUST_NON_R
192f0 45 50 55 44 49 41 54 49 4f 4e 3a 0a 09 09 09 63  EPUDIATION:....c
19300 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45  ase CKA_TRUST_KE
19310 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a  Y_ENCIPHERMENT:.
19320 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
19330 54 5f 44 41 54 41 5f 45 4e 43 49 50 48 45 52 4d  T_DATA_ENCIPHERM
19340 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ENT:....case CKA
19350 5f 54 52 55 53 54 5f 4b 45 59 5f 41 47 52 45 45  _TRUST_KEY_AGREE
19360 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43 4b  MENT:....case CK
19370 41 5f 54 52 55 53 54 5f 4b 45 59 5f 43 45 52 54  A_TRUST_KEY_CERT
19380 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43  _SIGN:....case C
19390 4b 41 5f 54 52 55 53 54 5f 43 52 4c 5f 53 49 47  KA_TRUST_CRL_SIG
193a0 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  N:....case CKA_T
193b0 52 55 53 54 5f 53 45 52 56 45 52 5f 41 55 54 48  RUST_SERVER_AUTH
193c0 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
193d0 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55 54 48 3a  UST_CLIENT_AUTH:
193e0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
193f0 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49 4e 47 3a  ST_CODE_SIGNING:
19400 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55  ....case CKA_TRU
19410 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54 45 43 54  ST_EMAIL_PROTECT
19420 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ION:.....CACKEY_
19430 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
19440 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
19450 74 65 20 43 4b 41 5f 54 52 55 53 54 5f 2e 2e 2e  te CKA_TRUST_...
19460 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
19470 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19480 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
19490 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
194a0 26 63 6b 5f 74 72 75 73 74 65 64 3b 0a 09 09 09  &ck_trusted;....
194b0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
194c0 7a 65 6f 66 28 63 6b 5f 74 72 75 73 74 65 64 29  zeof(ck_trusted)
194d0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
194e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
194f0 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
19500 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
19510 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
19520 54 52 55 53 54 20 2a 29 20 70 56 61 6c 75 65 29  TRUST *) pValue)
19530 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
19540 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
19550 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
19560 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43  k;....case CKA_C
19570 45 52 54 5f 53 48 41 31 5f 48 41 53 48 3a 0a 09  ERT_SHA1_HASH:..
19580 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19590 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
195a0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
195b0 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48 20  _CERT_SHA1_HASH 
195c0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
195d0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
195e0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
195f0 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
19600 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54  class != CKO_NET
19610 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
19620 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
19630 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
19640 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
19650 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
19660 6e 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74  not a Netscape t
19670 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
19680 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
19690 7d 0a 0a 09 09 09 09 53 48 41 31 52 65 73 65 74  }......SHA1Reset
196a0 28 26 73 68 61 31 5f 63 74 78 29 3b 0a 09 09 09  (&sha1_ctx);....
196b0 09 53 48 41 31 49 6e 70 75 74 28 26 73 68 61 31  .SHA1Input(&sha1
196c0 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63 61 74  _ctx, certificat
196d0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
196e0 65 6e 29 3b 0a 09 09 09 09 53 48 41 31 52 65 73  en);.....SHA1Res
196f0 75 6c 74 28 26 73 68 61 31 5f 63 74 78 2c 20 73  ult(&sha1_ctx, s
19700 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09  ha1_hash);......
19710 70 56 61 6c 75 65 20 3d 20 73 68 61 31 5f 68 61  pValue = sha1_ha
19720 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  sh;.....ulValueL
19730 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73 68 61 31  en = sizeof(sha1
19740 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43  _hash);......CAC
19750 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19760 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
19770 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
19780 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
19790 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
197a0 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
197b0 73 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35 5f  se CKA_CERT_MD5_
197c0 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59  HASH:.....CACKEY
197d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
197e0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
197f0 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 4d 44 35  ute CKA_CERT_MD5
19800 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29 20  _HASH (0x%08lx) 
19810 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
19820 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
19830 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
19840 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
19850 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
19860 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
19870 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
19880 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
19890 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
198a0 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74 73  e are not a Nets
198b0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
198c0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
198d0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 4d 44 35  ;.....}......MD5
198e0 49 6e 69 74 28 26 6d 64 35 5f 63 74 78 29 3b 0a  Init(&md5_ctx);.
198f0 09 09 09 09 4d 44 35 55 70 64 61 74 65 28 26 6d  ....MD5Update(&m
19900 64 35 5f 63 74 78 2c 20 63 65 72 74 69 66 69 63  d5_ctx, certific
19910 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
19920 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d 44 35 46 69  _len);.....MD5Fi
19930 6e 61 6c 28 6d 64 35 5f 68 61 73 68 2c 20 26 6d  nal(md5_hash, &m
19940 64 35 5f 63 74 78 29 3b 0a 0a 09 09 09 09 70 56  d5_ctx);......pV
19950 61 6c 75 65 20 3d 20 6d 64 35 5f 68 61 73 68 3b  alue = md5_hash;
19960 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
19970 3d 20 73 69 7a 65 6f 66 28 6d 64 35 5f 68 61 73  = sizeof(md5_has
19980 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  h);......CACKEY_
19990 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
199a0 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
199b0 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
199c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
199d0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
199e0 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c  break;....defaul
199f0 74 3a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  t:.....pValue = 
19a00 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56 61 6c 75  NULL;.....ulValu
19a10 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
19a20 20 2d 31 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a   -1;.....break;.
19a30 09 09 7d 0a 0a 09 09 69 66 20 28 28 28 43 4b 5f  ..}....if (((CK_
19a40 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65 4c 65 6e  LONG) ulValueLen
19a50 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e 47 29 20  ) != ((CK_LONG) 
19a60 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20 50 75 73  -1)) {..../* Pus
19a70 68 20 63 75 72 72 5f 61 74 74 72 20 6f 6e 74 6f  h curr_attr onto
19a80 20 74 68 65 20 73 74 61 63 6b 20 2a 2f 0a 09 09   the stack */...
19a90 09 63 75 72 72 5f 61 74 74 72 2e 74 79 70 65 20  .curr_attr.type 
19aa0 3d 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  = curr_attr_type
19ab0 3b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 75  ;....curr_attr.u
19ac0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56 61  lValueLen = ulVa
19ad0 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63 75 72 72  lueLen;.....curr
19ae0 5f 61 74 74 72 2e 70 56 61 6c 75 65 20 3d 20 6d  _attr.pValue = m
19af0 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74 74 72 2e  alloc(curr_attr.
19b00 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
19b10 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72  memcpy(curr_attr
19b20 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c  .pValue, pValue,
19b30 20 63 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c   curr_attr.ulVal
19b40 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69 66 20 28  ueLen);.....if (
19b50 70 56 61 6c 75 65 5f 66 72 65 65 20 26 26 20 70  pValue_free && p
19b60 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 66 72 65  Value) {.....fre
19b70 65 28 70 56 61 6c 75 65 29 3b 0a 09 09 09 7d 0a  e(pValue);....}.
19b80 0a 09 09 09 69 66 20 28 6e 75 6d 61 74 74 72 73  ....if (numattrs
19b90 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74   >= retval_count
19ba0 29 20 7b 0a 09 09 09 09 72 65 74 76 61 6c 20 3d  ) {.....retval =
19bb0 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c   realloc(retval,
19bc0 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20   retval_count * 
19bd0 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
19be0 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63 70  ;....}.....memcp
19bf0 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d 61 74 74  y(&retval[numatt
19c00 72 73 5d 2c 20 26 63 75 72 72 5f 61 74 74 72 2c  rs], &curr_attr,
19c10 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 74 74   sizeof(curr_att
19c20 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74 74 72 73  r));....numattrs
19c30 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  ++;...}..}...if 
19c40 28 6e 75 6d 61 74 74 72 73 20 21 3d 20 30 29 20  (numattrs != 0) 
19c50 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74  {...retval_count
19c60 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a 09 09 72   = numattrs;...r
19c70 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28  etval = realloc(
19c80 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63  retval, retval_c
19c90 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
19ca0 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65 6c 73 65  etval));..} else
19cb0 20 7b 0a 09 09 66 72 65 65 28 72 65 74 76 61 6c   {...free(retval
19cc0 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20 3d 20 4e  );....retval = N
19cd0 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43 6f  ULL;..}...*pulCo
19ce0 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a  unt = numattrs;.
19cf0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19d00 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
19d10 20 25 6c 75 20 6f 62 6a 65 63 74 73 20 28 25 70   %lu objects (%p
19d20 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73 2c 20 28  ).", numattrs, (
19d30 76 6f 69 64 20 2a 29 20 72 65 74 76 61 6c 29 3b  void *) retval);
19d40 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
19d50 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
19d60 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64  d cackey_free_id
19d70 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20  entities(struct 
19d80 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
19d90 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73  *identities, uns
19da0 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
19db0 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
19dc0 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
19dd0 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73 69 67 6e  rr_attr;..unsign
19de0 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64 78 2c 20  ed long id_idx, 
19df0 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69 66 20 28  attr_idx;...if (
19e00 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
19e10 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74 69 65 73  LL || identities
19e20 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  _count == 0) {..
19e30 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f  .return;..}...fo
19e40 72 20 28 69 64 5f 69 64 78 20 3d 20 30 3b 20 69  r (id_idx = 0; i
19e50 64 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69  d_idx < identiti
19e60 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f 69 64 78  es_count; id_idx
19e70 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e  ++) {...if (iden
19e80 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
19e90 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09  ttributes) {....
19ea0 66 6f 72 20 28 61 74 74 72 5f 69 64 78 20 3d 20  for (attr_idx = 
19eb0 30 3b 20 61 74 74 72 5f 69 64 78 20 3c 20 69 64  0; attr_idx < id
19ec0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
19ed0 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
19ee0 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  t; attr_idx++) {
19ef0 0a 09 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d  .....curr_attr =
19f00 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
19f10 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5b  idx].attributes[
19f20 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 09  attr_idx];......
19f30 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70  if (curr_attr->p
19f40 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72  Value) {......fr
19f50 65 65 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  ee(curr_attr->pV
19f60 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09  alue);.....}....
19f70 7d 0a 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69  }.....if (identi
19f80 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
19f90 72 69 62 75 74 65 73 29 20 7b 0a 09 09 09 09 66  ributes) {.....f
19fa0 72 65 65 28 69 64 65 6e 74 69 74 69 65 73 5b 69  ree(identities[i
19fb0 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
19fc0 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  s);....}.....cac
19fd0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 69  key_free_certs(i
19fe0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
19ff0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c  ].pcsc_identity,
1a000 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a   1, 1);...}..}..
1a010 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65 73  .free(identities
1a020 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 6e 73  );.}..static uns
1a030 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65  igned long cacke
1a040 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
1a050 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63  ities(struct cac
1a060 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
1a070 65 6e 74 69 74 69 65 73 2c 20 75 6e 73 69 67 6e  entities, unsign
1a080 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64 6f 64 5f  ed long num_dod_
1a090 63 65 72 74 73 29 20 7b 0a 09 75 6e 73 69 67 6e  certs) {..unsign
1a0a0 65 64 20 6c 6f 6e 67 20 63 65 72 74 5f 69 64 78  ed long cert_idx
1a0b0 2c 20 69 64 5f 69 64 78 20 3d 20 30 3b 0a 0a 09  , id_idx = 0;...
1a0c0 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d  if (identities =
1a0d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75  = NULL) {...retu
1a0e0 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  rn(num_dod_certs
1a0f0 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20   * 3);..}...for 
1a100 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63  (cert_idx = 0; c
1a110 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 64 6f  ert_idx < num_do
1a120 64 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64  d_certs; cert_id
1a130 78 2b 2b 29 20 7b 0a 09 09 69 64 65 6e 74 69 74  x++) {...identit
1a140 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1a150 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  _identity = NULL
1a160 3b 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69  ;...identities[i
1a170 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
1a180 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61  s = cackey_get_a
1a190 74 74 72 69 62 75 74 65 73 28 43 4b 4f 5f 43 45  ttributes(CKO_CE
1a1a0 52 54 49 46 49 43 41 54 45 2c 20 26 65 78 74 72  RTIFICATE, &extr
1a1b0 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78  a_certs[cert_idx
1a1c0 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74  ], 0xf000 | cert
1a1d0 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65  _idx, &identitie
1a1e0 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a1f0 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69  utes_count);...i
1a200 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64 65 6e  d_idx++;....iden
1a210 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1a220 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e  csc_identity = N
1a230 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65  ULL;...identitie
1a240 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a250 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65  utes = cackey_ge
1a260 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f  t_attributes(CKO
1a270 5f 50 55 42 4c 49 43 5f 4b 45 59 2c 20 26 65 78  _PUBLIC_KEY, &ex
1a280 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69  tra_certs[cert_i
1a290 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65  dx], 0xf000 | ce
1a2a0 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74  rt_idx, &identit
1a2b0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a2c0 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09  ibutes_count);..
1a2d0 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69 64  .id_idx++;....id
1a2e0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1a2f0 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  .pcsc_identity =
1a300 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74   NULL;...identit
1a310 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
1a320 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
1a330 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 43  get_attributes(C
1a340 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
1a350 54 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b  T, &extra_certs[
1a360 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30  cert_idx], 0xf00
1a370 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69  0 | cert_idx, &i
1a380 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1a390 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ].attributes_cou
1a3a0 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b  nt);...id_idx++;
1a3b0 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 69 64 5f  ..}...return(id_
1a3c0 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  idx);.}..static 
1a3d0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
1a3e0 65 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72  entity *cackey_r
1a3f0 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73  ead_identities(s
1a400 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
1a410 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
1a420 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66 6f 75 6e  d long *ids_foun
1a430 64 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63  d) {..struct cac
1a440 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
1a450 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69  y *pcsc_identiti
1a460 65 73 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  es;..struct cack
1a470 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65  ey_identity *ide
1a480 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e  ntities;..unsign
1a490 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69 64 73 2c  ed long num_ids,
1a4a0 20 69 64 5f 69 64 78 2c 20 63 75 72 72 5f 69 64   id_idx, curr_id
1a4b0 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64  _type;..unsigned
1a4c0 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 2c   long num_certs,
1a4d0 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 2c 20   num_dod_certs, 
1a4e0 63 65 72 74 5f 69 64 78 3b 0a 09 69 6e 74 20 69  cert_idx;..int i
1a4f0 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
1a500 74 73 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59  ts = 0;...CACKEY
1a510 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1a520 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1a530 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20 4e 55 4c  ids_found == NUL
1a540 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1a550 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1a560 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64 20 69 73  r.  ids_found is
1a570 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
1a580 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 23 69  rn(NULL);..}..#i
1a590 66 64 65 66 20 43 41 43 4b 45 59 5f 43 41 52 44  fdef CACKEY_CARD
1a5a0 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44 45 5f 45 58  _SLOT_INCLUDE_EX
1a5b0 54 52 41 5f 43 45 52 54 53 0a 09 69 6e 63 6c 75  TRA_CERTS..inclu
1a5c0 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1a5d0 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20   1;.#endif...if 
1a5e0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1a5f0 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f  DOD_CERTS_ON_HW_
1a600 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  SLOTS") != NULL)
1a610 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74   {...include_ext
1a620 72 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d  ra_certs = 1;..}
1a630 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1a640 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f 43 45 52  ACKEY_NO_DOD_CER
1a650 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29  TS_ON_HW_SLOTS")
1a660 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
1a670 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1a680 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  s = 0;..}...if (
1a690 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e  getenv("CACKEY_N
1a6a0 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20  O_EXTRA_CERTS") 
1a6b0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6e 75 6d  != NULL) {...num
1a6c0 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1a6d0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d 5f  .} else {...num_
1a6e0 64 6f 64 5f 63 65 72 74 73 20 3d 20 73 69 7a 65  dod_certs = size
1a6f0 6f 66 28 65 78 74 72 61 5f 63 65 72 74 73 29 20  of(extra_certs) 
1a700 2f 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f 63  / sizeof(extra_c
1a710 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 0a 0a 09 69  erts[0]);..}...i
1a720 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65 72 6e 61  f (slot->interna
1a730 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69 64 73 20 3d  l) {...num_ids =
1a740 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64   cackey_read_dod
1a750 5f 69 64 65 6e 74 69 74 69 65 73 28 4e 55 4c 4c  _identities(NULL
1a760 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
1a770 3b 0a 0a 09 09 69 66 20 28 6e 75 6d 5f 69 64 73  ;....if (num_ids
1a780 20 21 3d 20 30 29 20 7b 0a 09 09 09 69 64 65 6e   != 0) {....iden
1a790 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28  tities = malloc(
1a7a0 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66  num_ids * sizeof
1a7b0 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a  (*identities));.
1a7c0 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f  ....cackey_read_
1a7d0 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69  dod_identities(i
1a7e0 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d 5f 64  dentities, num_d
1a7f0 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 20 65  od_certs);...} e
1a800 6c 73 65 20 7b 0a 09 09 09 69 64 65 6e 74 69 74  lse {....identit
1a810 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a  ies = NULL;...}.
1a820 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20  ...*ids_found = 
1a830 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75  num_ids;....retu
1a840 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a  rn(identities);.
1a850 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65 6e 74 69  .}...pcsc_identi
1a860 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  ties = cackey_re
1a870 61 64 5f 63 65 72 74 73 28 73 6c 6f 74 2c 20 4e  ad_certs(slot, N
1a880 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
1a890 3b 0a 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e  ;..if (pcsc_iden
1a8a0 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
1a8b0 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72 74 20 6e  {.../* Convert n
1a8c0 75 6d 62 65 72 20 6f 66 20 43 65 72 74 73 20 74  umber of Certs t
1a8d0 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  o number of obje
1a8e0 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f 69 64 73  cts */...num_ids
1a8f0 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41 54 45 5f   = (CKO_PRIVATE_
1a900 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52 54 49 46  KEY - CKO_CERTIF
1a910 49 43 41 54 45 20 2b 20 31 29 20 2a 20 6e 75 6d  ICATE + 1) * num
1a920 5f 63 65 72 74 73 3b 0a 0a 09 09 69 66 20 28 69  _certs;....if (i
1a930 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72  nclude_extra_cer
1a940 74 73 29 20 7b 0a 09 09 09 6e 75 6d 5f 69 64 73  ts) {....num_ids
1a950 20 2b 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f   += cackey_read_
1a960 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e  dod_identities(N
1a970 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  ULL, num_dod_cer
1a980 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 69 64 65 6e  ts);...}....iden
1a990 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c 6f 63 28  tities = malloc(
1a9a0 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a 65 6f 66  num_ids * sizeof
1a9b0 28 2a 69 64 65 6e 74 69 74 69 65 73 29 29 3b 0a  (*identities));.
1a9c0 0a 09 09 2f 2a 20 41 64 64 20 63 65 72 74 69 66  .../* Add certif
1a9d0 69 63 61 74 65 73 2c 20 70 75 62 6c 69 63 20 6b  icates, public k
1a9e0 65 79 73 2c 20 61 6e 64 20 70 72 69 76 61 74 65  eys, and private
1a9f0 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73   keys from the s
1aa00 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09 09 69 64  martcard */...id
1aa10 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66 6f 72 20  _idx = 0;...for 
1aa20 28 63 65 72 74 5f 69 64 78 20 3d 20 30 3b 20 63  (cert_idx = 0; c
1aa30 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d 5f 63 65  ert_idx < num_ce
1aa40 72 74 73 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29  rts; cert_idx++)
1aa50 20 7b 0a 09 09 09 66 6f 72 20 28 63 75 72 72 5f   {....for (curr_
1aa60 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f 5f 43 45  id_type = CKO_CE
1aa70 52 54 49 46 49 43 41 54 45 3b 20 63 75 72 72 5f  RTIFICATE; curr_
1aa80 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b 4f 5f 50  id_type <= CKO_P
1aa90 52 49 56 41 54 45 5f 4b 45 59 3b 20 63 75 72 72  RIVATE_KEY; curr
1aaa0 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b 0a 09 09  _id_type++) {...
1aab0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
1aac0 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
1aad0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  = cackey_get_att
1aae0 72 69 62 75 74 65 73 28 63 75 72 72 5f 69 64 5f  ributes(curr_id_
1aaf0 74 79 70 65 2c 20 26 70 63 73 63 5f 69 64 65 6e  type, &pcsc_iden
1ab00 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d  tities[cert_idx]
1ab10 2c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65  , cert_idx, &ide
1ab20 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1ab30 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74  attributes_count
1ab40 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  );......identiti
1ab50 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1ab60 69 64 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  identity = mallo
1ab70 63 28 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69  c(sizeof(*identi
1ab80 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73  ties[id_idx].pcs
1ab90 63 5f 69 64 65 6e 74 69 74 79 29 29 3b 0a 09 09  c_identity));...
1aba0 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74  ..memcpy(identit
1abb0 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1abc0 5f 69 64 65 6e 74 69 74 79 2c 20 26 70 63 73 63  _identity, &pcsc
1abd0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1abe0 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66 28 2a 69  _idx], sizeof(*i
1abf0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1ac00 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29  ].pcsc_identity)
1ac10 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74 69 74 69  );......identiti
1ac20 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1ac30 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
1ac40 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 70  icate = malloc(p
1ac50 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
1ac60 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
1ac70 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d  cate_len);.....m
1ac80 65 6d 63 70 79 28 69 64 65 6e 74 69 74 69 65 73  emcpy(identities
1ac90 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
1aca0 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
1acb0 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
1acc0 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
1acd0 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63  ertificate, pcsc
1ace0 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
1acf0 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
1ad00 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 64 5f  e_len);......id_
1ad10 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09 09 7d 0a  idx++;....}...}.
1ad20 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65  ...if (include_e
1ad30 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09  xtra_certs) {...
1ad40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1ad50 49 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20  INTF("Including 
1ad60 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65  US Government Ce
1ad70 72 74 69 66 69 63 61 74 65 73 20 6f 6e 20 68 61  rtificates on ha
1ad80 72 64 77 61 72 65 20 73 6c 6f 74 22 29 3b 0a 0a  rdware slot");..
1ad90 09 09 09 63 61 63 6b 65 79 5f 72 65 61 64 5f 64  ...cackey_read_d
1ada0 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 69 64  od_identities(id
1adb0 65 6e 74 69 74 69 65 73 20 2b 20 69 64 5f 69 64  entities + id_id
1adc0 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  x, num_dod_certs
1add0 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  );...}....cackey
1ade0 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73 63  _free_certs(pcsc
1adf0 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75 6d  _identities, num
1ae00 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a 09 09 2a  _certs, 1);....*
1ae10 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f  ids_found = num_
1ae20 69 64 73 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69  ids;....return(i
1ae30 64 65 6e 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a  dentities);..}..
1ae40 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 30  ..*ids_found = 0
1ae50 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ;..return(NULL);
1ae60 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1ae70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1ae80 49 6e 69 74 69 61 6c 69 7a 65 29 28 43 4b 5f 56  Initialize)(CK_V
1ae90 4f 49 44 5f 50 54 52 20 70 49 6e 69 74 41 72 67  OID_PTR pInitArg
1aea0 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e 49 54 49  s) {..CK_C_INITI
1aeb0 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b 5f 50 54  ALIZE_ARGS CK_PT
1aec0 52 20 61 72 67 73 3b 0a 09 75 69 6e 74 33 32 5f  R args;..uint32_
1aed0 74 20 69 64 78 2c 20 68 69 67 68 65 73 74 5f 73  t idx, highest_s
1aee0 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  lot;..int mutex_
1aef0 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  init_ret;...CACK
1af00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1af10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1af20 20 28 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c   (cackey_initial
1af30 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1af40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1af50 72 72 6f 72 2e 20 20 41 6c 72 65 61 64 79 20 69  rror.  Already i
1af60 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
1af70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
1af80 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59 5f 49 4e  PTOKI_ALREADY_IN
1af90 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1afa0 09 69 66 20 28 70 49 6e 69 74 41 72 67 73 20 21  .if (pInitArgs !
1afb0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61 72 67 73  = NULL) {...args
1afc0 20 3d 20 70 49 6e 69 74 41 72 67 73 3b 0a 09 09   = pInitArgs;...
1afd0 6d 65 6d 63 70 79 28 26 63 61 63 6b 65 79 5f 61  memcpy(&cackey_a
1afe0 72 67 73 2c 20 61 72 67 73 2c 20 73 69 7a 65 6f  rgs, args, sizeo
1aff0 66 28 63 61 63 6b 65 79 5f 61 72 67 73 29 29 3b  f(cackey_args));
1b000 0a 0a 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
1b010 65 61 74 65 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  eateMutex == NUL
1b020 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
1b030 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20  oyMutex == NULL 
1b040 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
1b050 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
1b060 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
1b070 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69 66  == NULL) {....if
1b080 20 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75   (args->CreateMu
1b090 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
1b0a0 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65  rgs->DestroyMute
1b0b0 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  x != NULL || arg
1b0c0 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 21 3d 20  s->LockMutex != 
1b0d0 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e  NULL || args->Un
1b0e0 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20 4e 55 4c  lockMutex != NUL
1b0f0 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  L) {.....CACKEY_
1b100 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b110 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75 74 20 6e  ror. Some, but n
1b120 6f 74 20 41 6c 6c 20 74 68 72 65 61 64 69 6e 67  ot All threading
1b130 20 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76   primitives prov
1b140 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  ided.");......re
1b150 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1b160 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d 0a 09 09  TS_BAD);....}...
1b170 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 63 61  }..} else {...ca
1b180 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65  ckey_args.Create
1b190 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Mutex = NULL;...
1b1a0 63 61 63 6b 65 79 5f 61 72 67 73 2e 44 65 73 74  cackey_args.Dest
1b1b0 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  royMutex = NULL;
1b1c0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c  ...cackey_args.L
1b1d0 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ockMutex = NULL;
1b1e0 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  ...cackey_args.U
1b1f0 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55 4c  nlockMutex = NUL
1b200 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73  L;...cackey_args
1b210 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a  .flags = 0;..}..
1b220 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1b230 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1b240 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
1b250 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
1b260 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78  ssions[0])); idx
1b270 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  ++) {...cackey_s
1b280 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
1b290 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f  ive = 0;..}...fo
1b2a0 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1b2b0 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1b2c0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1b2d0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1b2e0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
1b2f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1b300 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 63  .active = 0;...c
1b310 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1b320 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e  .pcsc_reader = N
1b330 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ULL;...cackey_sl
1b340 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63  ots[idx].transac
1b350 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a  tion_depth = 0;.
1b360 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1b370 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  dx].transaction_
1b380 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30  need_hw_lock = 0
1b390 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1b3a0 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65 74  [idx].slot_reset
1b3b0 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1b3c0 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b 65 6e 5f  lots[idx].token_
1b3d0 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09 63 61 63  flags = 0;...cac
1b3e0 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c  key_slots[idx].l
1b3f0 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63  abel = NULL;...c
1b400 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1b410 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a 09  .internal = 0;..
1b420 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  }...if (getenv("
1b430 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f  CACKEY_NO_EXTRA_
1b440 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  CERTS") != NULL)
1b450 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b460 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 65 64 20  G_PRINTF("Asked 
1b470 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64 65 20 44  not to include D
1b480 6f 44 20 63 65 72 74 69 66 69 63 61 74 65 73 22  oD certificates"
1b490 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 68  );..} else {...h
1b4a0 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d 20 28 73  ighest_slot = (s
1b4b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1b4c0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1b4d0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 20 2d  key_slots[0])) -
1b4e0 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45   1;....CACKEY_DE
1b4f0 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c  BUG_PRINTF("Incl
1b500 75 64 69 6e 67 20 44 6f 44 20 63 65 72 74 73 20  uding DoD certs 
1b510 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75  in slot %lu", (u
1b520 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 69  nsigned long) hi
1b530 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a 0a 09 09  ghest_slot);....
1b540 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67  cackey_slots[hig
1b550 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63 74 69 76  hest_slot].activ
1b560 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f  e = 1;...cackey_
1b570 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c  slots[highest_sl
1b580 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 31  ot].internal = 1
1b590 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1b5a0 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 6c  [highest_slot].l
1b5b0 61 62 65 6c 20 3d 20 28 75 6e 73 69 67 6e 65 64  abel = (unsigned
1b5c0 20 63 68 61 72 20 2a 29 20 22 55 53 20 47 6f 76   char *) "US Gov
1b5d0 65 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63  ernment Certific
1b5e0 61 74 65 73 22 3b 0a 09 09 63 61 63 6b 65 79 5f  ates";...cackey_
1b5f0 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c  slots[highest_sl
1b600 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  ot].pcsc_reader 
1b610 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09 09 63 61  = "CACKey";...ca
1b620 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65  ckey_slots[highe
1b630 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66  st_slot].token_f
1b640 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 63  lags = 0;..}...c
1b650 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1b660 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28 21 63 61  d = 1;...if (!ca
1b670 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69  ckey_biglock_ini
1b680 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f 69 6e 69  t) {...mutex_ini
1b690 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6d  t_ret = cackey_m
1b6a0 75 74 65 78 5f 63 72 65 61 74 65 28 26 63 61 63  utex_create(&cac
1b6b0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1b6c0 09 69 66 20 28 6d 75 74 65 78 5f 69 6e 69 74 5f  .if (mutex_init_
1b6d0 72 65 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  ret != 0) {....C
1b6e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b6f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 75 74 65  TF("Error.  Mute
1b700 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
1b710 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
1b720 72 65 74 75 72 6e 28 43 4b 52 5f 43 41 4e 54 5f  return(CKR_CANT_
1b730 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09 09 63 61  LOCK);...}....ca
1b740 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69  ckey_biglock_ini
1b750 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b  t = 1;..}...CACK
1b760 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b770 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1b780 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1b790 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1b7a0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
1b7b0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1b7c0 20 43 5f 46 69 6e 61 6c 69 7a 65 29 28 43 4b 5f   C_Finalize)(CK_
1b7d0 56 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76  VOID_PTR pReserv
1b7e0 65 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  ed) {..uint32_t 
1b7f0 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
1b800 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1b810 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65  ed.");...if (pRe
1b820 73 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20  served != NULL) 
1b830 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1b840 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1b850 70 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74  pReserved is not
1b860 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1b870 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1b880 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1b890 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1b8a0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1b8b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1b8c0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1b8d0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1b8e0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1b8f0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1b900 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
1b910 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
1b920 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1b930 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
1b940 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
1b950 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
1b960 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
1b970 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
1b980 20 7b 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73   {....C_CloseSes
1b990 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09 7d 0a 09  sion(idx);...}..
1b9a0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  }...cackey_slots
1b9b0 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
1b9c0 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  );...for (idx = 
1b9d0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
1b9e0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1b9f0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1ba00 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  lots[0])); idx++
1ba10 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
1ba20 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65  _slots[idx].inte
1ba30 72 6e 61 6c 29 20 7b 0a 09 09 09 63 6f 6e 74 69  rnal) {....conti
1ba40 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  nue;...}....if (
1ba50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1ba60 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 20 7b  ].pcsc_reader) {
1ba70 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
1ba80 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
1ba90 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a 0a 09 09  reader);...}....
1baa0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1bab0 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72  [idx].cached_cer
1bac0 74 73 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  ts) {....cackey_
1bad0 66 72 65 65 5f 63 65 72 74 73 28 63 61 63 6b 65  free_certs(cacke
1bae0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63  y_slots[idx].cac
1baf0 68 65 64 5f 63 65 72 74 73 2c 20 63 61 63 6b 65  hed_certs, cacke
1bb00 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63  y_slots[idx].cac
1bb10 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c  hed_certs_count,
1bb20 20 31 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f   1);.....cackey_
1bb30 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65  slots[idx].cache
1bb40 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a  d_certs = NULL;.
1bb50 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  ..}..}...cackey_
1bb60 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
1bb70 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  );...cackey_init
1bb80 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 09 43  ialized = 0;...C
1bb90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1bba0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1bbb0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1bbc0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1bbd0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1bbe0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1bbf0 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f 29 28 43  RV, C_GetInfo)(C
1bc00 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  K_INFO_PTR pInfo
1bc10 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  ) {..static CK_U
1bc20 54 46 38 43 48 41 52 20 6d 61 6e 75 66 61 63 74  TF8CHAR manufact
1bc30 75 72 65 72 49 44 5b 5d 20 3d 20 22 55 2e 53 2e  urerID[] = "U.S.
1bc40 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b 0a 09 73   Government";..s
1bc50 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1bc60 52 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  R libraryDescrip
1bc70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79  tion[] = "CACKey
1bc80 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ";...CACKEY_DEBU
1bc90 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1bca0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
1bcb0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1bcc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1bcd0 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
1bce0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1bcf0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1bd00 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1bd10 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1bd20 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1bd30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1bd40 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1bd50 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1bd60 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1bd70 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1bd80 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f  ZED);..}...pInfo
1bd90 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f  ->cryptokiVersio
1bda0 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41 43 4b  n.major = ((CACK
1bdb0 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53  EY_CRYPTOKI_VERS
1bdc0 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31 36 29  ION_CODE) >> 16)
1bdd0 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
1bde0 3e 63 72 79 70 74 6f 6b 69 56 65 72 73 69 6f 6e  >cryptokiVersion
1bdf0 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43 4b 45  .minor = ((CACKE
1be00 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52 53 49  Y_CRYPTOKI_VERSI
1be10 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29 20 26  ON_CODE) >> 8) &
1be20 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73 65 74 28   0xff;...memset(
1be30 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1be40 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
1be50 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
1be60 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
1be70 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
1be80 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
1be90 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
1bea0 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
1beb0 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d  ) - 1);...pInfo-
1bec0 3e 66 6c 61 67 73 20 3d 20 30 78 30 30 3b 0a 0a  >flags = 0x00;..
1bed0 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c  .memset(pInfo->l
1bee0 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1bef0 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  n, ' ', sizeof(p
1bf00 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
1bf10 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
1bf20 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61  cpy(pInfo->libra
1bf30 72 79 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 6c  ryDescription, l
1bf40 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1bf50 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62 72 61 72  n, sizeof(librar
1bf60 79 44 65 73 63 72 69 70 74 69 6f 6e 29 20 2d 20  yDescription) - 
1bf70 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62  1);...pInfo->lib
1bf80 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  raryVersion.majo
1bf90 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
1bfa0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
1bfb0 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
1bfc0 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
1bfd0 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  inor = (cackey_g
1bfe0 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38  etversion() >> 8
1bff0 29 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b  ) & 0xff;...CACK
1c000 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1c010 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1c020 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
1c030 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1c040 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 50 72 6f  K);.}../*. * Pro
1c050 63 65 73 73 20 6c 69 73 74 20 6f 66 20 72 65 61  cess list of rea
1c060 64 65 72 73 2c 20 61 6e 64 20 63 72 65 61 74 65  ders, and create
1c070 20 6d 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e   mapping between
1c080 20 72 65 61 64 65 72 20 6e 61 6d 65 20 61 6e 64   reader name and
1c090 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a 43 4b 5f   slot ID. */.CK_
1c0a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1c0b0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
1c0c0 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f 4c 20 74  List)(CK_BBOOL t
1c0d0 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20 43 4b 5f  okenPresent, CK_
1c0e0 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f  SLOT_ID_PTR pSlo
1c0f0 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  tList, CK_ULONG_
1c100 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
1c110 09 73 74 61 74 69 63 20 69 6e 74 20 66 69 72 73  .static int firs
1c120 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09 69 6e 74  t_call = 1;..int
1c130 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1c140 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  int pcsc_connect
1c150 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  _ret;..CK_ULONG 
1c160 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
1c170 74 20 3d 20 30 2c 20 63 75 72 72 73 6c 6f 74 2c  t = 0, currslot,
1c180 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63 68 61 72   slot_idx;..char
1c190 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20   *pcsc_readers, 
1c1a0 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 2c  *pcsc_readers_s,
1c1b0 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65   *pcsc_readers_e
1c1c0 3b 0a 09 44 57 4f 52 44 20 70 63 73 63 5f 72 65  ;..DWORD pcsc_re
1c1d0 61 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47  aders_len;..LONG
1c1e0 20 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65   scard_listreade
1c1f0 72 73 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20  rs_ret;..size_t 
1c200 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 3b  curr_reader_len;
1c210 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
1c220 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1c230 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1c240 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c 43 6f 75  ");...if (pulCou
1c250 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
1c260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c270 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 43  NTF("Error. pulC
1c280 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ount is NULL.");
1c290 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1c2a0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1c2b0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1c2c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1c2d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c2e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1c2f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1c300 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c310 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1c320 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1c330 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
1c340 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
1c350 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1c360 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1c370 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1c380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c390 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
1c3a0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1c3b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1c3c0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1c3d0 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73 74 20 6f  ./* Clear list o
1c3e0 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 73 6c 6f 74  f slots */..slot
1c3f0 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 69 66 20  _reset = 0;..if 
1c400 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09  (pSlotList) {...
1c410 69 66 20 28 66 69 72 73 74 5f 63 61 6c 6c 29 20  if (first_call) 
1c420 7b 0a 09 09 09 66 69 72 73 74 5f 63 61 6c 6c 20  {....first_call 
1c430 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f 74 5f 72 65  = 0;.....slot_re
1c440 73 65 74 20 3d 20 31 3b 0a 09 09 7d 0a 0a 09 09  set = 1;...}....
1c450 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65  /* If any of the
1c460 20 73 6c 6f 74 73 20 68 61 76 65 20 62 65 65 6e   slots have been
1c470 20 72 65 73 65 74 20 74 68 65 6e 20 70 75 72 67   reset then purg
1c480 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
1c490 6e 20 61 6e 64 20 63 68 65 63 6b 20 61 67 61 69  n and check agai
1c4a0 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 63 75 72 72  n */...for (curr
1c4b0 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c  slot = 0; currsl
1c4c0 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  ot < (sizeof(cac
1c4d0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1c4e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1c4f0 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  [0])); currslot+
1c500 2b 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b  +) {....if (cack
1c510 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1c520 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  t].internal) {..
1c530 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
1c540 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
1c550 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1c560 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
1c570 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
1c580 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1c590 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 73 6c  ots[currslot].sl
1c5a0 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09  ot_reset) {.....
1c5b0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
1c5c0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d  .....break;....}
1c5d0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74  ...}....if (slot
1c5e0 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 43 41 43  _reset) {....CAC
1c5f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1c600 28 22 50 75 72 67 69 6e 67 20 61 6c 6c 20 73 6c  ("Purging all sl
1c610 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 22  ot information."
1c620 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c 79 20 75  );...../* Only u
1c630 70 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f  pdate the list o
1c640 66 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72  f slots if we ar
1c650 65 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  e actually being
1c660 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74   supply the slot
1c670 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1c680 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
1c690 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
1c6a0 3b 0a 0a 09 09 09 66 6f 72 20 28 63 75 72 72 73  ;.....for (currs
1c6b0 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
1c6c0 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
1c6d0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1c6e0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1c6f0 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
1c700 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b  ) {.....if (cack
1c710 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1c720 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  t].internal) {..
1c730 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1c740 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 61 63  ..}......if (cac
1c750 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1c760 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
1c770 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63   {......free(cac
1c780 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1c790 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ot].pcsc_reader)
1c7a0 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
1c7b0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70  lots[currslot].p
1c7c0 63 73 63 5f 72 65 61 64 65 72 20 3d 20 4e 55 4c  csc_reader = NUL
1c7d0 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  L;.....}......if
1c7e0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1c7f0 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 20  urrslot].label) 
1c800 7b 0a 09 09 09 09 09 66 72 65 65 28 63 61 63 6b  {......free(cack
1c810 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1c820 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09 09 09 09  t].label);......
1c830 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1c840 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20  rrslot].label = 
1c850 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  NULL;.....}.....
1c860 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1c870 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d  rrslot].active =
1c880 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73   0;....}...} els
1c890 65 20 7b 0a 09 09 09 0a 09 09 7d 0a 09 7d 0a 0a  e {.......}..}..
1c8a0 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 6c 69  ./* Determine li
1c8b0 73 74 20 6f 66 20 72 65 61 64 65 72 73 20 2a 2f  st of readers */
1c8c0 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
1c8d0 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63  et = cackey_pcsc
1c8e0 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 69 66 20  _connect();..if 
1c8f0 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65  (pcsc_connect_re
1c900 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
1c910 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
1c920 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c930 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43  Connection to PC
1c940 2f 53 43 20 66 61 69 6c 65 64 2c 20 61 73 73 75  /SC failed, assu
1c950 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73 22 29 3b  ming no slots");
1c960 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d  ....slot_count =
1c970 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   0;..} else {...
1c980 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1c990 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72 64 5f 6c   = 0;....scard_l
1c9a0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1c9b0 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1c9c0 73 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  s(*cackey_pcsc_h
1c9d0 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  andle, NULL, NUL
1c9e0 4c 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72 73  L, &pcsc_readers
1c9f0 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20 28 73 63  _len);....if (sc
1ca00 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1ca10 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 46 5f 43  ret == SCARD_F_C
1ca20 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a 09 09 09  OMM_ERROR) {....
1ca30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ca40 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 43 61 72  NTF("Error. SCar
1ca50 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20 72  dListReaders() r
1ca60 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 46 5f  eturned SCARD_F_
1ca70 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61 73 73 75  COMM_ERROR, assu
1ca80 6d 69 6e 67 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  ming Connection 
1ca90 74 6f 20 50 43 2f 53 43 20 77 65 6e 74 20 61 77  to PC/SC went aw
1caa0 61 79 2e 20 52 65 63 6f 6e 6e 65 63 74 69 6e 67  ay. Reconnecting
1cab0 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  .");.....cackey_
1cac0 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
1cad0 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
1cae0 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 09  c_connect();....
1caf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cb00 49 4e 54 46 28 22 54 72 79 69 6e 67 20 53 43 61  INTF("Trying SCa
1cb10 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 29 20  rdListReaders() 
1cb20 61 67 61 69 6e 22 29 3b 0a 09 09 09 73 63 61 72  again");....scar
1cb30 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1cb40 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
1cb50 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
1cb60 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
1cb70 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
1cb80 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 0a 09  ers_len);...}...
1cb90 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
1cba0 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
1cbb0 41 52 44 5f 53 5f 53 55 43 43 45 53 53 20 26 26  ARD_S_SUCCESS &&
1cbc0 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65   pcsc_readers_le
1cbd0 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09 70 63 73  n != 0) {....pcs
1cbe0 63 5f 72 65 61 64 65 72 73 20 3d 20 6d 61 6c 6c  c_readers = mall
1cbf0 6f 63 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f  oc(pcsc_readers_
1cc00 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63 5f 72 65  len);....pcsc_re
1cc10 61 64 65 72 73 5f 73 20 3d 20 70 63 73 63 5f 72  aders_s = pcsc_r
1cc20 65 61 64 65 72 73 3b 0a 0a 09 09 09 73 63 61 72  eaders;.....scar
1cc30 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1cc40 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
1cc50 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
1cc60 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
1cc70 70 63 73 63 5f 72 65 61 64 65 72 73 2c 20 26 70  pcsc_readers, &p
1cc80 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29  csc_readers_len)
1cc90 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 6c  ;....if (scard_l
1cca0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d  istreaders_ret =
1ccb0 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
1ccc0 53 29 20 7b 0a 09 09 09 09 70 63 73 63 5f 72 65  S) {.....pcsc_re
1ccd0 61 64 65 72 73 5f 65 20 3d 20 70 63 73 63 5f 72  aders_e = pcsc_r
1cce0 65 61 64 65 72 73 20 2b 20 70 63 73 63 5f 72 65  eaders + pcsc_re
1ccf0 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09 09 09 09  aders_len;......
1cd00 2f 2a 20 53 74 61 72 74 20 77 69 74 68 20 53 6c  /* Start with Sl
1cd10 6f 74 20 49 44 20 31 2c 20 74 6f 20 61 76 6f 69  ot ID 1, to avoi
1cd20 64 20 61 20 62 75 67 20 69 6e 20 47 44 4d 20 6f  d a bug in GDM o
1cd30 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09 09 2f 2a  n RHEL */...../*
1cd40 20 42 75 67 20 35 39 34 39 31 31 3a 20 68 74 74   Bug 594911: htt
1cd50 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61 2e 72 65  ps://bugzilla.re
1cd60 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77 5f 62 75  dhat.com/show_bu
1cd70 67 2e 63 67 69 3f 69 64 3d 35 39 34 39 31 31 20  g.cgi?id=594911 
1cd80 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c 6f 74 20  */.....currslot 
1cd90 3d 20 31 3b 0a 09 09 09 09 73 6c 6f 74 5f 63 6f  = 1;.....slot_co
1cda0 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09 77 68 69  unt = 0;.....whi
1cdb0 6c 65 20 28 70 63 73 63 5f 72 65 61 64 65 72 73  le (pcsc_readers
1cdc0 20 3c 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f   < pcsc_readers_
1cdd0 65 29 20 7b 0a 09 09 09 09 09 2f 2a 20 46 69 6e  e) {....../* Fin
1cde0 64 20 6e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  d next available
1cdf0 20 73 6c 6f 74 20 2a 2f 0a 09 09 09 09 09 66 6f   slot */......fo
1ce00 72 20 28 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  r (; currslot < 
1ce10 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1ce20 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1ce30 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1ce40 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
1ce50 09 09 09 09 09 09 69 66 20 28 21 63 61 63 6b 65  ......if (!cacke
1ce60 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1ce70 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09  ].active) {.....
1ce80 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09  ...break;.......
1ce90 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 63  }......}.......c
1cea0 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d  urr_reader_len =
1ceb0 20 73 74 72 6c 65 6e 28 70 63 73 63 5f 72 65 61   strlen(pcsc_rea
1cec0 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 69 66 20  ders);.......if 
1ced0 28 28 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ((pcsc_readers +
1cee0 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e   curr_reader_len
1cef0 29 20 3e 20 70 63 73 63 5f 72 65 61 64 65 72 73  ) > pcsc_readers
1cf00 5f 65 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  _e) {.......brea
1cf10 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
1cf20 69 66 20 28 63 75 72 72 5f 72 65 61 64 65 72 5f  if (curr_reader_
1cf30 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  len == 0) {.....
1cf40 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
1cf50 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 73 6c  ......if (currsl
1cf60 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ot >= (sizeof(ca
1cf70 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1cf80 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1cf90 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09 09 09 09  s[0]))) {.......
1cfa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cfb0 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f 72 65 20  NTF("Found more 
1cfc0 72 65 61 64 65 72 73 20 74 68 61 6e 20 73 6c 6f  readers than slo
1cfd0 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ts are available
1cfe0 21 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  !");........brea
1cff0 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  k;......}.......
1d000 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d010 4e 54 46 28 22 46 6f 75 6e 64 20 72 65 61 64 65  NTF("Found reade
1d020 72 3a 20 25 73 22 2c 20 70 63 73 63 5f 72 65 61  r: %s", pcsc_rea
1d030 64 65 72 73 29 3b 0a 0a 09 09 09 09 09 2f 2a 20  ders);......./* 
1d040 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
1d050 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
1d060 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
1d070 20 62 65 69 6e 67 20 61 73 6b 65 64 20 73 75 70   being asked sup
1d080 70 6c 79 20 74 68 65 20 73 6c 6f 74 20 69 6e 66  ply the slot inf
1d090 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 09  ormation */.....
1d0a0 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20  .if (pSlotList) 
1d0b0 7b 0a 09 09 09 09 09 09 69 66 20 28 73 6c 6f 74  {.......if (slot
1d0c0 5f 72 65 73 65 74 29 20 7b 0a 09 09 09 09 09 09  _reset) {.......
1d0d0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1d0e0 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 20 3d  rrslot].active =
1d0f0 20 31 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   1;........cacke
1d100 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1d110 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30 3b 0a  ].internal = 0;.
1d120 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1d130 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63  ots[currslot].pc
1d140 73 63 5f 72 65 61 64 65 72 20 3d 20 73 74 72 64  sc_reader = strd
1d150 75 70 28 70 63 73 63 5f 72 65 61 64 65 72 73 29  up(pcsc_readers)
1d160 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
1d170 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d180 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
1d190 74 65 64 20 3d 20 30 3b 0a 09 09 09 09 09 09 09  ted = 0;........
1d1a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1d1b0 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69  rslot].transacti
1d1c0 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b 0a 09 09  on_depth = 0;...
1d1d0 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
1d1e0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e  s[currslot].tran
1d1f0 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
1d200 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09 09 09 09  lock = 0;.......
1d210 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1d220 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e 5f 66 6c  rrslot].token_fl
1d230 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f  ags = CKF_LOGIN_
1d240 52 45 51 55 49 52 45 44 3b 0a 09 09 09 09 09 09  REQUIRED;.......
1d250 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1d260 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20  rrslot].label = 
1d270 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09 09 63 61  NULL;.........ca
1d280 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
1d290 65 73 65 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  eset(&cackey_slo
1d2a0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29 3b 0a 09  ts[currslot]);..
1d2b0 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c  .....}......} el
1d2c0 73 65 20 7b 0a 09 09 09 09 09 09 2f 2a 20 41 72  se {......./* Ar
1d2d0 74 69 66 69 63 69 61 6c 6c 79 20 69 6e 63 72 65  tificially incre
1d2e0 61 73 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ase the number o
1d2f0 66 20 61 63 74 69 76 65 20 73 6c 6f 74 73 20 62  f active slots b
1d300 79 20 77 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  y what will beco
1d310 6d 65 20 61 63 74 69 76 65 20 2a 2f 0a 09 09 09  me active */....
1d320 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b  ...slot_count++;
1d330 0a 09 09 09 09 09 7d 0a 09 09 09 09 09 63 75 72  ......}......cur
1d340 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09 09 09 70  rslot++;.......p
1d350 63 73 63 5f 72 65 61 64 65 72 73 20 2b 3d 20 63  csc_readers += c
1d360 75 72 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 2b  urr_reader_len +
1d370 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 66   1;.....}......f
1d380 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
1d390 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1d3a0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d3b0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1d3c0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1d3d0 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1d3e0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1d3f0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74  ts[currslot].act
1d400 69 76 65 29 20 7b 0a 09 09 09 09 09 09 43 41 43  ive) {.......CAC
1d410 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d420 28 22 46 6f 75 6e 64 20 61 63 74 69 76 65 20 73  ("Found active s
1d430 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e 73 69 67  lot %lu", (unsig
1d440 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 73 6c  ned long) currsl
1d450 6f 74 29 3b 0a 0a 09 09 09 09 09 09 73 6c 6f 74  ot);........slot
1d460 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d  _count++;......}
1d470 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
1d480 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
1d490 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 6f  BUG_PRINTF("Seco
1d4a0 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43 61 72 64  nd call to SCard
1d4b0 4c 69 73 74 52 65 61 64 65 72 73 20 66 61 69 6c  ListReaders fail
1d4c0 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f 25 6c  ed, return %s/%l
1d4d0 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  i", CACKEY_DEBUG
1d4e0 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
1d4f0 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69 73 74  O_STR(scard_list
1d500 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20 28 6c  readers_ret), (l
1d510 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73 74 72  ong) scard_listr
1d520 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09 09 09  eaders_ret);....
1d530 7d 0a 0a 09 09 09 66 72 65 65 28 70 63 73 63 5f  }.....free(pcsc_
1d540 72 65 61 64 65 72 73 5f 73 29 3b 0a 09 09 7d 20  readers_s);...} 
1d550 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59  else {....CACKEY
1d560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
1d570 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 53 43 61  irst call to SCa
1d580 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66 61  rdListReaders fa
1d590 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73 2f  iled, return %s/
1d5a0 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  %li", CACKEY_DEB
1d5b0 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
1d5c0 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c 69  _TO_STR(scard_li
1d5d0 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c 20  streaders_ret), 
1d5e0 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69 73  (long) scard_lis
1d5f0 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a 09  treaders_ret);..
1d600 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
1d610 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1d620 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1d630 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1d640 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1d650 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1d660 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1d670 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1d680 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1d690 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1d6a0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1d6b0 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55  (pSlotList == NU
1d6c0 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e  LL) {...*pulCoun
1d6d0 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a  t = slot_count;.
1d6e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d6f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1d700 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e 20 20  g CKR_OK (%i).  
1d710 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64 65 72  Found %lu reader
1d720 73 2c 20 62 75 74 20 6e 6f 74 20 73 74 6f 72 69  s, but not stori
1d730 6e 67 20 49 44 73 20 28 70 53 6c 6f 74 4c 69 73  ng IDs (pSlotLis
1d740 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20 43 4b 52  t == NULL)", CKR
1d750 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  _OK, (unsigned l
1d760 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  ong) slot_count)
1d770 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d780 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75 6e 74 20  OK);..}...count 
1d790 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a 09 69 66  = *pulCount;..if
1d7a0 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f 74 5f 63   (count < slot_c
1d7b0 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  ount) {...CACKEY
1d7c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d7d0 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63  rror. User alloc
1d7e0 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73  ated %lu entries
1d7f0 2c 20 62 75 74 20 77 65 20 68 61 76 65 20 25 6c  , but we have %l
1d800 75 20 65 6e 74 72 69 65 73 2e 22 2c 20 63 6f 75  u entries.", cou
1d810 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b  nt, slot_count);
1d820 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1d830 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1d840 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  ng CKR_BUFFER_TO
1d850 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09 09 72 65  O_SMALL");....re
1d860 74 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f  turn(CKR_BUFFER_
1d870 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a 09 7d 0a  TOO_SMALL);...}.
1d880 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1d890 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1d8a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1d8b0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1d8c0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1d8d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d8e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1d8f0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1d900 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1d910 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1d920 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d 20 30 3b  ...slot_idx = 0;
1d930 0a 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
1d940 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f 74 20 3c  = 0; (currslot <
1d950 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1d960 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1d970 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1d980 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20  )); currslot++) 
1d990 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  {...if (!cackey_
1d9a0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d9b0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 63 6f 6e  active) {....con
1d9c0 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66  tinue;...}....if
1d9d0 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d 20 63 6f   (slot_idx >= co
1d9e0 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  unt) {....CACKEY
1d9f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1da00 72 72 6f 72 2e 20 55 73 65 72 20 61 6c 6c 6f 63  rror. User alloc
1da10 61 74 65 64 20 25 6c 75 20 65 6e 74 72 69 65 73  ated %lu entries
1da20 2c 20 62 75 74 20 77 65 20 6a 75 73 74 20 74 72  , but we just tr
1da30 69 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ied to write to 
1da40 74 68 65 20 25 6c 75 20 69 6e 64 65 78 20 2d 2d  the %lu index --
1da50 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63 6f 75 6e   ignoring", coun
1da60 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b 0a 0a 09  t, slot_idx);...
1da70 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
1da80 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b 73 6c 6f  ...pSlotList[slo
1da90 74 5f 69 64 78 5d 20 3d 20 63 75 72 72 73 6c 6f  t_idx] = currslo
1daa0 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78 2b 2b 3b  t;...slot_idx++;
1dab0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1dac0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1dad0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1dae0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1daf0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1db00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1db10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1db20 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1db30 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1db40 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1db50 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 43  ROR);..}...*pulC
1db60 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e  ount = slot_coun
1db70 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
1db80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1db90 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2e  ing CKR_OK (%i).
1dba0 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61 64    Found %lu read
1dbb0 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28  ers.", CKR_OK, (
1dbc0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
1dbd0 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 72 65  lot_count);...re
1dbe0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  turn(CKR_OK);...
1dbf0 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20 3d 20 74  tokenPresent = t
1dc00 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20 2f 2a 20  okenPresent; /* 
1dc10 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76  Supress unused v
1dc20 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20  ariable warning 
1dc30 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  */.}..CK_DEFINE_
1dc40 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1dc50 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 29 28 43  C_GetSlotInfo)(C
1dc60 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1dc70 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46 4f 5f 50  , CK_SLOT_INFO_P
1dc80 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61  TR pInfo) {..sta
1dc90 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20  tic CK_UTF8CHAR 
1dca0 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 5b  slotDescription[
1dcb0 5d 20 3d 20 22 43 41 43 4b 65 79 20 53 6c 6f 74  ] = "CACKey Slot
1dcc0 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  ";..int mutex_re
1dcd0 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79 74 65 73  tval;..int bytes
1dce0 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43 41 43 4b  _to_copy;...CACK
1dcf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dd00 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1dd10 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
1dd20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1dd30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1dd40 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
1dd50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1dd60 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1dd70 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1dd80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1dd90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dda0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ddb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ddc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ddd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1dde0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1ddf0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
1de00 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
1de10 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1de20 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1de30 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
1de40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1de50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1de60 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1de70 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
1de80 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
1de90 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
1dea0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1deb0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1dec0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1ded0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1dee0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1def0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1df00 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1df10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1df20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1df30 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1df40 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1df50 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1df60 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1df70 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
1df80 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
1df90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dfa0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1dfb0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1dfc0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
1dfd0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
1dfe0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
1dff0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1e000 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1e010 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1e020 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1e030 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  ALID);..}...pInf
1e040 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 48  o->flags = CKF_H
1e050 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20 28 21 63  W_SLOT;...if (!c
1e060 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1e070 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a  ID].internal) {.
1e080 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c  ..pInfo->flags |
1e090 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42 4c 45 5f  = CKF_REMOVABLE_
1e0a0 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09 69 66 20  DEVICE;..}...if 
1e0b0 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
1e0c0 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
1e0d0 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 3d 3d 20  ots[slotID]) == 
1e0e0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
1e0f0 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
1e100 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 7c 3d 20  pInfo->flags |= 
1e110 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45 53 45 4e  CKF_TOKEN_PRESEN
1e120 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73 5f 74 6f  T;..}...bytes_to
1e130 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65 6e 28 63  _copy = strlen(c
1e140 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1e150 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  ID].pcsc_reader)
1e160 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66 28 70 49  ;..if (sizeof(pI
1e170 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65  nfo->manufacture
1e180 72 49 44 29 20 3c 20 62 79 74 65 73 5f 74 6f 5f  rID) < bytes_to_
1e190 63 6f 70 79 29 20 7b 0a 09 09 62 79 74 65 73 5f  copy) {...bytes_
1e1a0 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a 65 6f 66  to_copy = sizeof
1e1b0 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1e1c0 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09 6d 65 6d  urerID);..}..mem
1e1d0 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
1e1e0 61 63 74 75 72 65 72 49 44 2c 20 63 61 63 6b 65  acturerID, cacke
1e1f0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1e200 70 63 73 63 5f 72 65 61 64 65 72 2c 20 62 79 74  pcsc_reader, byt
1e210 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 0a 09 6d  es_to_copy);...m
1e220 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1e230 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1e240 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1e250 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1e260 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1e270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e280 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1e290 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1e2a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1e2b0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1e2c0 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  }...memset(pInfo
1e2d0 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  ->slotDescriptio
1e2e0 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  n, ' ', sizeof(p
1e2f0 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69  Info->slotDescri
1e300 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d 63 70 79  ption));..memcpy
1e310 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
1e320 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74 44 65 73  ription, slotDes
1e330 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66  cription, sizeof
1e340 28 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e  (slotDescription
1e350 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
1e360 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1e370 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a  urerID, ' ', siz
1e380 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
1e390 61 63 74 75 72 65 72 49 44 29 29 3b 0a 0a 09 70  acturerID));...p
1e3a0 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1e3b0 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63  rsion.major = (c
1e3c0 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1e3d0 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  () >> 16) & 0xff
1e3e0 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ;..pInfo->hardwa
1e3f0 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
1e400 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
1e410 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30  sion() >> 8) & 0
1e420 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69  xff;...pInfo->fi
1e430 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rmwareVersion.ma
1e440 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e  jor = 0x00;..pIn
1e450 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
1e460 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30  ion.minor = 0x00
1e470 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1e480 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1e490 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1e4a0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1e4b0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1e4c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1e4d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 54 6f  N(CK_RV, C_GetTo
1e4e0 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54  kenInfo)(CK_SLOT
1e4f0 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 54  _ID slotID, CK_T
1e500 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49  OKEN_INFO_PTR pI
1e510 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43  nfo) {..static C
1e520 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66  K_UTF8CHAR manuf
1e530 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55  acturerID[] = "U
1e540 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b  .S. Government";
1e550 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1e560 43 48 41 52 20 64 65 66 61 75 6c 74 4c 61 62 65  CHAR defaultLabe
1e570 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77 6e 20 54  l[] = "Unknown T
1e580 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69 63 20 43  oken";..static C
1e590 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f 64 65 6c  K_UTF8CHAR model
1e5a0 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b 65 6e 22  [] = "CAC Token"
1e5b0 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
1e5c0 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
1e5d0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 3b  pcsc_identities;
1e5e0 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
1e5f0 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73 73 69 7a  num_certs;..ssiz
1e600 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74 3b 0a 09  e_t label_ret;..
1e610 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1e620 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65 66 61 75  ;..int use_defau
1e630 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43 41 43 4b  lt_label;...CACK
1e640 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1e650 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1e660 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
1e670 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e680 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e690 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
1e6a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e6b0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1e6c0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1e6d0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1e6e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e6f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e700 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1e710 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e720 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1e730 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1e740 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
1e750 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
1e760 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1e770 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1e780 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
1e790 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1e7a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1e7b0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1e7c0 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
1e7d0 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
1e7e0 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
1e7f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1e800 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1e810 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1e820 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1e830 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1e840 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1e850 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1e860 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e870 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1e880 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1e890 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e8a0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1e8b0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1e8c0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
1e8d0 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
1e8e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1e8f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1e900 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1e910 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
1e920 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
1e930 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
1e940 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1e950 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1e960 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1e970 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1e980 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
1e990 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65  cackey_token_pre
1e9a0 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  sent(&cackey_slo
1e9b0 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20 43  ts[slotID]) != C
1e9c0 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b  ACKEY_PCSC_S_TOK
1e9d0 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09 43  ENPRESENT) {...C
1e9e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e9f0 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20 69 73 20  TF("No token is 
1ea00 70 72 65 73 65 6e 74 20 69 6e 20 73 6c 6f 74 49  present in slotI
1ea10 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f 74 49 44  D = %lu", slotID
1ea20 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
1ea30 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
1ea40 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
1ea50 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 4e  turn(CKR_TOKEN_N
1ea60 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a 09 7d 0a  OT_PRESENT);..}.
1ea70 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1ea80 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1ea90 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1eaa0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1eab0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1eac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ead0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1eae0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1eaf0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1eb00 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1eb10 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
1eb20 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62 65 6c 20  ine token label 
1eb30 66 72 6f 6d 20 63 65 72 74 69 66 69 63 61 74 65  from certificate
1eb40 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28 70 49 6e  s */..memset(pIn
1eb50 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20 27 2c 20  fo->label, ' ', 
1eb60 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
1eb70 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64 65 66 61  bel));..use_defa
1eb80 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31 3b 0a 0a  ult_label = 1;..
1eb90 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1eba0 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20  s[slotID].label 
1ebb0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 70 63 73  == NULL) {...pcs
1ebc0 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  c_identities = c
1ebd0 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73  ackey_read_certs
1ebe0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
1ebf0 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c 20 26 6e  lotID], NULL, &n
1ec00 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09 69 66 20  um_certs);...if 
1ec10 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73  (pcsc_identities
1ec20 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
1ec30 66 20 28 6e 75 6d 5f 63 65 72 74 73 20 3e 20 30  f (num_certs > 0
1ec40 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c 5f 72 65  ) {.....label_re
1ec50 74 20 3d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  t = cackey_pcsc_
1ec60 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62 65  identity_to_labe
1ec70 6c 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  l(pcsc_identitie
1ec80 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  s, pInfo->label,
1ec90 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1eca0 61 62 65 6c 29 29 3b 0a 09 09 09 09 69 66 20 28  abel));.....if (
1ecb0 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30 29 20 7b  label_ret > 0) {
1ecc0 0a 09 09 09 09 09 75 73 65 5f 64 65 66 61 75 6c  ......use_defaul
1ecd0 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 0a 09 09  t_label = 0;....
1ece0 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1ecf0 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20  slotID].label = 
1ed00 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 70 49  malloc(sizeof(pI
1ed10 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09  nfo->label));...
1ed20 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
1ed30 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1ed40 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d 3e 6c 61  label, pInfo->la
1ed50 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
1ed60 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09  o->label));.....
1ed70 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65  }....}.....cacke
1ed80 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70 63 73  y_free_certs(pcs
1ed90 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  c_identities, nu
1eda0 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 09 09 7d  m_certs, 1);...}
1edb0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
1edc0 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  cpy(pInfo->label
1edd0 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  , cackey_slots[s
1ede0 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 73 69  lotID].label, si
1edf0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
1ee00 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64 65 66 61  l));....use_defa
1ee10 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a 09  ult_label = 0;..
1ee20 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64 65 66 61  }...if (use_defa
1ee30 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a 09 09 6d  ult_label) {...m
1ee40 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61 62  emcpy(pInfo->lab
1ee50 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61 62 65 6c  el, defaultLabel
1ee60 2c 20 73 69 7a 65 6f 66 28 64 65 66 61 75 6c 74  , sizeof(default
1ee70 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a 09 7d 0a  Label) - 1);..}.
1ee80 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1ee90 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1eea0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1eeb0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1eec0 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  D));..memcpy(pIn
1eed0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1eee0 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72  ID, manufacturer
1eef0 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66  ID, sizeof(manuf
1ef00 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b  acturerID) - 1);
1ef10 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1ef20 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20 73 69 7a  >model, ' ', siz
1ef30 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c  eof(pInfo->model
1ef40 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66  ));..memcpy(pInf
1ef50 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64 65 6c 2c  o->model, model,
1ef60 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c 29 20 2d   sizeof(model) -
1ef70 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49   1);...memset(pI
1ef80 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62 65  nfo->serialNumbe
1ef90 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  r, ' ', sizeof(p
1efa0 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75 6d 62  Info->serialNumb
1efb0 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  er));...memset(p
1efc0 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 2c 20 27  Info->utcTime, '
1efd0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1efe0 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a 0a 09 70  ->utcTime));...p
1eff0 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72 65 56 65  Info->hardwareVe
1f000 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63  rsion.major = (c
1f010 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1f020 28 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  () >> 16) & 0xff
1f030 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61  ;..pInfo->hardwa
1f040 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
1f050 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72  = (cackey_getver
1f060 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30  sion() >> 8) & 0
1f070 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 69  xff;...pInfo->fi
1f080 72 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61  rmwareVersion.ma
1f090 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09 70 49 6e  jor = 0x00;..pIn
1f0a0 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
1f0b0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30 78 30 30  ion.minor = 0x00
1f0c0 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ;...pInfo->flags
1f0d0 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f 50 52 4f   = CKF_WRITE_PRO
1f0e0 54 45 43 54 45 44 20 7c 20 43 4b 46 5f 55 53 45  TECTED | CKF_USE
1f0f0 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c 49 5a 45  R_PIN_INITIALIZE
1f100 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e 5f 49 4e  D | CKF_TOKEN_IN
1f110 49 54 49 41 4c 49 5a 45 44 20 7c 20 63 61 63 6b  ITIALIZED | cack
1f120 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1f130 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09  .token_flags;...
1f140 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53 65 73 73  pInfo->ulMaxSess
1f150 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73 69 7a 65  ionCount = (size
1f160 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1f170 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1f180 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1f190 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ) - 1;..pInfo->u
1f1a0 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  lSessionCount = 
1f1b0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1f1c0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1f1d0 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65 73 73 69  fo->ulMaxRwSessi
1f1e0 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 70 49  onCount = 0;..pI
1f1f0 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73 69 6f 6e  nfo->ulRwSession
1f200 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41  Count = CK_UNAVA
1f210 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
1f220 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ON;..pInfo->ulMa
1f230 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38 3b 0a 09  xPinLen = 128;..
1f240 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50 69 6e 4c  pInfo->ulMinPinL
1f250 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e  en = 0;..pInfo->
1f260 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63 4d 65 6d  ulTotalPublicMem
1f270 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
1f280 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
1f290 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65  ;..pInfo->ulFree
1f2a0 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43  PublicMemory = C
1f2b0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
1f2c0 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
1f2d0 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69 76 61 74  o->ulTotalPrivat
1f2e0 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  eMemory = CK_UNA
1f2f0 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
1f300 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c  TION;..pInfo->ul
1f310 46 72 65 65 50 72 69 76 61 74 65 4d 65 6d 6f 72  FreePrivateMemor
1f320 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42  y = CK_UNAVAILAB
1f330 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a  LE_INFORMATION;.
1f340 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f350 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1f360 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1f370 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1f380 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1f390 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1f3a0 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74 46 6f 72  CK_RV, C_WaitFor
1f3b0 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b 5f 46 4c  SlotEvent)(CK_FL
1f3c0 41 47 53 20 66 6c 61 67 73 2c 20 43 4b 5f 53 4c  AGS flags, CK_SL
1f3d0 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c 6f 74 49  OT_ID_PTR pSlotI
1f3e0 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  D, CK_VOID_PTR p
1f3f0 52 65 73 65 72 76 65 64 29 20 7b 0a 09 43 41 43  Reserved) {..CAC
1f400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f410 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1f420 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
1f430 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1f440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f450 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
1f460 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
1f470 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1f480 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1f490 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1f4a0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1f4b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f4c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1f4d0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1f4e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1f4f0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1f500 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2f  IALIZED);..}.../
1f510 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20 49 6d 70  * XXX: TODO: Imp
1f520 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e 2e 20 2a  lement this... *
1f530 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  /..CACKEY_DEBUG_
1f540 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1f550 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1f560 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1f570 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1f580 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1f590 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1f5a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1f5b0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1f5c0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1f5d0 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  RV, C_GetMechani
1f5e0 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c 4f 54 5f  smList)(CK_SLOT_
1f5f0 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45  ID slotID, CK_ME
1f600 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f 50 54 52  CHANISM_TYPE_PTR
1f610 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 2c   pMechanismList,
1f620 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
1f630 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45  lCount) {..CACKE
1f640 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f650 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1f660 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1f670 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1f680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1f690 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1f6a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1f6b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1f6c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1f6d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
1f6e0 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
1f6f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f700 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f710 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c  pulCount is NULL
1f720 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f730 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1f740 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
1f750 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d 20 4e 55  hanismList == NU
1f760 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43 6f 75 6e  LL) {...*pulCoun
1f770 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59  t = 1;....CACKEY
1f780 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1f790 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1f7a0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1f7b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1f7c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a 70 75 6c  );..}...if (*pul
1f7d0 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a 09 09 43  Count < 1) {...C
1f7e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f7f0 54 46 28 22 45 72 72 6f 72 2e 20 20 42 75 66 66  TF("Error.  Buff
1f800 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e 22 29 3b  er too small.");
1f810 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42  ....return(CKR_B
1f820 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
1f830 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61 6e 69 73  ;..}...pMechanis
1f840 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b 4d 5f 52  mList[0] = CKM_R
1f850 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75 6c 43 6f  SA_PKCS;..*pulCo
1f860 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b 45  unt = 1;...CACKE
1f870 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f880 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1f890 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1f8a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1f8b0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1f8c0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f8d0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
1f8e0 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  fo)(CK_SLOT_ID s
1f8f0 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e  lotID, CK_MECHAN
1f900 49 53 4d 5f 54 59 50 45 20 74 79 70 65 2c 20 43  ISM_TYPE type, C
1f910 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49 4e 46 4f  K_MECHANISM_INFO
1f920 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69  _PTR pInfo) {..i
1f930 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
1f940 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f950 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f960 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
1f970 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1f980 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f990 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
1f9a0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1f9b0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1f9c0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1f9d0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1f9e0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1f9f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fa00 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1fa10 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1fa20 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1fa30 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1fa40 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
1fa50 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1fa60 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1fa70 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1fa80 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1fa90 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1faa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fab0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1fac0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1fad0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1fae0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1faf0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1fb00 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1fb10 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1fb20 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1fb30 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1fb40 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1fb50 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1fb60 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1fb70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fb80 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1fb90 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1fba0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1fbb0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1fbc0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1fbd0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1fbe0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1fbf0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1fc00 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1fc10 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1fc20 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1fc30 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1fc40 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1fc50 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1fc60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1fc70 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1fc80 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1fc90 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1fca0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
1fcb0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1fcc0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1fcd0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1fce0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1fcf0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1fd00 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
1fd10 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fd20 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1fd30 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
1fd40 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
1fd50 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  KM_RSA_PKCS:....
1fd60 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b 65 79 53  pInfo->ulMinKeyS
1fd70 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09 09 70 49  ize = 512;....pI
1fd80 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79 53 69 7a  nfo->ulMaxKeySiz
1fd90 65 20 3d 20 38 31 39 32 3b 0a 09 09 09 70 49 6e  e = 8192;....pIn
1fda0 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
1fdb0 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52 59 50 54  HW | CKF_ENCRYPT
1fdc0 20 7c 20 43 4b 46 5f 44 45 43 52 59 50 54 20 7c   | CKF_DECRYPT |
1fdd0 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43 4b 46 5f   CKF_SIGN | CKF_
1fde0 56 45 52 49 46 59 3b 0a 09 09 09 62 72 65 61 6b  VERIFY;....break
1fdf0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
1fe00 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1fe10 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1fe20 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1fe30 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1fe40 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
1fe50 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
1fe60 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
1fe70 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1fe80 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28 43 4b 5f  C_InitToken)(CK_
1fe90 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
1fea0 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
1feb0 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
1fec0 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55 54 46 38  lPinLen, CK_UTF8
1fed0 43 48 41 52 5f 50 54 52 20 70 4c 61 62 65 6c 29  CHAR_PTR pLabel)
1fee0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1fef0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1ff00 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1ff10 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ff20 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ff30 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ff40 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ff50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ff60 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ff70 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1ff80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ff90 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ffa0 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45   CKR_TOKEN_WRITE
1ffb0 5f 50 52 4f 54 45 43 54 45 44 20 28 25 69 29 22  _PROTECTED (%i)"
1ffc0 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54  , CKR_TOKEN_WRIT
1ffd0 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 0a 09  E_PROTECTED);...
1ffe0 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e  return(CKR_TOKEN
1fff0 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
20000 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27  );.}../* We don'
20010 74 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d  t support this m
20020 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46  ethod. */.CK_DEF
20030 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
20040 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e 29 28 43  RV, C_InitPIN)(C
20050 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
20060 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 54   hSession, CK_UT
20070 46 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c  F8CHAR_PTR pPin,
20080 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c   CK_ULONG ulPinL
20090 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
200a0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
200b0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
200c0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
200d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
200e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
200f0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
20100 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
20110 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
20120 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
20130 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
20140 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20150 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
20160 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
20170 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
20180 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
20190 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
201a0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
201b0 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
201c0 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
201d0 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
201e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
201f0 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50 49 4e 29  CK_RV, C_SetPIN)
20200 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
20210 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
20220 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 4f 6c  UTF8CHAR_PTR pOl
20230 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  dPin, CK_ULONG u
20240 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  lOldPinLen, CK_U
20250 54 46 38 43 48 41 52 5f 50 54 52 20 70 4e 65 77  TF8CHAR_PTR pNew
20260 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  Pin, CK_ULONG ul
20270 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41  NewPinLen) {..CA
20280 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20290 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
202a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
202b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
202c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
202d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
202e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
202f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
20300 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
20310 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
20320 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20330 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
20340 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
20350 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
20360 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
20370 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
20380 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
20390 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
203a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
203b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4f  CTION(CK_RV, C_O
203c0 70 65 6e 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53  penSession)(CK_S
203d0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
203e0 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43  K_FLAGS flags, C
203f0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
20400 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e 4f 54 49  ication, CK_NOTI
20410 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b 5f 53 45  FY notify, CK_SE
20420 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 50 54 52  SSION_HANDLE_PTR
20430 20 70 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 75   phSession) {..u
20440 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 78  nsigned long idx
20450 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
20460 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75 6e 64 5f  val;..int found_
20470 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 0a 09 43  session = 0;...C
20480 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20490 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
204a0 09 69 66 20 28 28 66 6c 61 67 73 20 26 20 43 4b  .if ((flags & CK
204b0 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
204c0 29 20 21 3d 20 43 4b 46 5f 53 45 52 49 41 4c 5f  ) != CKF_SERIAL_
204d0 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09 72 65 74  SESSION) {...ret
204e0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
204f0 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f 53 55 50  PARALLEL_NOT_SUP
20500 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  PORTED);..}...if
20510 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
20520 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
20530 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20540 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
20550 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
20560 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
20570 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
20580 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c  ED);..}...if (sl
20590 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
205a0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
205b0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
205c0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
205d0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
205e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
205f0 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
20600 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
20610 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
20620 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
20630 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
20640 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
20650 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
20660 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
20670 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
20680 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20690 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
206a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
206b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
206c0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
206d0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
206e0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
206f0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
20700 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
20710 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
20720 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20730 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20740 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
20750 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
20760 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
20770 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
20780 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
20790 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
207a0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
207b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
207c0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
207d0 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68  }.../* Verify th
207e0 61 74 20 74 68 65 20 63 61 72 64 20 69 73 20 61  at the card is a
207f0 63 74 75 61 6c 6c 79 20 69 6e 20 74 68 65 20 73  ctually in the s
20800 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58 58 58 3a  lot. */../* XXX:
20810 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
20820 75 72 65 20 74 68 69 73 20 69 73 20 69 6e 20 74  ure this is in t
20830 68 65 20 50 4b 43 53 23 31 31 20 73 70 65 63 69  he PKCS#11 speci
20840 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  fication */..if 
20850 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72  (cackey_token_pr
20860 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f 73 6c  esent(&cackey_sl
20870 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21 3d 20  ots[slotID]) != 
20880 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f  CACKEY_PCSC_S_TO
20890 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a 09 09  KENPRESENT) {...
208a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
208b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 43 61 72  NTF("Error.  Car
208c0 64 20 6e 6f 74 20 70 72 65 73 65 6e 74 2e 20 20  d not present.  
208d0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 44 45  Returning CKR_DE
208e0 56 49 43 45 5f 52 45 4d 4f 56 45 44 22 29 3b 0a  VICE_REMOVED");.
208f0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20900 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20910 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
20920 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  n(CKR_DEVICE_REM
20930 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  OVED);..}...for 
20940 28 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20  (idx = 1; idx < 
20950 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
20960 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
20970 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
20980 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
20990 0a 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
209a0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74  essions[idx].act
209b0 69 76 65 29 20 7b 0a 09 09 09 66 6f 75 6e 64 5f  ive) {....found_
209c0 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a 0a 09 09  session = 1;....
209d0 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d 20 69 64  .*phSession = id
209e0 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  x;.....cackey_se
209f0 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
20a00 76 65 20 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65  ve = 1;....cacke
20a10 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
20a20 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74 49 44 3b  slotID = slotID;
20a30 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
20a40 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74 65 20 3d  ons[idx].state =
20a50 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53   CKS_RO_PUBLIC_S
20a60 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61 63 6b 65  ESSION;....cacke
20a70 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
20a80 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 09  flags = flags;..
20a90 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
20aa0 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69 63 65 45  s[idx].ulDeviceE
20ab0 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09 63 61 63  rror = 0;....cac
20ac0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
20ad0 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f 6e 20 3d  ].pApplication =
20ae0 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09   pApplication;..
20af0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
20b00 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79 20 3d 20  s[idx].Notify = 
20b10 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63 61 63 6b  notify;.....cack
20b20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
20b30 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55  .identities = NU
20b40 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  LL;....cackey_se
20b50 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e  ssions[idx].iden
20b60 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30  tities_count = 0
20b70 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
20b80 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65 61 72 63  sions[idx].searc
20b90 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  h_active = 0;...
20ba0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
20bb0 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61 63 74 69  s[idx].sign_acti
20bc0 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
20bd0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
20be0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
20bf0 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
20c00 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69 64  sessions[idx].id
20c10 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65  entities = cacke
20c20 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
20c30 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  s(&cackey_slots[
20c40 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79  slotID], &cackey
20c50 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
20c60 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
20c70 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
20c80 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  }..}...mutex_ret
20c90 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
20ca0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20cb0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
20cc0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
20cd0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
20ce0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20cf0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
20d00 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
20d10 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
20d20 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
20d30 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 29 20  !found_session) 
20d40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20d50 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
20d60 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ng CKR_SESSION_C
20d70 4f 55 4e 54 20 28 25 69 29 22 2c 20 43 4b 52 5f  OUNT (%i)", CKR_
20d80 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a  SESSION_COUNT);.
20d90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
20da0 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b 0a 09 7d  SSION_COUNT);..}
20db0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20dc0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
20dd0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
20de0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
20df0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
20e00 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
20e10 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 53  (CK_RV, C_CloseS
20e20 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49  ession)(CK_SESSI
20e30 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
20e40 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78  on) {..int mutex
20e50 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
20e60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20e70 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
20e80 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
20e90 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
20ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20eb0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
20ec0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
20ed0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
20ee0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
20ef0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
20f00 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
20f10 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
20f20 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
20f30 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
20f40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
20f50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20f60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20f70 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
20f80 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
20f90 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
20fa0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
20fb0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
20fc0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20fd0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
20fe0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
20ff0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
21000 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
21010 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21020 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
21030 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21040 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21050 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
21060 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21070 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
21080 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
21090 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
210a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
210b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
210c0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
210d0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
210e0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
210f0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
21100 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
21110 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21120 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
21130 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 66 72   = 0;..cackey_fr
21140 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
21150 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21160 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
21170 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
21180 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
21190 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
211a0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
211b0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
211c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
211d0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
211e0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
211f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21200 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21210 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
21220 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21230 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21240 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21250 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21260 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
21270 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
21280 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
21290 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
212a0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
212b0 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 29  loseAllSessions)
212c0 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
212d0 49 44 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  ID) {..uint32_t 
212e0 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
212f0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
21300 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
21310 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
21320 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
21330 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
21340 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21350 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
21360 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
21370 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
21380 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
21390 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
213a0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
213b0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
213c0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
213d0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
213e0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
213f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21400 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
21410 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
21420 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
21430 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
21440 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
21450 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
21460 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
21470 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
21480 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
21490 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
214a0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
214b0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
214c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
214d0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
214e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
214f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
21500 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
21510 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
21520 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
21530 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21540 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21550 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
21560 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
21570 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
21580 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
21590 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
215a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
215b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
215c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
215d0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
215e0 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
215f0 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
21600 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
21610 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
21620 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
21630 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
21640 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
21650 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 69  ].active) {....i
21660 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
21670 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 21  ns[idx].slotID !
21680 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09 09 09 09  = slotID) {.....
21690 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
216a0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
216b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
216c0 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f 43 6c 6f  glock);....C_Clo
216d0 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a  seSession(idx);.
216e0 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
216f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
21700 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ock);...}..}...m
21710 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
21720 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
21730 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
21740 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
21750 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
21760 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21770 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
21780 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
21790 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
217a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
217b0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
217c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
217d0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
217e0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
217f0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
21800 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
21810 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 65  N(CK_RV, C_GetSe
21820 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b 5f 53 45  ssionInfo)(CK_SE
21830 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21840 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53 53 49 4f  ssion, CK_SESSIO
21850 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  N_INFO_PTR pInfo
21860 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
21870 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
21880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
21890 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
218a0 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
218b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
218c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
218d0 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
218e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
218f0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
21900 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21910 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21920 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21930 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
21940 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
21950 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
21960 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
21970 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
21980 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
21990 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
219a0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
219b0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
219c0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
219d0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
219e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
219f0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
21a00 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
21a10 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
21a20 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
21a30 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
21a40 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
21a50 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
21a60 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21a70 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
21a80 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
21a90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21aa0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
21ab0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
21ac0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21ad0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
21ae0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
21af0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21b00 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
21b10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
21b20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21b30 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
21b40 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21b50 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
21b60 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
21b70 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
21b80 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
21b90 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 73 6c 6f  ..}...pInfo->slo
21ba0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
21bb0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21bc0 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66 6f 2d 3e  slotID;..pInfo->
21bd0 73 74 61 74 65 20 3d 20 63 61 63 6b 65 79 5f 73  state = cackey_s
21be0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21bf0 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e 66 6f 2d  ].state;..pInfo-
21c00 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b 65 79 5f  >flags = cackey_
21c10 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21c20 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49 6e 66 6f  n].flags;..pInfo
21c30 2d 3e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20  ->ulDeviceError 
21c40 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
21c50 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75 6c 44 65  s[hSession].ulDe
21c60 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09 6d 75 74  viceError;...mut
21c70 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
21c80 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
21c90 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21ca0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
21cb0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
21cc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21cd0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
21ce0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
21cf0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
21d00 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
21d10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21d20 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
21d30 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
21d40 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
21d50 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
21d60 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
21d70 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 70 65 72  CK_RV, C_GetOper
21d80 61 74 69 6f 6e 53 74 61 74 65 29 28 43 4b 5f 53  ationState)(CK_S
21d90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
21da0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
21db0 50 54 52 20 70 4f 70 65 72 61 74 69 6f 6e 53 74  PTR pOperationSt
21dc0 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ate, CK_ULONG_PT
21dd0 52 20 70 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74  R pulOperationSt
21de0 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  ateLen) {..CACKE
21df0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21e00 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21e10 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21e20 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21e30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21e40 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
21e50 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
21e60 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
21e70 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
21e80 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
21e90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
21ea0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
21eb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
21ec0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
21ed0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
21ee0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
21ef0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
21f00 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
21f10 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
21f20 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 4f  ON(CK_RV, C_SetO
21f30 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
21f40 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
21f50 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
21f60 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
21f70 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
21f80 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53 74 61 74   ulOperationStat
21f90 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  eLen, CK_OBJECT_
21fa0 48 41 4e 44 4c 45 20 68 45 6e 63 72 79 70 74 69  HANDLE hEncrypti
21fb0 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  onKey, CK_OBJECT
21fc0 5f 48 41 4e 44 4c 45 20 68 41 75 74 68 65 6e 74  _HANDLE hAuthent
21fd0 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b 0a 09 43  icationKey) {..C
21fe0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21ff0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
22000 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
22010 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
22020 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22030 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
22040 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
22050 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
22060 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
22070 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
22080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22090 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
220a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
220b0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
220c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
220d0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
220e0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
220f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22100 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22110 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
22120 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53 53 49 4f  Login)(CK_SESSIO
22130 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
22140 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59 50 45 20  n, CK_USER_TYPE 
22150 75 73 65 72 54 79 70 65 2c 20 43 4b 5f 55 54 46  userType, CK_UTF
22160 38 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20  8CHAR_PTR pPin, 
22170 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65  CK_ULONG ulPinLe
22180 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  n) {..CK_SLOT_ID
22190 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
221a0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
221b0 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
221c0 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f 72 65 74  ;..int login_ret
221d0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
221e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
221f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22200 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22210 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22220 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22230 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22240 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22250 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22260 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22270 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
22280 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
22290 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
222a0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
222b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
222c0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
222d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
222e0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
222f0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
22300 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
22310 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
22320 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
22330 0a 0a 09 69 66 20 28 75 73 65 72 54 79 70 65 20  ...if (userType 
22340 21 3d 20 43 4b 55 5f 55 53 45 52 29 20 7b 0a 09  != CKU_USER) {..
22350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22360 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 57 65  INTF("Error.  We
22370 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 55 53   only support US
22380 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65 64 20 66  ER mode, asked f
22390 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22 2c 20 28  or %lu mode.", (
223a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
223b0 73 65 72 54 79 70 65 29 0a 0a 09 09 72 65 74 75  serType)....retu
223c0 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54 59 50 45  rn(CKR_USER_TYPE
223d0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
223e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
223f0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
22400 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
22410 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
22420 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
22430 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22440 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
22450 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22460 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22470 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22480 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
22490 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
224a0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
224b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
224c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
224d0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
224e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
224f0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
22500 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
22510 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
22520 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
22530 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63  ..}...slotID = c
22540 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22550 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
22560 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
22570 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
22580 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
22590 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
225a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
225b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
225c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
225d0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
225e0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
225f0 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
22600 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
22610 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
22620 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
22630 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
22640 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
22650 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
22660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22670 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
22680 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
22690 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
226a0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
226b0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
226c0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
226d0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
226e0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
226f0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
22700 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e 5f 72 65  );..}...login_re
22710 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e  t = cackey_login
22720 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
22730 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c 20 75 6c  lotID], pPin, ul
22740 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65 73 5f 72  PinLen, &tries_r
22750 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69 66 20 28  emaining);..if (
22760 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20 43 41 43  login_ret != CAC
22770 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
22780 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
22790 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
227a0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6c  glock);....if (l
227b0 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b  ogin_ret == CACK
227c0 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
227d0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
227e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
227f0 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20 6c 6f 63  r.  Token is loc
22800 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ked.");.....cack
22810 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
22820 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20  .token_flags |= 
22830 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c 4f 43  CKF_USER_PIN_LOC
22840 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  KED;.....return(
22850 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 29 3b  CKR_PIN_LOCKED);
22860 0a 09 09 7d 20 65 6c 73 65 20 69 66 20 28 6c 6f  ...} else if (lo
22870 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45  gin_ret == CACKE
22880 59 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29  Y_PCSC_E_BADPIN)
22890 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
228a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
228b0 2e 20 20 49 6e 76 61 6c 69 64 20 50 49 4e 2e 22  .  Invalid PIN."
228c0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  );.....cackey_sl
228d0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
228e0 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
228f0 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
22900 57 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  W;.....if (tries
22910 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 31 29  _remaining == 1)
22920 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c   {.....cackey_sl
22930 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65  ots[slotID].toke
22940 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55  n_flags |= CKF_U
22950 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52  SER_PIN_FINAL_TR
22960 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75  Y;....}.....retu
22970 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e 43 4f 52  rn(CKR_PIN_INCOR
22980 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  RECT);...}....CA
22990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
229a0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6b 6e 6f  F("Error.  Unkno
229b0 77 6e 20 65 72 72 6f 72 20 72 65 74 75 72 6e 65  wn error returne
229c0 64 20 66 72 6f 6d 20 63 61 63 6b 65 79 5f 6c 6f  d from cackey_lo
229d0 67 69 6e 28 29 20 28 25 69 29 22 2c 20 6c 6f 67  gin() (%i)", log
229e0 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  in_ret);....retu
229f0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
22a00 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  RROR);..}...cack
22a10 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
22a20 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 26 3d 20  .token_flags &= 
22a30 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 4c  ~(CKF_USER_PIN_L
22a40 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55 53 45 52  OCKED | CKF_USER
22a50 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f 57 20 7c  _PIN_COUNT_LOW |
22a60 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
22a70 52 45 44 20 7c 20 43 4b 46 5f 55 53 45 52 5f 50  RED | CKF_USER_P
22a80 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29 3b 0a 0a  IN_FINAL_TRY);..
22a90 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
22aa0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
22ab0 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45 52 5f 46   = CKS_RO_USER_F
22ac0 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d 75 74 65  UNCTIONS;...mute
22ad0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
22ae0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
22af0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22b00 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
22b10 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
22b20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22b30 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
22b40 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
22b50 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
22b60 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
22b70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22b80 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
22b90 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
22ba0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
22bb0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
22bc0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
22bd0 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75 74 29 28  K_RV, C_Logout)(
22be0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22bf0 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43  E hSession) {..C
22c00 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
22c10 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
22c20 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
22c30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
22c40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
22c50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
22c60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22c70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22c80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22c90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22ca0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22cb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22cc0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
22cd0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
22ce0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
22cf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
22d00 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
22d10 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
22d20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22d30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
22d40 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
22d50 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
22d60 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
22d70 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
22d80 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
22d90 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
22da0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
22db0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
22dc0 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
22dd0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22de0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22df0 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
22e00 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22e10 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22e20 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
22e30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22e40 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
22e50 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
22e60 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
22e70 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
22e80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22e90 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
22ea0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
22eb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
22ec0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
22ed0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ALID);..}...slot
22ee0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
22ef0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22f00 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
22f10 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
22f20 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
22f30 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
22f40 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
22f50 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
22f60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22f70 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
22f80 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
22f90 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
22fa0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
22fb0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
22fc0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
22fd0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
22fe0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
22ff0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
23000 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23010 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23020 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
23030 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
23040 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
23050 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
23060 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
23070 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23080 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
23090 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
230a0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63 61  _ERROR);..}...ca
230b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
230c0 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 20 3d 20  ession].state = 
230d0 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43 5f 53 45  CKS_RO_PUBLIC_SE
230e0 53 53 49 4f 4e 3b 0a 09 63 61 63 6b 65 79 5f 73  SSION;..cackey_s
230f0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b  lots[slotID].tok
23100 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c  en_flags = CKF_L
23110 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 0a  OGIN_REQUIRED;..
23120 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
23130 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
23140 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
23150 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
23160 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
23170 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23180 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
23190 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
231a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
231b0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
231c0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
231d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
231e0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
231f0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
23200 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
23210 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
23220 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 72 65  ION(CK_RV, C_Cre
23230 61 74 65 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  ateObject)(CK_SE
23240 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
23250 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
23260 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
23270 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
23280 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
23290 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
232a0 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ct) {..CACKEY_DE
232b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
232c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
232d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
232e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
232f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23300 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
23310 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23320 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
23330 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
23340 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
23350 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
23360 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
23370 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
23380 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
23390 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
233a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
233b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
233c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
233d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
233e0 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f 62 6a 65  K_RV, C_CopyObje
233f0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
23400 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
23410 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
23420 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54   hObject, CK_ATT
23430 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
23440 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
23450 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
23460 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4e  T_HANDLE_PTR phN
23470 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  ewObject) {..CAC
23480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23490 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
234a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
234b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
234c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
234d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
234e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
234f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
23500 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
23510 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
23520 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23530 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
23540 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23550 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
23560 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23570 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
23580 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
23590 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
235a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
235b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
235c0 73 74 72 6f 79 4f 62 6a 65 63 74 29 28 43 4b 5f  stroyObject)(CK_
235d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
235e0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
235f0 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
23600 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
23610 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
23620 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
23630 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
23640 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23650 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23660 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23670 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23680 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23690 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
236a0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
236b0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
236c0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
236d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
236e0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
236f0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23700 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
23710 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23720 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
23730 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
23740 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a 65 63 74  _RV, C_GetObject
23750 53 69 7a 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Size)(CK_SESSION
23760 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
23770 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
23780 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 55  LE hObject, CK_U
23790 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 7a 65  LONG_PTR pulSize
237a0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
237b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
237c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
237d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
237e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
237f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23800 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
23810 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
23820 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
23830 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
23840 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23850 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
23860 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
23870 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
23880 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
23890 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
238a0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
238b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
238c0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
238d0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
238e0 52 56 2c 20 43 5f 47 65 74 41 74 74 72 69 62 75  RV, C_GetAttribu
238f0 74 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53  teValue)(CK_SESS
23900 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23910 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
23920 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
23930 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
23940 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
23950 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09  ONG ulCount) {..
23960 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75  CK_ATTRIBUTE *cu
23970 72 72 5f 61 74 74 72 3b 0a 09 73 74 72 75 63 74  rr_attr;..struct
23980 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
23990 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09 75 6e 73   *identity;..uns
239a0 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
239b0 69 74 79 5f 69 64 78 2c 20 61 74 74 72 5f 69 64  ity_idx, attr_id
239c0 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  x, sess_attr_idx
239d0 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69 6e 74 20  , num_ids;..int 
239e0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 43  mutex_retval;..C
239f0 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b  K_RV retval = CK
23a00 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50  R_OK;..CK_VOID_P
23a10 54 52 20 70 56 61 6c 75 65 3b 0a 09 43 4b 5f 55  TR pValue;..CK_U
23a20 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  LONG ulValueLen;
23a30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23a40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
23a50 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
23a60 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
23a70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
23a80 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
23a90 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
23aa0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
23ab0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
23ac0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
23ad0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
23ae0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
23af0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
23b00 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
23b10 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
23b20 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
23b30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23b40 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
23b50 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
23b60 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
23b70 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
23b80 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
23b90 0a 09 69 66 20 28 68 4f 62 6a 65 63 74 20 3d 3d  ..if (hObject ==
23ba0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
23bb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23bc0 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
23bd0 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
23be0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
23bf0 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
23c00 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
23c10 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 3d 3d 20  .if (ulCount == 
23c20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
23c30 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f  circuit, if zero
23c40 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70   objects were sp
23c50 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a  ecified return z
23c60 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69  ero items immedi
23c70 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41 43 4b 45  ately */...CACKE
23c80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23c90 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
23ca0 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
23cb0 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
23cc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
23cd0 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54 65  K);..}...if (pTe
23ce0 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20  mplate == NULL) 
23cf0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23d00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23d10 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 4e 55   pTemplate is NU
23d20 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
23d30 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
23d40 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  AD);..}...identi
23d50 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a 65 63 74  ty_idx = hObject
23d60 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   - 1;...mutex_re
23d70 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
23d80 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
23d90 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
23da0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
23db0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23dc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23dd0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
23de0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23df0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
23e00 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
23e10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23e20 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
23e30 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
23e40 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
23e50 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
23e60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23e70 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
23e80 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
23e90 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
23ea0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
23eb0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6e 75  NVALID);..}...nu
23ec0 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 73  m_ids = cackey_s
23ed0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23ee0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
23ef0 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69  nt;...if (identi
23f00 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d 5f 69 64  ty_idx >= num_id
23f10 73 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  s) {...cackey_mu
23f20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
23f30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
23f40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23f50 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
23f60 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
23f70 20 72 61 6e 67 65 2e 20 20 69 64 65 6e 74 69 74   range.  identit
23f80 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20 6e 75 6d  y_idx = %lu, num
23f90 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c 20 28 75  _ids = %lu.", (u
23fa0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
23fb0 65 6e 74 69 74 79 5f 69 64 78 2c 20 28 75 6e 73  entity_idx, (uns
23fc0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e 75 6d 5f  igned long) num_
23fd0 69 64 73 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ids);....return(
23fe0 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c  CKR_OBJECT_HANDL
23ff0 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
24000 09 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  .identity = &cac
24010 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24020 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
24030 73 5b 69 64 65 6e 74 69 74 79 5f 69 64 78 5d 3b  s[identity_idx];
24040 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
24050 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
24060 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74 72 5f 69   ulCount; attr_i
24070 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 61  dx++) {...curr_a
24080 74 74 72 20 3d 20 26 70 54 65 6d 70 6c 61 74 65  ttr = &pTemplate
24090 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 70  [attr_idx];....p
240a0 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09  Value = NULL;...
240b0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
240c0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 43 41  _LONG) -1;....CA
240d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
240e0 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  F("Looking for a
240f0 74 74 72 69 62 75 74 65 20 30 78 25 30 38 6c 78  ttribute 0x%08lx
24100 20 28 69 64 65 6e 74 69 74 79 3a 25 6c 75 29 20   (identity:%lu) 
24110 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
24120 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
24130 3e 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  >type, (unsigned
24140 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
24150 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20 28 73 65  idx);....for (se
24160 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  ss_attr_idx = 0;
24170 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c   sess_attr_idx <
24180 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
24190 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
241a0 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
241b0 09 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
241c0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
241d0 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79 70 65 20  _attr_idx].type 
241e0 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  == curr_attr->ty
241f0 70 65 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  pe) {.....CACKEY
24200 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
24210 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c 20 70 56  ... found it, pV
24220 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c 56 61 6c  alue = %p, ulVal
24230 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 69 64  ueLen = %lu", id
24240 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
24250 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
24260 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65 6e 74 69  ].pValue, identi
24270 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
24280 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
24290 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 0a  ValueLen);......
242a0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 69 64 65  ....pValue = ide
242b0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
242c0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
242d0 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09 75 6c 56  .pValue;.....ulV
242e0 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65 6e 74 69  alueLen = identi
242f0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
24300 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 75 6c  ess_attr_idx].ul
24310 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 09  ValueLen;....}..
24320 09 7d 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 61  .}....if (curr_a
24330 74 74 72 2d 3e 70 56 61 6c 75 65 20 26 26 20 70  ttr->pValue && p
24340 56 61 6c 75 65 29 20 7b 0a 09 09 09 69 66 20 28  Value) {....if (
24350 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c  curr_attr->ulVal
24360 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61 6c 75 65  ueLen >= ulValue
24370 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65 6d 63 70  Len) {.....memcp
24380 79 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61  y(curr_attr->pVa
24390 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20 75 6c 56  lue, pValue, ulV
243a0 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 7d 20 65  alueLen);....} e
243b0 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56 61 6c 75  lse {.....ulValu
243c0 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29  eLen = (CK_LONG)
243d0 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c   -1;......retval
243e0 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f   = CKR_BUFFER_TO
243f0 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 0a 09 09  O_SMALL;....}...
24400 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74 72 2d 3e  }....curr_attr->
24410 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75 6c 56  ulValueLen = ulV
24420 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a 09 6d 75  alueLen;..}...mu
24430 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24440 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24450 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24460 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
24470 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
24480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24490 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
244a0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
244b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
244c0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
244d0 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
244e0 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54   CKR_ATTRIBUTE_T
244f0 59 50 45 5f 49 4e 56 41 4c 49 44 29 20 7b 0a 09  YPE_INVALID) {..
24500 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24510 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24520 43 4b 52 5f 41 54 54 52 49 42 55 54 45 5f 54 59  CKR_ATTRIBUTE_TY
24530 50 45 5f 49 4e 56 41 4c 49 44 20 28 25 69 29 22  PE_INVALID (%i)"
24540 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
24550 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
24560 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45  val == CKR_BUFFE
24570 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09  R_TOO_SMALL) {..
24580 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24590 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
245a0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
245b0 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28 69 6e 74  MALL (%i)", (int
245c0 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c  ) retval);..} el
245d0 73 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  se if (retval ==
245e0 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43   CKR_OK) {...CAC
245f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24600 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
24610 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20  OK (%i)", (int) 
24620 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65  retval);..} else
24630 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24640 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
24650 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72  ing %i", (int) r
24660 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74  etval);..}...ret
24670 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
24680 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
24690 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 41  ON(CK_RV, C_SetA
246a0 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
246b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
246c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
246d0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
246e0 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
246f0 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
24700 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
24710 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
24720 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
24730 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
24740 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
24750 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
24760 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24770 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
24780 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
24790 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
247a0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
247b0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
247c0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
247d0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
247e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
247f0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
24800 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
24810 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
24820 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24830 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
24840 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
24850 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63  _RV, C_FindObjec
24860 74 73 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  tsInit)(CK_SESSI
24870 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
24880 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  on, CK_ATTRIBUTE
24890 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20  _PTR pTemplate, 
248a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74  CK_ULONG ulCount
248b0 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
248c0 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55 4c 4f 4e  slotID;..CK_ULON
248d0 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65  G idx;..int mute
248e0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
248f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24900 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24910 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24920 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24930 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24940 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24950 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24960 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24970 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24980 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
24990 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
249a0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
249b0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
249c0 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
249d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
249e0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
249f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24a00 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
24a10 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
24a20 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
24a30 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
24a40 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
24a50 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24a60 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
24a70 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24a80 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24a90 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24aa0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24ab0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
24ac0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
24ad0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
24ae0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
24af0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
24b00 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
24b10 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
24b20 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24b30 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
24b40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24b50 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
24b60 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
24b70 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
24b80 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
24b90 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
24ba0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
24bb0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24bc0 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
24bd0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
24be0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
24bf0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
24c00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24c10 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 61 6c  rror.  Search al
24c20 72 65 61 64 79 20 61 63 74 69 76 65 2e 22 29 3b  ready active.");
24c30 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
24c40 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
24c50 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  E);..}...slotID 
24c60 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
24c70 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
24c80 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
24c90 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
24ca0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
24cb0 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
24cc0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
24cd0 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
24ce0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24cf0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
24d00 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
24d10 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
24d20 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
24d30 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
24d40 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
24d50 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
24d60 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
24d70 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
24d80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24d90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
24da0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
24db0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
24dc0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
24dd0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
24de0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
24df0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24e00 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
24e10 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
24e20 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
24e30 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
24e40 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ID].slot_reset) 
24e50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24e60 5f 50 52 49 4e 54 46 28 22 54 68 65 20 73 6c 6f  _PRINTF("The slo
24e70 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 65 74  t has been reset
24e80 20 73 69 6e 63 65 20 77 65 20 6c 61 73 74 20 6c   since we last l
24e90 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65 6e 74 69  ooked for identi
24ea0 74 69 65 73 20 2d 2d 20 72 65 73 63 61 6e 6e 69  ties -- rescanni
24eb0 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28 63 61 63  ng");....if (cac
24ec0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24ed0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
24ee0 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  s != NULL) {....
24ef0 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
24f00 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
24f10 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24f20 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
24f30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24f40 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
24f50 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 63 61  s_count);.....ca
24f60 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24f70 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
24f80 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
24f90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24fa0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
24fb0 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  es_count = 0;...
24fc0 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
24fd0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
24fe0 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  bel != NULL) {..
24ff0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
25000 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
25010 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  l);....cackey_sl
25020 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65  ots[slotID].labe
25030 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09  l = NULL;...}...
25040 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
25050 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f  t_reset(&cackey_
25060 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 3b 0a  slots[slotID]);.
25070 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
25080 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
25090 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  t = 0;..}...if (
250a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
250b0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
250c0 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ties == NULL) {.
250d0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
250e0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e  s[hSession].iden
250f0 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f  tities = cackey_
25100 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65 73 28  read_identities(
25110 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  &cackey_slots[sl
25120 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65 79 5f 73  otID], &cackey_s
25130 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25140 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
25150 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 54  nt);..}...if (pT
25160 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55 4c 4c 29  emplate != NULL)
25170 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f 75 6e 74   {...if (ulCount
25180 20 21 3d 20 30 29 20 7b 0a 09 09 09 63 61 63 6b   != 0) {....cack
25190 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
251a0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
251b0 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c 43 6f 75  ry_count = ulCou
251c0 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  nt;....cackey_se
251d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
251e0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
251f0 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e 74 20 2a  malloc(ulCount *
25200 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
25210 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d 63 70 79  te));.....memcpy
25220 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
25230 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
25240 68 5f 71 75 65 72 79 2c 20 70 54 65 6d 70 6c 61  h_query, pTempla
25250 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a 20 73 69  te, ulCount * si
25260 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61 74 65 29  zeof(*pTemplate)
25270 29 3b 0a 09 09 09 66 6f 72 20 28 69 64 78 20 3d  );....for (idx =
25280 20 30 3b 20 69 64 78 20 3c 20 75 6c 43 6f 75 6e   0; idx < ulCoun
25290 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09  t; idx++) {.....
252a0 69 66 20 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  if (pTemplate[id
252b0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  x].ulValueLen ==
252c0 20 30 29 20 7b 0a 09 09 09 09 09 63 61 63 6b 65   0) {......cacke
252d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
252e0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
252f0 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20  y[idx].pValue = 
25300 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63 6f 6e 74  NULL;.......cont
25310 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  inue;.....}.....
25320 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25330 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
25340 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
25350 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 70 54 65  lue = malloc(pTe
25360 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61  mplate[idx].ulVa
25370 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 69 66  lueLen);......if
25380 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
25390 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
253a0 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
253b0 61 6c 75 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d  alue) {......mem
253c0 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
253d0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
253e0 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
253f0 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74  pValue, pTemplat
25400 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  e[idx].pValue, p
25410 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c  Template[idx].ul
25420 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09 09 7d  ValueLen);.....}
25430 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b  ....}...} else {
25440 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
25450 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
25460 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
25470 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f   = 0;....cackey_
25480 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25490 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
254a0 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 20 65  = NULL;...}..} e
254b0 6c 73 65 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  lse {...if (ulCo
254c0 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
254d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
254e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
254f0 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  k);.....CACKEY_D
25500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25510 6f 72 2e 20 20 53 65 61 72 63 68 20 71 75 65 72  or.  Search quer
25520 79 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  y specified as N
25530 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62 65 72 20  ULL, but number 
25540 6f 66 20 71 75 65 72 79 20 74 65 72 6d 73 20 6e  of query terms n
25550 6f 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ot specified as 
25560 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  0.");.....return
25570 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
25580 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  AD);...}....cack
25590 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
255a0 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
255b0 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09  ry_count = 0;...
255c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
255d0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
255e0 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
255f0 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
25600 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
25610 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 31 3b  arch_active = 1;
25620 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
25630 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
25640 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 30 3b 0a  ch_curr_id = 0;.
25650 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
25660 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
25670 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
25680 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
25690 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
256a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
256b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
256c0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
256d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
256e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
256f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
25700 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
25710 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
25720 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
25730 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
25740 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 63  ..static int cac
25750 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61  key_pkcs11_compa
25760 72 65 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b  re_attributes(CK
25770 5f 41 54 54 52 49 42 55 54 45 20 2a 61 2c 20 43  _ATTRIBUTE *a, C
25780 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 62 29 20  K_ATTRIBUTE *b) 
25790 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  {..unsigned char
257a0 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a 6c 61 72   *smallbuf, *lar
257b0 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f 74 20 73  gebuf;..size_t s
257c0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20 6c 61 72  mallbuf_len, lar
257d0 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09 69 66 20  gebuf_len;...if 
257e0 28 61 2d 3e 74 79 70 65 20 21 3d 20 62 2d 3e 74  (a->type != b->t
257f0 79 70 65 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  ype) {...return(
25800 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  0);..}...CACKEY_
25810 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20  DEBUG_PRINTF("  
25820 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d 61 74 63    ... found matc
25830 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e 22 29 3b  hing type ...");
25840 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25850 50 52 49 4e 54 42 55 46 28 22 20 20 20 20 2e 2e  PRINTBUF("    ..
25860 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22 2c 20 61  . our value:", a
25870 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e 75 6c 56  ->pValue, a->ulV
25880 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69 66 20 28  alueLen);...if (
25890 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c  b->pValue == NUL
258a0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
258b0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20  BUG_PRINTF("    
258c0 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 77 69 6c     ... found wil
258d0 64 63 61 72 64 20 6d 61 74 63 68 22 29 3b 0a 0a  dcard match");..
258e0 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
258f0 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c 75 65 20  ..if (a->pValue 
25900 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
25910 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20 09 69 66  urn(0);..}.. .if
25920 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20   (b->ulValueLen 
25930 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  == a->ulValueLen
25940 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d 3e 70 56   && memcmp(a->pV
25950 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c 75 65 2c  alue, b->pValue,
25960 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
25970 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
25980 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
25990 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
259a0 65 78 61 63 74 20 6d 61 74 63 68 22 29 3b 0a 0a  exact match");..
259b0 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 7d 0a  ..return(1);..}.
259c0 0a 09 73 77 69 74 63 68 20 28 61 2d 3e 74 79 70  ..switch (a->typ
259d0 65 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f  e) {...case CKA_
259e0 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69 66 20 28  MODULUS:....if (
259f0 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 3d  a->ulValueLen ==
25a00 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
25a10 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
25a20 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56  }.....if (a->ulV
25a30 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e 75 6c 56  alueLen > b->ulV
25a40 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 73  alueLen) {.....s
25a50 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e 70 56 61  mallbuf = b->pVa
25a60 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75  lue;.....smallbu
25a70 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56 61 6c  f_len = b->ulVal
25a80 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67  ueLen;......larg
25a90 65 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65  ebuf = a->pValue
25aa0 3b 0a 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c  ;.....largebuf_l
25ab0 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c  en = a->ulValueL
25ac0 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a  en;....} else {.
25ad0 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 61  ....smallbuf = a
25ae0 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d  ->pValue;.....sm
25af0 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e  allbuf_len = a->
25b00 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09  ulValueLen;.....
25b10 09 6c 61 72 67 65 62 75 66 20 3d 20 62 2d 3e 70  .largebuf = b->p
25b20 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65  Value;.....large
25b30 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c 56  buf_len = b->ulV
25b40 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 0a 0a 09  alueLen;....}...
25b50 09 09 66 6f 72 20 28 3b 20 6c 61 72 67 65 62 75  ..for (; largebu
25b60 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75  f_len != smallbu
25b70 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62 75 66 2b  f_len; largebuf+
25b80 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65 6e 2d 2d  +,largebuf_len--
25b90 29 20 7b 0a 09 09 09 09 69 66 20 28 6c 61 72 67  ) {.....if (larg
25ba0 65 62 75 66 5b 30 5d 20 21 3d 20 30 29 20 7b 0a  ebuf[0] != 0) {.
25bb0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
25bc0 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c  }....}.....if (l
25bd0 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73  argebuf_len != s
25be0 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20 7b 0a 09  mallbuf_len) {..
25bf0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a  ...break;....}..
25c00 09 09 09 69 66 20 28 6d 65 6d 63 6d 70 28 6c 61  ...if (memcmp(la
25c10 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66  rgebuf, smallbuf
25c20 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20  , smallbuf_len) 
25c30 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  == 0) {.....CACK
25c40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25c50 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  "       ... foun
25c60 64 20 61 70 70 72 6f 78 69 6d 61 74 65 20 6d 61  d approximate ma
25c70 74 63 68 22 29 3b 0a 0a 09 09 09 09 72 65 74 75  tch");......retu
25c80 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  rn(1);....}.....
25c90 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72 65 74 75  break;..}...retu
25ca0 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  rn(0);.}..CK_DEF
25cb0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
25cc0 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
25cd0 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  s)(CK_SESSION_HA
25ce0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
25cf0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
25d00 50 54 52 20 70 68 4f 62 6a 65 63 74 2c 20 43 4b  PTR phObject, CK
25d10 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f 62 6a 65  _ULONG ulMaxObje
25d20 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55 4c 4f 4e  ctCount, CK_ULON
25d30 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65 63 74 43  G_PTR pulObjectC
25d40 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75 63 74 20  ount) {..struct 
25d50 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
25d60 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b 5f 41 54  *curr_id;..CK_AT
25d70 54 52 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74  TRIBUTE *curr_at
25d80 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 63 75  tr;..CK_ULONG cu
25d90 72 72 5f 69 64 5f 69 64 78 2c 20 63 75 72 72 5f  rr_id_idx, curr_
25da0 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63 75 72 72  out_id_idx, curr
25db0 5f 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f  _attr_idx, sess_
25dc0 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b 5f 55 4c  attr_idx;..CK_UL
25dd0 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ONG matched_coun
25de0 74 2c 20 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  t, prev_matched_
25df0 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d 75 74 65  count;..int mute
25e00 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66 64 65 66  x_retval;.#ifdef
25e10 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
25e20 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
25e30 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 73  struct timeval s
25e40 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75 69 6e 74  tart, end;..uint
25e50 36 34 5f 74 20 73 74 61 72 74 5f 69 6e 74 2c 20  64_t start_int, 
25e60 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64 69 66 0a  end_int;.#endif.
25e70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25e80 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
25e90 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
25ea0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
25eb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25ec0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
25ed0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
25ee0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
25ef0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
25f00 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
25f10 69 66 20 28 70 75 6c 4f 62 6a 65 63 74 43 6f 75  if (pulObjectCou
25f20 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nt == NULL) {...
25f30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25f40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70 75 6c  NTF("Error.  pul
25f50 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69 73 20 4e  ObjectCount is N
25f60 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
25f70 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
25f80 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
25f90 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 20  hObject == NULL 
25fa0 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f  && ulMaxObjectCo
25fb0 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
25fc0 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
25fd0 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
25fe0 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
25ff0 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
26000 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
26010 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  ..*pulObjectCoun
26020 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43 4b 45 59  t = 0;....CACKEY
26030 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26040 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
26050 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
26060 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
26070 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
26080 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 68 4f 62  );..}...if (phOb
26090 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ject == NULL) {.
260a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
260b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 70  RINTF("Error.  p
260c0 68 4f 62 6a 65 63 74 20 69 73 20 4e 55 4c 4c 2e  hObject is NULL.
260d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
260e0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
260f0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 4d 61 78  ;..}...if (ulMax
26100 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30  ObjectCount == 0
26110 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26120 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26130 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  .  Maximum numbe
26140 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 73 70 65  r of objects spe
26150 63 69 66 69 65 64 20 61 73 20 7a 65 72 6f 2e 22  cified as zero."
26160 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26170 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
26180 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
26190 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
261a0 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
261b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
261c0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
261d0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
261e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
261f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26200 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
26210 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
26220 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
26230 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
26240 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
26250 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
26260 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
26270 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
26280 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
26290 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
262a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
262b0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
262c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
262d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
262e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
262f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26300 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
26310 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
26320 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
26330 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
26340 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26350 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
26360 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
26370 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
26380 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
26390 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
263a0 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
263b0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
263c0 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  ch_active) {...c
263d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
263e0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
263f0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
26400 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
26410 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74 20 61  r.  Search not a
26420 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
26430 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
26440 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
26450 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66  ZED);..}..#ifdef
26460 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
26470 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
26480 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 73 74  gettimeofday(&st
26490 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  art, NULL);.#end
264a0 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74 5f 69 64  if...curr_out_id
264b0 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28  _idx = 0;..for (
264c0 63 75 72 72 5f 69 64 5f 69 64 78 20 3d 20 63 61  curr_id_idx = ca
264d0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
264e0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63  ession].search_c
264f0 75 72 72 5f 69 64 3b 20 63 75 72 72 5f 69 64 5f  urr_id; curr_id_
26500 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
26510 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26520 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
26530 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63 74 43   && ulMaxObjectC
26540 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64 5f 69 64  ount; curr_id_id
26550 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72 5f 69 64  x++) {...curr_id
26560 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
26570 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
26580 65 6e 74 69 74 69 65 73 5b 63 75 72 72 5f 69 64  entities[curr_id
26590 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43 4b 45 59  _idx];....CACKEY
265a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
265b0 72 6f 63 65 73 73 69 6e 67 20 69 64 65 6e 74 69  rocessing identi
265c0 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e  ty:%lu", (unsign
265d0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 69 64  ed long) curr_id
265e0 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74 63 68 65  _idx);....matche
265f0 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  d_count = 0;....
26600 66 6f 72 20 28 63 75 72 72 5f 61 74 74 72 5f 69  for (curr_attr_i
26610 64 78 20 3d 20 30 3b 20 63 75 72 72 5f 61 74 74  dx = 0; curr_att
26620 72 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73  r_idx < cackey_s
26630 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26640 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  ].search_query_c
26650 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74 74 72 5f  ount; curr_attr_
26660 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70 72 65 76  idx++) {....prev
26670 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
26680 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a   matched_count;.
26690 0a 09 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20  ....curr_attr = 
266a0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
266b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
266c0 68 5f 71 75 65 72 79 5b 63 75 72 72 5f 61 74 74  h_query[curr_att
266d0 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43 41 43 4b  r_idx];.....CACK
266e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
266f0 22 20 20 43 68 65 63 6b 69 6e 67 20 66 6f 72 20  "  Checking for 
26700 61 74 74 72 69 62 75 74 65 20 25 73 20 28 30 78  attribute %s (0x
26710 25 30 38 6c 78 29 20 69 6e 20 69 64 65 6e 74 69  %08lx) in identi
26720 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41 43 4b 45  ty:%i...", CACKE
26730 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41 54 54  Y_DEBUG_FUNC_ATT
26740 52 49 42 55 54 45 5f 54 4f 5f 53 54 52 28 63 75  RIBUTE_TO_STR(cu
26750 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 29 2c 20  rr_attr->type), 
26760 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
26770 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c  curr_attr->type,
26780 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
26790 64 78 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44  dx);....CACKEY_D
267a0 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20  EBUG_PRINTBUF(" 
267b0 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b 69 6e 67     Value looking
267c0 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f 61 74 74   for:", curr_att
267d0 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75 72 72 5f  r->pValue, curr_
267e0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
267f0 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73 65 73 73  );.....for (sess
26800 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 73  _attr_idx = 0; s
26810 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  ess_attr_idx < c
26820 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74  urr_id->attribut
26830 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73 73 5f 61  es_count; sess_a
26840 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09  ttr_idx++) {....
26850 09 69 66 20 28 63 61 63 6b 65 79 5f 70 6b 63 73  .if (cackey_pkcs
26860 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69  11_compare_attri
26870 62 75 74 65 73 28 26 63 75 72 72 5f 69 64 2d 3e  butes(&curr_id->
26880 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
26890 61 74 74 72 5f 69 64 78 5d 2c 20 63 75 72 72 5f  attr_idx], curr_
268a0 61 74 74 72 29 29 20 7b 0a 09 09 09 09 09 6d 61  attr)) {......ma
268b0 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b 3b 0a 0a  tched_count++;..
268c0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
268d0 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 49 66  }....}...../* If
268e0 20 74 68 65 20 61 74 74 72 69 62 75 74 65 20 63   the attribute c
268f0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d 61 74 63  ould not be matc
26900 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74 72 79 20  hed, do not try 
26910 74 6f 20 6d 61 74 63 68 20 61 64 64 69 74 69 6f  to match additio
26920 6e 61 6c 20 61 74 74 72 69 62 75 74 65 73 20 2a  nal attributes *
26930 2f 0a 09 09 09 69 66 20 28 70 72 65 76 5f 6d 61  /....if (prev_ma
26940 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 6d  tched_count == m
26950 61 74 63 68 65 64 5f 63 6f 75 6e 74 29 20 7b 0a  atched_count) {.
26960 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a  ....break;....}.
26970 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61 74 63 68  ..}....if (match
26980 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63 61 63 6b  ed_count == 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 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43  ry_count) {....C
269c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
269d0 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c 20 25 69  TF("  ... All %i
269e0 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
269f0 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 61  ked for found, a
26a00 64 64 69 6e 67 20 69 64 65 6e 74 69 74 79 3a 25  dding identity:%
26a10 69 20 74 6f 20 72 65 74 75 72 6e 65 64 20 6c 69  i to returned li
26a20 73 74 22 2c 20 28 69 6e 74 29 20 63 61 63 6b 65  st", (int) cacke
26a30 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26a40 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
26a50 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63  y_count, (int) c
26a60 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09  urr_id_idx);....
26a70 09 70 68 4f 62 6a 65 63 74 5b 63 75 72 72 5f 6f  .phObject[curr_o
26a80 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20 63 75 72  ut_id_idx] = cur
26a90 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b 0a 0a 09  r_id_idx + 1;...
26aa0 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75  ..ulMaxObjectCou
26ab0 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72 72 5f 6f  nt--;.....curr_o
26ac0 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 7d  ut_id_idx++;...}
26ad0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
26ae0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26af0 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c 20 25 69    ... Not all %i
26b00 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20 25 69 29   (only found %i)
26b10 20 61 74 74 72 69 62 75 74 65 73 20 63 68 65 63   attributes chec
26b20 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64 2c 20 6e  ked for found, n
26b30 6f 74 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69  ot adding identi
26b40 74 79 3a 25 69 22 2c 20 28 69 6e 74 29 20 63 61  ty:%i", (int) ca
26b50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26b60 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
26b70 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
26b80 29 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2c  ) matched_count,
26b90 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69   (int) curr_id_i
26ba0 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09 63 61 63  dx);...}..}..cac
26bb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
26bc0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75  ssion].search_cu
26bd0 72 72 5f 69 64 20 3d 20 63 75 72 72 5f 69 64 5f  rr_id = curr_id_
26be0 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a 65 63 74  idx;..*pulObject
26bf0 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f 6f 75 74  Count = curr_out
26c00 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66 64 65 66  _id_idx;..#ifdef
26c10 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
26c20 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 09  ARCH_SPEEDTEST..
26c30 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26 65 6e  gettimeofday(&en
26c40 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74 61 72 74  d, NULL);..start
26c50 5f 69 6e 74 20 3d 20 28 73 74 61 72 74 2e 74 76  _int = (start.tv
26c60 5f 73 65 63 20 2a 20 31 30 30 30 30 30 30 29 20  _sec * 1000000) 
26c70 2b 20 73 74 61 72 74 2e 74 76 5f 75 73 65 63 3b  + start.tv_usec;
26c80 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28 65 6e 64  ..end_int = (end
26c90 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30  .tv_sec * 100000
26ca0 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75 73 65 63  0) + end.tv_usec
26cb0 3b 0a 09 66 70 72 69 6e 74 66 28 73 74 64 65 72  ;..fprintf(stder
26cc0 72 2c 20 22 53 65 61 72 63 68 20 74 6f 6f 6b 20  r, "Search took 
26cd0 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  %lu microseconds
26ce0 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  \n", (unsigned l
26cf0 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74 20 2d 20  ong) (end_int - 
26d00 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a 23 65 6e  start_int));.#en
26d10 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  dif...mutex_retv
26d20 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
26d30 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
26d40 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
26d50 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
26d60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26d70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26d80 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
26d90 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
26da0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
26db0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
26dc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26dd0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
26de0 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62 6a 65 63   (%i), num objec
26df0 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b 52 5f 4f  ts = %lu", CKR_O
26e00 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74 43 6f 75  K, *pulObjectCou
26e10 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  nt);...return(CK
26e20 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
26e30 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
26e40 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74  RV, C_FindObject
26e50 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  sFinal)(CK_SESSI
26e60 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
26e70 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  on) {..CK_ULONG 
26e80 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
26e90 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
26ea0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
26eb0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
26ec0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
26ed0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
26ee0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26ef0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
26f00 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
26f10 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
26f20 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
26f30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
26f40 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
26f50 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
26f60 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
26f70 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
26f80 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
26f90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26fa0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26fb0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
26fc0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
26fd0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
26fe0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
26ff0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
27000 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
27010 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
27020 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
27030 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
27040 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
27050 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27060 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
27070 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27080 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
27090 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
270a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
270b0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
270c0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
270d0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
270e0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
270f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27100 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27110 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
27120 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
27130 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
27140 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
27150 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
27160 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
27170 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a 09  arch_active) {..
27180 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
27190 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
271a0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
271b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
271c0 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f 74  ror.  Search not
271d0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
271e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
271f0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
27200 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 63 61 63  LIZED);..}...cac
27210 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27220 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
27230 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66 6f 72 20  tive = 0;...for 
27240 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
27250 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27260 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
27270 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 69 64  _query_count; id
27280 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
27290 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
272a0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
272b0 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29  ery[idx].pValue)
272c0 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
272d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
272e0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
272f0 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 3b 0a  y[idx].pValue);.
27300 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  ..}..}...if (cac
27310 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
27320 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
27330 65 72 79 29 20 7b 0a 09 09 66 72 65 65 28 63 61  ery) {...free(ca
27340 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27350 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
27360 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  uery);..}...mute
27370 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
27380 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27390 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
273a0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
273b0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
273c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
273d0 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
273e0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
273f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
27400 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
27410 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27420 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
27430 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
27440 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
27450 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
27460 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
27470 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 49  K_RV, C_EncryptI
27480 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
27490 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
274a0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
274b0 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
274c0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
274d0 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
274e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
274f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
27500 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
27510 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
27520 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27530 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
27540 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
27550 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
27560 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
27570 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
27580 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
27590 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
275a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
275b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
275c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
275d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
275e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
275f0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
27600 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
27610 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74  CK_RV, C_Encrypt
27620 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27630 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27640 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
27650 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
27660 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
27670 20 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c   pEncryptedData,
27680 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
27690 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
276a0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
276b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
276c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
276d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
276e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
276f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27700 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
27710 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27720 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
27730 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
27740 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
27750 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
27760 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
27770 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
27780 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
27790 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
277a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
277b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
277c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
277d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
277e0 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70 74 55 70  _RV, C_EncryptUp
277f0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
27800 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
27810 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
27820 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
27830 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
27840 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50  _PTR pEncryptedP
27850 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
27860 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61  R pulEncryptedPa
27870 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  rtLen) {..CACKEY
27880 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
27890 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
278a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
278b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
278c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
278d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
278e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
278f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
27900 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
27910 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
27920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27930 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
27940 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
27950 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
27960 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27970 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
27980 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27990 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
279a0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
279b0 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
279c0 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  ptFinal)(CK_SESS
279d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
279e0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
279f0 20 70 4c 61 73 74 45 6e 63 72 79 70 74 65 64 50   pLastEncryptedP
27a00 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
27a10 52 20 70 75 6c 4c 61 73 74 45 6e 63 72 79 70 74  R pulLastEncrypt
27a20 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
27a30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27a40 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
27a50 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
27a60 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
27a70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27a80 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
27a90 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
27aa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27ab0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27ac0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
27ad0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27ae0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
27af0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27b00 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
27b10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27b20 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
27b30 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
27b40 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
27b50 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
27b60 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
27b70 65 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ecryptInit)(CK_S
27b80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
27b90 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
27ba0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
27bb0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
27bc0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69  ANDLE hKey) {..i
27bd0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
27be0 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43  ...hKey--;...CAC
27bf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27c00 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27c10 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
27c20 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
27c30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27c40 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27c50 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27c60 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27c70 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27c80 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
27c90 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c  Mechanism == NUL
27ca0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
27cb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
27cc0 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73  r. pMechanism is
27cd0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
27ce0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
27cf0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
27d00 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63  (pMechanism->mec
27d10 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53  hanism != CKM_RS
27d20 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
27d30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27d40 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
27d50 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
27d60 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
27d70 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a  KM_RSA_PKCS");..
27d80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43  ..return(CKR_MEC
27d90 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56  HANISM_PARAM_INV
27da0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
27db0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
27dc0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
27dd0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
27de0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
27df0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
27e00 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
27e10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27e20 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
27e30 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
27e40 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
27e50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
27e60 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
27e70 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
27e80 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
27e90 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
27ea0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
27eb0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
27ec0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27ed0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
27ee0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
27ef0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
27f00 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
27f10 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
27f20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
27f30 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
27f40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
27f50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
27f60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27f70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
27f80 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
27f90 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
27fa0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
27fb0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
27fc0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
27fd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27fe0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
27ff0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
28000 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28010 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
28020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28030 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
28040 74 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f  t already in pro
28050 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72  gress.");......r
28060 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
28070 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
28080 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61  ..if (hKey >= ca
28090 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
280a0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
280b0 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61  es_count) {...ca
280c0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
280d0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
280e0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
280f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28100 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75  .  Key handle ou
28110 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75  t of range (requ
28120 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f  ested key %lu, o
28130 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69  nly %lu identiti
28140 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c  es available).",
28150 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
28160 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64   hKey, (unsigned
28170 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65   long) cackey_se
28180 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28190 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
281a0 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
281b0 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56  R_KEY_HANDLE_INV
281c0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
281d0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
281e0 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
281f0 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b  tive = 1;...cack
28200 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28210 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
28220 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68 61  chanism = pMecha
28230 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 3b  nism->mechanism;
28240 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
28250 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
28260 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 20 3d 20  ypt_mech_parm = 
28270 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70 50 61 72  pMechanism->pPar
28280 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b 65 79 5f  ameter;..cackey_
28290 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
282a0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
282b0 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65 63 68 61  parmlen = pMecha
282c0 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d 65 74 65  nism->ulParamete
282d0 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79 5f 73 65  rLen;..cackey_se
282e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
282f0 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74  .decrypt_identit
28300 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73  y = &cackey_sess
28310 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
28320 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b  dentities[hKey];
28330 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
28340 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
28350 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
28360 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
28370 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
28380 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28390 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
283a0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
283b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
283c0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
283d0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
283e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
283f0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
28400 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
28410 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
28420 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
28430 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
28440 65 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ecrypt)(CK_SESSI
28450 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
28460 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
28470 70 45 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20  pEncryptedData, 
28480 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
28490 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  ptedDataLen, CK_
284a0 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
284b0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
284c0 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 4b 5f 55  DataLen) {..CK_U
284d0 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f 75 70 64  LONG datalen_upd
284e0 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f 66 69 6e  ate, datalen_fin
284f0 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65 63 72 79  al;..CK_RV decry
28500 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  pt_ret;..int mut
28510 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
28520 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28530 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
28540 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
28550 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
28560 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28570 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
28580 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
28590 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
285a0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
285b0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
285c0 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20 4e 55 4c  ulDataLen == NUL
285d0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
285e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
285f0 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e 20 69 73  r. pulDataLen is
28600 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
28610 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
28620 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 64 61 74  S_BAD);..}...dat
28630 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d 20 2a 70  alen_update = *p
28640 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09 64 65 63  ulDataLen;...dec
28650 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63  rypt_ret = C_Dec
28660 72 79 70 74 55 70 64 61 74 65 28 68 53 65 73 73  ryptUpdate(hSess
28670 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74 65 64 44  ion, pEncryptedD
28680 61 74 61 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  ata, ulEncrypted
28690 44 61 74 61 4c 65 6e 2c 20 70 44 61 74 61 2c 20  DataLen, pData, 
286a0 26 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 29  &datalen_update)
286b0 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f 72  ;..if (decrypt_r
286c0 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  et != CKR_OK) {.
286d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
286e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
286f0 65 63 72 79 70 74 55 70 64 61 74 65 28 29 20 72  ecryptUpdate() r
28700 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
28710 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
28720 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
28730 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 69  crypt_ret);....i
28740 66 20 28 64 65 63 72 79 70 74 5f 72 65 74 20 21  f (decrypt_ret !
28750 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
28760 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 2f 2a 20  _SMALL) {..../* 
28770 54 65 72 6d 69 6e 61 74 65 20 64 65 63 72 79 70  Terminate decryp
28780 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a  tion operation *
28790 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  /.....mutex_retv
287a0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
287b0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
287c0 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
287d0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
287e0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
287f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28800 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
28810 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
28820 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28830 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
28840 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
28850 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28860 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
28870 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
28880 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
28890 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
288a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
288b0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
288c0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
288d0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
288e0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
288f0 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  ALID);....}.....
28900 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
28910 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
28920 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b  ecrypt_active) {
28930 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
28940 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28950 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
28960 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28970 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
28980 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
28990 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
289a0 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
289b0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
289c0 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
289d0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
289e0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
289f0 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65  ve = 0;.....mute
28a00 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
28a10 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28a20 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28a30 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ...if (mutex_ret
28a40 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09  val != 0) {.....
28a50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28a60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
28a70 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
28a80 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28a90 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
28aa0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
28ab0 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65 74  turn(decrypt_ret
28ac0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 44 61 74  );..}...if (pDat
28ad0 61 29 20 7b 0a 09 09 70 44 61 74 61 20 2b 3d 20  a) {...pData += 
28ae0 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 3b 0a  datalen_update;.
28af0 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66 69 6e 61  .}..datalen_fina
28b00 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 20  l = *pulDataLen 
28b10 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65  - datalen_update
28b20 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
28b30 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  = C_DecryptFinal
28b40 28 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61  (hSession, pData
28b50 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c  , &datalen_final
28b60 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70 74 5f  );..if (decrypt_
28b70 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  ret != CKR_OK) {
28b80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28b90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28ba0 44 65 63 72 79 70 74 46 69 6e 61 6c 28 29 20 72  DecryptFinal() r
28bb0 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
28bc0 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
28bd0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 64 65  nsigned long) de
28be0 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a 09 09 72  crypt_ret);....r
28bf0 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f 72 65  eturn(decrypt_re
28c00 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 44 61 74  t);..}...*pulDat
28c10 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65 6e 5f 75  aLen = datalen_u
28c20 70 64 61 74 65 20 2b 20 64 61 74 61 6c 65 6e 5f  pdate + datalen_
28c30 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  final;...CACKEY_
28c40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
28c50 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
28c60 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
28c70 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
28c80 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
28c90 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
28ca0 44 65 63 72 79 70 74 55 70 64 61 74 65 29 28 43  DecryptUpdate)(C
28cb0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
28cc0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
28cd0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
28ce0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
28cf0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
28d00 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
28d10 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
28d20 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
28d30 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54  {..static CK_BYT
28d40 45 20 62 75 66 5b 31 36 33 38 34 5d 3b 0a 09 73  E buf[16384];..s
28d50 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 3b 0a 09  size_t buflen;..
28d60 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
28d70 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  D;..CK_RV retval
28d80 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
28d90 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75 74 65 78  RROR;..int mutex
28da0 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45  _retval;...CACKE
28db0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28dc0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
28dd0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
28de0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
28df0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28e00 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
28e10 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
28e20 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
28e30 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
28e40 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
28e50 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
28e60 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
28e70 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
28e80 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
28e90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
28ea0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28eb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28ec0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
28ed0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
28ee0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
28ef0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
28f00 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45  ID);..}...if (pE
28f10 6e 63 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20  ncryptedPart == 
28f20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63 72 79 70  NULL && ulEncryp
28f30 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29  tedPartLen == 0)
28f40 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
28f50 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
28f60 61 73 6b 65 64 20 74 6f 20 64 65 63 72 79 70 74  asked to decrypt
28f70 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09   nothing... */..
28f80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28f90 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
28fa0 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
28fb0 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
28fc0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
28fd0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
28fe0 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61 72  f (pEncryptedPar
28ff0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
29000 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29010 54 46 28 22 45 72 72 6f 72 2e 20 70 45 6e 63 72  TF("Error. pEncr
29020 79 70 74 65 64 50 61 72 74 20 69 73 20 4e 55 4c  yptedPart is NUL
29030 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72 79 70 74  L, but ulEncrypt
29040 65 64 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74  edPartLen is not
29050 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e   0.");....return
29060 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
29070 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
29080 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
29090 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
290a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
290b0 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72 79 70 74  Error. ulEncrypt
290c0 65 64 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  edPartLen is 0, 
290d0 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
290e0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
290f0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
29100 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
29110 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 4e  (pulPartLen == N
29120 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
29130 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29140 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c 65 6e 20  ror. pulPartLen 
29150 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
29160 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
29170 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d  NTS_BAD);..}...m
29180 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
29190 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
291a0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
291b0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
291c0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
291d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
291e0 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
291f0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
29200 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
29210 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
29220 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
29230 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
29240 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
29250 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29260 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29270 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29280 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29290 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
292a0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
292b0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
292c0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
292d0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
292e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
292f0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
29300 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
29310 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
29320 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
29330 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29340 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
29350 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e  rypt not active.
29360 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
29370 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f  CKR_OPERATION_NO
29380 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29390 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
293a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
293b0 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
293c0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
293d0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
293e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
293f0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
29400 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
29410 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29420 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29430 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
29440 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
29450 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
29460 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
29470 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
29480 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
29490 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
294a0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
294b0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
294c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
294d0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
294e0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
294f0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
29500 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
29510 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
29520 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29530 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29540 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
29550 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
29560 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 63  ;..}...switch (c
29570 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
29580 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
29590 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
295a0 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
295b0 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61 72  S:..../* Ask car
295c0 64 20 74 6f 20 64 65 63 72 79 70 74 20 2a 2f 0a  d to decrypt */.
295d0 09 09 09 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b  ...buflen = cack
295e0 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26  ey_signdecrypt(&
295f0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
29600 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
29610 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29620 64 65 63 72 79 70 74 5f 69 64 65 6e 74 69 74 79  decrypt_identity
29630 2c 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  , pEncryptedPart
29640 2c 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  , ulEncryptedPar
29650 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69 7a 65 6f  tLen, buf, sizeo
29660 66 28 62 75 66 29 2c 20 30 2c 20 31 29 3b 0a 0a  f(buf), 0, 1);..
29670 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20 3c 20  ...if (buflen < 
29680 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72  0) {...../* Decr
29690 79 70 74 69 6f 6e 20 66 61 69 6c 65 64 2e 20 2a  yption failed. *
296a0 2f 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e  /.....if (buflen
296b0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
296c0 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09  E_NEEDLOGIN) {..
296d0 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52  ....retval = CKR
296e0 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44  _USER_NOT_LOGGED
296f0 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  _IN;.....} else 
29700 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41  if (buflen == CA
29710 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
29720 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09  NABSENT) {......
29730 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56  retval = CKR_DEV
29740 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09  ICE_REMOVED;....
29750 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72  .} else {......r
29760 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45  etval = CKR_GENE
29770 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d  RAL_ERROR;.....}
29780 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28  ....} else if ((
29790 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
297a0 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 50 61  buflen) > *pulPa
297b0 72 74 4c 65 6e 20 26 26 20 70 50 61 72 74 29 20  rtLen && pPart) 
297c0 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72 79 70 74  {...../* Decrypt
297d0 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61 72 67  ed data too larg
297e0 65 20 2a 2f 0a 09 09 09 09 72 65 74 76 61 6c 20  e */.....retval 
297f0 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
29800 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20 65 6c 73  _SMALL;....} els
29810 65 20 7b 0a 09 09 09 09 69 66 20 28 70 50 61 72  e {.....if (pPar
29820 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79  t) {......memcpy
29830 28 70 50 61 72 74 2c 20 62 75 66 2c 20 62 75 66  (pPart, buf, buf
29840 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  len);.....}.....
29850 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20 3d 20 62  .*pulPartLen = b
29860 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76  uflen;......retv
29870 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09  al = CKR_OK;....
29880 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
29890 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
298a0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
298b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
298c0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
298d0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
298e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
298f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
29900 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
29910 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
29920 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
29930 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
29940 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29950 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
29960 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
29970 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
29980 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
29990 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79  N(CK_RV, C_Decry
299a0 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  ptFinal)(CK_SESS
299b0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
299c0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
299d0 20 70 4c 61 73 74 50 61 72 74 2c 20 43 4b 5f 55   pLastPart, CK_U
299e0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
299f0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20  PartLen) {..int 
29a00 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
29a10 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  nt terminate_dec
29a20 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43 41 43 4b  rypt = 1;...CACK
29a30 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29a40 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
29a50 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
29a60 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
29a70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29a80 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
29a90 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
29aa0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
29ab0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
29ac0 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
29ad0 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
29ae0 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
29af0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
29b00 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
29b10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
29b20 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
29b30 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29b40 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
29b50 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
29b60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
29b70 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
29b80 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  LID);..}...if (p
29b90 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 3d  ulLastPartLen ==
29ba0 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
29bb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29bc0 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73 74 50 61  Error. pulLastPa
29bd0 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  rtLen is NULL.")
29be0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29bf0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
29c00 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
29c10 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
29c20 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
29c30 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
29c40 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
29c50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29c60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29c70 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
29c80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29c90 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
29ca0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
29cb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29cc0 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
29cd0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
29ce0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29cf0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
29d00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29d10 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
29d20 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
29d30 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
29d40 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
29d50 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
29d60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29d70 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
29d80 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  t_active) {...ca
29d90 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
29da0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
29db0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
29dc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29dd0 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
29de0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
29df0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
29e00 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
29e10 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c 4c  ZED);..}...*pulL
29e20 61 73 74 50 61 72 74 4c 65 6e 20 3d 20 30 3b 0a  astPartLen = 0;.
29e30 0a 09 69 66 20 28 70 4c 61 73 74 50 61 72 74 20  ..if (pLastPart 
29e40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 74 65 72  == NULL) {...ter
29e50 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d  minate_decrypt =
29e60 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72   0;..}...if (ter
29e70 6d 69 6e 61 74 65 5f 64 65 63 72 79 70 74 29 20  minate_decrypt) 
29e80 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  {...cackey_sessi
29e90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65  ons[hSession].de
29ea0 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30  crypt_active = 0
29eb0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
29ec0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
29ed0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
29ee0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
29ef0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
29f00 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
29f10 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29f20 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
29f30 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
29f40 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
29f50 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
29f60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29f70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
29f80 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
29f90 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
29fa0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
29fb0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
29fc0 20 43 5f 44 69 67 65 73 74 49 6e 69 74 29 28 43   C_DigestInit)(C
29fd0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
29fe0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
29ff0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2a000 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41 43 4b 45  hanism) {..CACKE
2a010 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a020 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2a030 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2a040 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2a050 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a060 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2a070 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2a080 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2a090 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2a0a0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2a0b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2a0c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2a0d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2a0e0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2a0f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a100 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2a110 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a120 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2a130 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2a140 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
2a150 73 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  st)(CK_SESSION_H
2a160 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2a170 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2a180 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
2a190 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
2a1a0 54 52 20 70 44 69 67 65 73 74 2c 20 43 4b 5f 55  TR pDigest, CK_U
2a1b0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44 69 67 65  LONG_PTR pulDige
2a1c0 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  stLen) {..CACKEY
2a1d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a1e0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a1f0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a200 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a210 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a220 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a230 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a240 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a250 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a260 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2a270 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2a280 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2a290 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a2a0 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2a2b0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a2c0 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2a2d0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a2e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2a2f0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2a300 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
2a310 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
2a320 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2a330 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2a340 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2a350 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43   ulPartLen) {..C
2a360 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a370 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2a380 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2a390 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2a3a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a3b0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2a3c0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2a3d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2a3e0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2a3f0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2a400 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a410 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2a420 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a430 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2a440 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a450 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2a460 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2a470 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2a480 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2a490 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2a4a0 44 69 67 65 73 74 4b 65 79 29 28 43 4b 5f 53 45  DigestKey)(CK_SE
2a4b0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2a4c0 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
2a4d0 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
2a4e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a4f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2a500 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2a510 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2a520 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a530 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2a540 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2a550 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2a560 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2a570 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2a580 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a590 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a5a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a5b0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2a5c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a5d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2a5e0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2a5f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a600 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2a610 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2a620 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 29 28 43  C_DigestFinal)(C
2a630 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2a640 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2a650 54 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20  TE_PTR pDigest, 
2a660 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2a670 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41  DigestLen) {..CA
2a680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a690 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2a6a0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2a6b0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2a6c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a6d0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2a6e0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2a6f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2a700 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2a710 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2a720 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a730 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2a740 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a750 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2a760 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a770 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2a780 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2a790 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2a7a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2a7b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
2a7c0 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  ignInit)(CK_SESS
2a7d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2a7e0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2a7f0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2a800 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2a810 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69 6e 74 20  LE hKey) {..int 
2a820 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2a830 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59  hKey--;...CACKEY
2a840 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a850 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a860 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a870 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2a880 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a890 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2a8a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2a8b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2a8c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2a8d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63  );..}...if (pMec
2a8e0 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20  hanism == NULL) 
2a8f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a900 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a910 70 4d 65 63 68 61 6e 69 73 6d 20 69 73 20 4e 55  pMechanism is NU
2a920 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2a930 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2a940 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 4d  AD);..}...if (pM
2a950 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
2a960 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53 41 5f 50  ism != CKM_RSA_P
2a970 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  KCS) {...CACKEY_
2a980 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a990 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 2d  ror. pMechanism-
2a9a0 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f 74 20 73  >mechanism not s
2a9b0 70 65 63 69 66 69 65 64 20 61 73 20 43 4b 4d 5f  pecified as CKM_
2a9c0 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a 09 09 72  RSA_PKCS");....r
2a9d0 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43 48 41 4e  eturn(CKR_MECHAN
2a9e0 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56 41 4c 49  ISM_PARAM_INVALI
2a9f0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
2aa00 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
2aa10 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
2aa20 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2aa30 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
2aa40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
2aa50 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2aa60 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2aa70 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
2aa80 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
2aa90 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
2aaa0 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
2aab0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
2aac0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2aad0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2aae0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2aaf0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2ab00 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2ab10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ab20 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2ab30 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2ab40 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2ab50 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
2ab60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ab70 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2ab80 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2ab90 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2aba0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2abb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2abc0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2abd0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2abe0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2abf0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2ac00 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2ac10 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
2ac20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2ac30 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
2ac40 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2ac50 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2ac60 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2ac70 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ac80 72 2e 20 20 53 69 67 6e 20 61 6c 72 65 61 64 79  r.  Sign already
2ac90 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
2aca0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2acb0 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
2acc0 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
2acd0 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
2ace0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
2acf0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
2ad00 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2ad10 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2ad20 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2ad30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ad40 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
2ad50 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
2ad60 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
2ad70 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
2ad80 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
2ad90 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
2ada0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
2adb0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
2adc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2add0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2ade0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
2adf0 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
2ae00 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2ae10 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2ae20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2ae30 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09  n_active = 1;...
2ae40 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ae50 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d  hSession].sign_m
2ae60 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65 63 68  echanism = pMech
2ae70 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
2ae80 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
2ae90 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2aea0 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31 32 38 3b  gn_buflen = 128;
2aeb0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2aec0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2aed0 5f 62 75 66 75 73 65 64 20 3d 20 30 3b 0a 09 63  _bufused = 0;..c
2aee0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2aef0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2af00 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  f = malloc(sizeo
2af10 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f(*cackey_sessio
2af20 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2af30 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65 79 5f  n_buf) * cackey_
2af40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2af50 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 3b  n].sign_buflen);
2af60 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2af70 50 52 49 4e 54 46 28 22 53 65 73 73 69 6f 6e 20  PRINTF("Session 
2af80 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e 74 69 74  %lu sign_identit
2af90 79 20 69 73 20 25 70 20 28 69 64 65 6e 74 69 74  y is %p (identit
2afa0 79 20 23 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  y #%lu)", (unsig
2afb0 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69  ned long) hSessi
2afc0 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20 26 63 61  on, (void *) &ca
2afd0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2afe0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2aff0 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e 73 69 67  es[hKey], (unsig
2b000 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 29 3b  ned long) hKey);
2b010 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b020 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b030 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63  _identity = &cac
2b040 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2b050 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
2b060 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78  s[hKey];...mutex
2b070 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2b080 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b090 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2b0a0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2b0b0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2b0c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b0d0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2b0e0 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2b0f0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2b100 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2b110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b120 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2b130 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2b140 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2b150 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2b160 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2b170 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28 43 4b 5f  _RV, C_Sign)(CK_
2b180 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2b190 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2b1a0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
2b1b0 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
2b1c0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2b1d0 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2b1e0 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
2b1f0 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65  eLen) {..unsigne
2b200 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f 73 69 67  d long start_sig
2b210 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43 4b 5f 52  n_bufused;..CK_R
2b220 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09 69 6e 74  V sign_ret;..int
2b230 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2b240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b250 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2b260 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2b270 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2b280 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b290 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2b2a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2b2b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2b2c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2b2d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2b2e0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2b2f0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2b300 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2b310 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2b320 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2b330 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2b340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b350 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2b360 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2b370 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2b380 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2b390 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2b3a0 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
2b3b0 65 64 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ed = cackey_sess
2b3c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b3d0 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 73  ign_bufused;...s
2b3e0 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e  ign_ret = C_Sign
2b3f0 55 70 64 61 74 65 28 68 53 65 73 73 69 6f 6e 2c  Update(hSession,
2b400 20 70 44 61 74 61 2c 20 75 6c 44 61 74 61 4c 65   pData, ulDataLe
2b410 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e 5f 72 65  n);..if (sign_re
2b420 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  t != CKR_OK) {..
2b430 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b440 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
2b450 67 6e 55 70 64 61 74 65 28 29 20 72 65 74 75 72  gnUpdate() retur
2b460 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76 20  ned failure (rv 
2b470 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67  = %lu).", (unsig
2b480 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
2b490 65 74 29 3b 0a 0a 09 09 69 66 20 28 73 69 67 6e  et);....if (sign
2b4a0 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46  _ret != CKR_BUFF
2b4b0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
2b4c0 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2b4d0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2b4e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2b4f0 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
2b500 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2b510 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2b520 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b530 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
2b540 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
2b550 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2b560 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66  OR);....}.....if
2b570 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2b580 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2b590 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
2b5a0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2b5b0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2b5c0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
2b5d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2b5e0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2b5f0 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
2b600 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2b610 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2b620 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  D);....}.....if 
2b630 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2b640 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b650 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63  _active) {.....c
2b660 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2b670 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2b680 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  k);......CACKEY_
2b690 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b6a0 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61  ror.  Sign not a
2b6b0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
2b6c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2b6d0 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2b6e0 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  LIZED);....}....
2b6f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2b700 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2b710 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
2b720 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2b730 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2b740 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2b750 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
2b760 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2b770 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2b780 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b790 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
2b7a0 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  d.");......retur
2b7b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2b7c0 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a  ROR);....}...}..
2b7d0 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72 65  ..return(sign_re
2b7e0 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e 5f 72 65  t);..}...sign_re
2b7f0 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 28  t = C_SignFinal(
2b800 68 53 65 73 73 69 6f 6e 2c 20 70 53 69 67 6e 61  hSession, pSigna
2b810 74 75 72 65 2c 20 70 75 6c 53 69 67 6e 61 74 75  ture, pulSignatu
2b820 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67  reLen);..if (sig
2b830 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  n_ret != CKR_OK)
2b840 20 7b 0a 09 09 69 66 20 28 73 69 67 6e 5f 72 65   {...if (sign_re
2b850 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  t == CKR_BUFFER_
2b860 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09  TOO_SMALL) {....
2b870 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b880 4e 54 46 28 22 53 69 67 6e 46 69 6e 61 6c 28 29  NTF("SignFinal()
2b890 20 72 65 74 75 72 6e 65 64 20 43 4b 52 5f 42 55   returned CKR_BU
2b8a0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28  FFER_TOO_SMALL (
2b8b0 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e 64 6f 69  rv = %lu), undoi
2b8c0 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28  ng C_SignUpdate(
2b8d0 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2b8e0 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a  ng) sign_ret);..
2b8f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2b900 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2b910 6e 5f 62 75 66 75 73 65 64 20 3d 20 73 74 61 72  n_bufused = star
2b920 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  t_sign_bufused;.
2b930 0a 09 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f  ....return(sign_
2b940 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  ret);...}....CAC
2b950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b960 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 46 69  ("Error.  SignFi
2b970 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66  nal() returned f
2b980 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
2b990 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
2b9a0 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a  ong) sign_ret);.
2b9b0 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e 5f 72  ...return(sign_r
2b9c0 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 53  et);..}...if (pS
2b9d0 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e 55 4c 4c  ignature == NULL
2b9e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b9f0 55 47 5f 50 52 49 4e 54 46 28 22 70 53 69 67 6e  UG_PRINTF("pSign
2ba00 61 74 75 72 65 20 73 70 65 63 69 66 69 65 64 20  ature specified 
2ba10 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f 69 6e 67  as NULL, undoing
2ba20 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 29 22   C_SignUpdate()"
2ba30 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  );....cackey_ses
2ba40 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2ba50 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73  sign_bufused = s
2ba60 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
2ba70 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  d;....return(sig
2ba80 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 43 41 43  n_ret);..}...CAC
2ba90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2baa0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2bab0 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
2bac0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2bad0 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
2bae0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2baf0 2c 20 43 5f 53 69 67 6e 55 70 64 61 74 65 29 28  , C_SignUpdate)(
2bb00 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2bb10 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2bb20 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2bb30 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
2bb40 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  n) {..int mutex_
2bb50 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
2bb60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2bb70 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2bb80 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2bb90 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2bba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2bbb0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2bbc0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2bbd0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2bbe0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2bbf0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2bc00 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2bc10 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2bc20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2bc30 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2bc40 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2bc50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2bc60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2bc70 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2bc80 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2bc90 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2bca0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2bcb0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61  D);..}...if (pPa
2bcc0 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  rt == NULL && ul
2bcd0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
2bce0 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75  ../* Short circu
2bcf0 69 74 20 69 66 20 77 65 20 61 72 65 20 61 73 6b  it if we are ask
2bd00 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f 74 68 69  ed to sign nothi
2bd10 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45  ng... */...CACKE
2bd20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2bd30 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
2bd40 20 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72   (%i) (short cir
2bd50 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b  cuit)", CKR_OK);
2bd60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2bd70 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 50 61  K);..}...if (pPa
2bd80 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
2bd90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bda0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 50 61 72  NTF("Error. pPar
2bdb0 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75  t is NULL, but u
2bdc0 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e 6f 74 20  lPartLen is not 
2bdd0 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  0.");....return(
2bde0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
2bdf0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 50  D);..}...if (ulP
2be00 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
2be10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2be20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 50  INTF("Error. ulP
2be30 61 72 74 4c 65 6e 20 69 73 20 30 2c 20 62 75 74  artLen is 0, but
2be40 20 70 50 61 72 74 20 69 73 20 6e 6f 74 20 4e 55   pPart is not NU
2be50 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
2be60 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
2be70 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  AD);..}...mutex_
2be80 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2be90 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2bea0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2beb0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2bec0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2bed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2bee0 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2bef0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2bf00 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2bf10 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
2bf20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2bf30 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
2bf40 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2bf50 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2bf60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2bf70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bf80 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2bf90 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2bfa0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2bfb0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2bfc0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2bfd0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2bfe0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2bff0 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
2c000 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2c010 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2c020 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
2c030 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c040 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63  or.  Sign not ac
2c050 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2c060 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49  turn(CKR_OPERATI
2c070 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  ON_NOT_INITIALIZ
2c080 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  ED);..}...switch
2c090 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
2c0a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2c0b0 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 09  _mechanism) {...
2c0c0 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
2c0d0 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75 6d 75 6c  S:..../* Accumul
2c0e0 61 74 65 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a  ate directly */.
2c0f0 09 09 09 69 66 20 28 28 63 61 63 6b 65 79 5f 73  ...if ((cackey_s
2c100 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c110 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b  ].sign_bufused +
2c120 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e 20 63 61   ulPartLen) > ca
2c130 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c140 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2c150 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  len) {.....cacke
2c160 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c170 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
2c180 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63 61 63 6b   *= 2;......cack
2c190 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c1a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 3d  sion].sign_buf =
2c1b0 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b 65 79 5f   realloc(cackey_
2c1c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c1d0 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 73 69 7a  n].sign_buf, siz
2c1e0 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73 73  eof(*cackey_sess
2c1f0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2c200 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b 65  ign_buf) * cacke
2c210 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c220 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
2c230 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65 6d 63  );....}.....memc
2c240 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  py(cackey_sessio
2c250 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2c260 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65 79 5f 73  n_buf + cackey_s
2c270 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c280 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 2c 20  ].sign_bufused, 
2c290 70 50 61 72 74 2c 20 75 6c 50 61 72 74 4c 65 6e  pPart, ulPartLen
2c2a0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
2c2b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2c2c0 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 2b 3d  .sign_bufused +=
2c2d0 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a 09 09 09   ulPartLen;.....
2c2e0 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  break;..}...mute
2c2f0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2c300 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2c310 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2c320 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2c330 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
2c340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c350 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
2c360 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2c370 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2c380 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2c390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c3a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2c3b0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
2c3c0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
2c3d0 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
2c3e0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2c3f0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46 69 6e 61  K_RV, C_SignFina
2c400 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  l)(CK_SESSION_HA
2c410 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2c420 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
2c430 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  ature, CK_ULONG_
2c440 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65  PTR pulSignature
2c450 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43  Len) {..static C
2c460 4b 5f 42 59 54 45 20 73 69 67 62 75 66 5b 31 30  K_BYTE sigbuf[10
2c470 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 73 69  24];..ssize_t si
2c480 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f  gbuflen;..CK_SLO
2c490 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b  T_ID slotID;..CK
2c4a0 5f 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52  _RV retval = CKR
2c4b0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a  _GENERAL_ERROR;.
2c4c0 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f 73  .int terminate_s
2c4d0 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74 20 6d 75  ign = 1;..int mu
2c4e0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
2c4f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c500 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2c510 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2c520 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2c530 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c540 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2c550 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2c560 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2c570 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2c580 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
2c590 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2c5a0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2c5b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c5c0 28 22 45 72 72 6f 72 2e 20 70 75 6c 53 69 67 6e  ("Error. pulSign
2c5d0 61 74 75 72 65 4c 65 6e 20 69 73 20 4e 55 4c 4c  atureLen is NULL
2c5e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2c5f0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
2c600 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2c610 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2c620 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2c630 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c640 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2c650 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2c660 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2c670 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2c680 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2c690 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2c6a0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2c6b0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2c6c0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
2c6d0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2c6e0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2c6f0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
2c700 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
2c710 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2c720 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c730 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
2c740 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2c750 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2c760 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
2c770 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c780 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
2c790 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2c7a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2c7b0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2c7c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c7d0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
2c7e0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2c7f0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c800 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2c810 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2c820 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
2c830 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2c840 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  gn_active) {...c
2c850 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2c860 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2c870 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2c880 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c890 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20 61 63 74  r.  Sign not act
2c8a0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2c8b0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
2c8c0 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
2c8d0 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
2c8e0 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
2c8f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
2c900 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
2c910 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
2c920 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2c930 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
2c940 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
2c950 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2c960 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c970 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
2c980 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
2c990 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
2c9a0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
2c9b0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
2c9c0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2c9d0 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
2c9e0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
2c9f0 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
2ca00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ca10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
2ca20 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
2ca30 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
2ca40 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
2ca50 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
2ca60 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2ca70 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2ca80 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
2ca90 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2caa0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
2cab0 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  h (cackey_sessio
2cac0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2cad0 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09  n_mechanism) {..
2cae0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
2caf0 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20 63 61  CS:..../* Ask ca
2cb00 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f 0a 09 09  rd to sign */...
2cb10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cb20 49 4e 54 46 28 22 41 73 6b 69 6e 67 20 74 6f 20  INTF("Asking to 
2cb30 73 69 67 6e 20 66 72 6f 6d 20 69 64 65 6e 74 69  sign from identi
2cb40 74 79 20 25 70 20 69 6e 20 73 65 73 73 69 6f 6e  ty %p in session
2cb50 20 25 6c 75 22 2c 20 28 76 6f 69 64 20 2a 29 20   %lu", (void *) 
2cb60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2cb70 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
2cb80 64 65 6e 74 69 74 79 2c 20 28 75 6e 73 69 67 6e  dentity, (unsign
2cb90 65 64 20 6c 6f 6e 67 29 20 68 53 65 73 73 69 6f  ed long) hSessio
2cba0 6e 29 3b 0a 09 09 09 73 69 67 62 75 66 6c 65 6e  n);....sigbuflen
2cbb0 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
2cbc0 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
2cbd0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
2cbe0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cbf0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e  ssion].sign_iden
2cc00 74 69 74 79 2c 20 63 61 63 6b 65 79 5f 73 65 73  tity, cackey_ses
2cc10 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2cc20 73 69 67 6e 5f 62 75 66 2c 20 63 61 63 6b 65 79  sign_buf, cackey
2cc30 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cc40 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2cc50 2c 20 73 69 67 62 75 66 2c 20 73 69 7a 65 6f 66  , sigbuf, sizeof
2cc60 28 73 69 67 62 75 66 29 2c 20 31 2c 20 30 29 3b  (sigbuf), 1, 0);
2cc70 0a 0a 09 09 09 69 66 20 28 73 69 67 62 75 66 6c  .....if (sigbufl
2cc80 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a  en < 0) {...../*
2cc90 20 53 69 67 6e 69 6e 67 20 66 61 69 6c 65 64 2e   Signing failed.
2cca0 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 69 67 62   */.....if (sigb
2ccb0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2ccc0 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e  PCSC_E_NEEDLOGIN
2ccd0 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
2cce0 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c  = CKR_USER_NOT_L
2ccf0 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20  OGGED_IN;.....} 
2cd00 65 6c 73 65 20 69 66 20 28 73 69 67 62 75 66 6c  else if (sigbufl
2cd10 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  en == CACKEY_PCS
2cd20 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
2cd30 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
2cd40 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f   CKR_DEVICE_REMO
2cd50 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  VED;.....} else 
2cd60 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
2cd70 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2cd80 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c  R;.....}....} el
2cd90 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65  se if (((unsigne
2cda0 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c 65  d long) sigbufle
2cdb0 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e 61 74 75  n) > *pulSignatu
2cdc0 72 65 4c 65 6e 20 26 26 20 70 53 69 67 6e 61 74  reLen && pSignat
2cdd0 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a 20 53 69  ure) {...../* Si
2cde0 67 6e 65 64 20 64 61 74 61 20 74 6f 6f 20 6c 61  gned data too la
2cdf0 72 67 65 20 2a 2f 0a 09 09 09 09 43 41 43 4b 45  rge */.....CACKE
2ce00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ce10 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
2ce20 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 20 20  FER_TOO_SMALL;  
2ce30 73 69 67 62 75 66 6c 65 6e 20 3d 20 25 6c 75 2c  sigbuflen = %lu,
2ce40 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e   pulSignatureLen
2ce50 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e   = %lu", (unsign
2ce60 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75 66 6c  ed long) sigbufl
2ce70 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
2ce80 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61 74 75 72  ng) *pulSignatur
2ce90 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72 65 74 76  eLen);......retv
2cea0 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
2ceb0 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09 09 09 09  TOO_SMALL;......
2cec0 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d  terminate_sign =
2ced0 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a   0;....} else {.
2cee0 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
2cef0 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09 69 66 20  gn = 0;......if 
2cf00 28 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09  (pSignature) {..
2cf10 09 09 09 09 6d 65 6d 63 70 79 28 70 53 69 67 6e  ....memcpy(pSign
2cf20 61 74 75 72 65 2c 20 73 69 67 62 75 66 2c 20 73  ature, sigbuf, s
2cf30 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  igbuflen);......
2cf40 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20  .terminate_sign 
2cf50 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  = 1;.....}......
2cf60 2a 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e  *pulSignatureLen
2cf70 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b 0a 0a 09   = sigbuflen;...
2cf80 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2cf90 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  OK;....}.....bre
2cfa0 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28 74 65 72  ak;..}...if (ter
2cfb0 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20 7b 0a 09  minate_sign) {..
2cfc0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
2cfd0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2cfe0 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09 09 66 72  ign_buf) {....fr
2cff0 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ee(cackey_sessio
2d000 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2d010 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a 09 09 63  n_buf);...}....c
2d020 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2d030 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63  Session].sign_ac
2d040 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d  tive = 0;..}...m
2d050 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2d060 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2d070 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2d080 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2d090 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2d0a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d0b0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2d0c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2d0d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2d0e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2d0f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d100 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d110 6e 67 20 25 69 22 2c 20 28 69 6e 74 29 20 72 65  ng %i", (int) re
2d120 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
2d130 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44  retval);.}..CK_D
2d140 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2d150 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f  K_RV, C_SignReco
2d160 76 65 72 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  verInit)(CK_SESS
2d170 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d180 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2d190 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2d1a0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2d1b0 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
2d1c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d1d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d1e0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d1f0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d200 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d210 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d220 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d230 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d240 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d250 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2d260 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d270 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2d280 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d290 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2d2a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d2b0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2d2c0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2d2d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2d2e0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2d2f0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2d300 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53  nRecover)(CK_SES
2d310 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2d320 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2d330 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2d340 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
2d350 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74  BYTE_PTR pSignat
2d360 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ure, CK_ULONG_PT
2d370 52 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  R pulSignatureLe
2d380 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2d390 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2d3a0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2d3b0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2d3c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d3d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d3e0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2d3f0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d400 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2d410 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2d420 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d430 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d440 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2d450 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2d460 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2d470 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d480 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2d490 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d4a0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2d4b0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d4c0 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 49 6e 69  _RV, C_VerifyIni
2d4d0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
2d4e0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2d4f0 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2d500 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2d510 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2d520 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2d530 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2d540 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2d550 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2d560 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d570 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d580 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2d590 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d5a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2d5b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2d5c0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d5d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d5e0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2d5f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2d600 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2d610 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d620 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2d630 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d640 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2d650 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d660 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 29 28 43  _RV, C_Verify)(C
2d670 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2d680 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2d690 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b  TE_PTR pData, CK
2d6a0 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e  _ULONG ulDataLen
2d6b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2d6c0 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
2d6d0 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
2d6e0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2d6f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2d700 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2d710 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2d720 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d730 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d740 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2d750 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2d760 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2d770 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2d780 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2d790 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2d7a0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2d7b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2d7c0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2d7d0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2d7e0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2d7f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d800 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2d810 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2d820 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 55 70 64  _RV, C_VerifyUpd
2d830 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2d840 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2d850 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2d860 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2d870 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
2d880 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d890 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2d8a0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2d8b0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2d8c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2d8d0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2d8e0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2d8f0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2d900 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2d910 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2d920 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2d930 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2d940 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d950 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2d960 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d970 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2d980 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2d990 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2d9a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2d9b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69  ON(CK_RV, C_Veri
2d9c0 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  fyFinal)(CK_SESS
2d9d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d9e0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2d9f0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2da00 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
2da10 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2da20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2da30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2da40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2da50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2da60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2da70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2da80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2da90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2daa0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2dab0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2dac0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2dad0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2dae0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2daf0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2db00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2db10 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2db20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2db30 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2db40 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2db50 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2db60 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f  RecoverInit)(CK_
2db70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2db80 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2db90 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2dba0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2dbb0 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09  HANDLE hKey) {..
2dbc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dbd0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2dbe0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2dbf0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2dc00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dc10 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2dc20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2dc30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2dc40 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2dc50 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2dc60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2dc70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2dc80 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2dc90 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2dca0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2dcb0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2dcc0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2dcd0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2dce0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2dcf0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2dd00 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 29 28  _VerifyRecover)(
2dd10 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2dd20 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2dd30 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2dd40 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
2dd50 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20 43 4b 5f  ignatureLen, CK_
2dd60 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2dd70 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2dd80 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
2dd90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2dda0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2ddb0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2ddc0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2ddd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dde0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2ddf0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2de00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2de10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2de20 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2de30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2de40 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2de50 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2de60 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2de70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2de80 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2de90 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2dea0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2deb0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2dec0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67  ION(CK_RV, C_Dig
2ded0 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74 65  estEncryptUpdate
2dee0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2def0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2df00 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
2df10 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
2df20 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2df30 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c   pEncryptedPart,
2df40 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2df50 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2df60 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2df70 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2df80 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2df90 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2dfa0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2dfb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2dfc0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2dfd0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2dfe0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2dff0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2e000 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2e010 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2e020 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2e030 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2e040 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2e050 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e060 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2e070 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e080 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2e090 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e0a0 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 44 69  _RV, C_DecryptDi
2e0b0 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53  gestUpdate)(CK_S
2e0c0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2e0d0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2e0e0 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2e0f0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45  rt, CK_ULONG ulE
2e100 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c  ncryptedPartLen,
2e110 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2e120 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2e130 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09   pulPartLen) {..
2e140 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e150 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2e160 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2e170 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2e180 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e190 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2e1a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2e1b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2e1c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2e1d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2e1e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e1f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2e200 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e210 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2e220 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e230 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2e240 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2e250 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e260 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2e270 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2e280 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61  _SignEncryptUpda
2e290 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2e2a0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2e2b0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72  CK_BYTE_PTR pPar
2e2c0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61  t, CK_ULONG ulPa
2e2d0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
2e2e0 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61 72  TR pEncryptedPar
2e2f0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2e300 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  pulEncryptedPart
2e310 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2e320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2e330 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2e340 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2e350 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2e360 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e370 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2e380 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2e390 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2e3a0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2e3b0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2e3c0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2e3d0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2e3e0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2e3f0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2e400 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e410 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2e420 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e430 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2e440 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2e450 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
2e460 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b  VerifyUpdate)(CK
2e470 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2e480 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2e490 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
2e4a0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2e4b0 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
2e4c0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2e4d0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
2e4e0 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20 7b  TR pulPartLen) {
2e4f0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e500 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2e510 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2e520 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2e530 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e540 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2e550 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2e560 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e570 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2e580 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2e590 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e5a0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2e5b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e5c0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2e5d0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e5e0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2e5f0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2e600 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e610 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2e620 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2e630 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 29 28   C_GenerateKey)(
2e640 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2e650 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2e660 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2e670 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52  chanism, CK_ATTR
2e680 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
2e690 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
2e6a0 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
2e6b0 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
2e6c0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2e6d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2e6e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2e6f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2e700 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e710 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e720 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2e730 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2e740 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2e750 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2e760 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2e770 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2e780 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2e790 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2e7a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2e7b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e7c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2e7d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e7e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2e7f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e800 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b  _RV, C_GenerateK
2e810 65 79 50 61 69 72 29 28 43 4b 5f 53 45 53 53 49  eyPair)(CK_SESSI
2e820 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e830 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
2e840 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
2e850 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
2e860 52 20 70 50 75 62 6c 69 63 4b 65 79 54 65 6d 70  R pPublicKeyTemp
2e870 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2e880 6c 50 75 62 6c 69 63 4b 65 79 41 74 74 72 69 62  lPublicKeyAttrib
2e890 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 41 54 54  uteCount, CK_ATT
2e8a0 52 49 42 55 54 45 5f 50 54 52 20 70 50 72 69 76  RIBUTE_PTR pPriv
2e8b0 61 74 65 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20  ateKeyTemplate, 
2e8c0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72 69 76 61  CK_ULONG ulPriva
2e8d0 74 65 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f  teKeyAttributeCo
2e8e0 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  unt, CK_OBJECT_H
2e8f0 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 75 62 6c  ANDLE_PTR phPubl
2e900 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54  icKey, CK_OBJECT
2e910 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50 72  _HANDLE_PTR phPr
2e920 69 76 61 74 65 4b 65 79 29 20 7b 0a 09 43 41 43  ivateKey) {..CAC
2e930 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e940 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2e950 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2e960 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2e970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e980 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2e990 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2e9a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2e9b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2e9c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2e9d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e9e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2e9f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ea00 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2ea10 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ea20 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2ea30 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2ea40 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2ea50 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2ea60 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 72  TION(CK_RV, C_Wr
2ea70 61 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  apKey)(CK_SESSIO
2ea80 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2ea90 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2eaa0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2eab0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2eac0 20 68 57 72 61 70 70 69 6e 67 4b 65 79 2c 20 43   hWrappingKey, C
2ead0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2eae0 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50 54  hKey, CK_BYTE_PT
2eaf0 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20 43  R pWrappedKey, C
2eb00 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 57  K_ULONG_PTR pulW
2eb10 72 61 70 70 65 64 4b 65 79 4c 65 6e 29 20 7b 0a  rappedKeyLen) {.
2eb20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2eb30 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2eb40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2eb50 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2eb60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2eb70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2eb80 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2eb90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2eba0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ebb0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2ebc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ebd0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2ebe0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2ebf0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2ec00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ec10 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2ec20 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2ec30 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ec40 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2ec50 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2ec60 43 5f 55 6e 77 72 61 70 4b 65 79 29 28 43 4b 5f  C_UnwrapKey)(CK_
2ec70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ec80 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2ec90 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2eca0 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2ecb0 48 41 4e 44 4c 45 20 68 55 6e 77 72 61 70 70 69  HANDLE hUnwrappi
2ecc0 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54 45 5f 50  ngKey, CK_BYTE_P
2ecd0 54 52 20 70 57 72 61 70 70 65 64 4b 65 79 2c 20  TR pWrappedKey, 
2ece0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72 61 70 70  CK_ULONG ulWrapp
2ecf0 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f 41 54 54  edKeyLen, CK_ATT
2ed00 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
2ed10 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2ed20 6c 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  lAttributeCount,
2ed30 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
2ed40 45 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09  E_PTR phKey) {..
2ed50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ed60 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2ed70 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2ed80 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2ed90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2eda0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2edb0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2edc0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2edd0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2ede0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2edf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ee00 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2ee10 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ee20 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2ee30 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ee40 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2ee50 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2ee60 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2ee70 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2ee80 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2ee90 5f 44 65 72 69 76 65 4b 65 79 29 28 43 4b 5f 53  _DeriveKey)(CK_S
2eea0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2eeb0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2eec0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2eed0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2eee0 41 4e 44 4c 45 20 68 42 61 73 65 4b 65 79 2c 20  ANDLE hBaseKey, 
2eef0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
2ef00 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
2ef10 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65  LONG ulAttribute
2ef20 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
2ef30 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
2ef40 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2ef50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2ef60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2ef70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2ef80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2ef90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2efa0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2efb0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2efc0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2efd0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2efe0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2eff0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2f000 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2f010 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2f020 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2f030 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f040 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2f050 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f060 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2f070 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2f080 5f 52 56 2c 20 43 5f 53 65 65 64 52 61 6e 64 6f  _RV, C_SeedRando
2f090 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  m)(CK_SESSION_HA
2f0a0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2f0b0 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 65 65 64  K_BYTE_PTR pSeed
2f0c0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 65 65  , CK_ULONG ulSee
2f0d0 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  dLen) {..CACKEY_
2f0e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2f0f0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2f100 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2f110 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2f120 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f130 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2f140 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2f150 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2f160 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f170 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f180 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f190 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f1a0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f1b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2f1c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f1d0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2f1e0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f1f0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2f200 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2f210 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
2f220 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53  teRandom)(CK_SES
2f230 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2f240 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2f250 52 20 70 52 61 6e 64 6f 6d 44 61 74 61 2c 20 43  R pRandomData, C
2f260 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e 64 6f 6d  K_ULONG ulRandom
2f270 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2f280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2f290 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2f2a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2f2b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2f2c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2f2d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2f2e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2f2f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2f300 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2f310 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2f320 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2f330 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2f340 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2f350 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2f360 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2f370 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2f380 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2f390 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  PPORTED);.}../* 
2f3a0 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63 74  Deprecated Funct
2f3b0 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45  ion */.CK_DEFINE
2f3c0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2f3d0 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74   C_GetFunctionSt
2f3e0 61 74 75 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  atus)(CK_SESSION
2f3f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2f400 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2f410 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2f420 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
2f430 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f440 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f450 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20  ON_NOT_PARALLEL 
2f460 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2f470 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
2f480 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2f490 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
2f4a0 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69  ALLEL);...hSessi
2f4b0 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f  on = hSession; /
2f4c0 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64  * Supress unused
2f4d0 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e   variable warnin
2f4e0 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65  g */.}../* Depre
2f4f0 63 61 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a  cated Function *
2f500 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  /.CK_DEFINE_FUNC
2f510 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 61  TION(CK_RV, C_Ca
2f520 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29 28 43 4b  ncelFunction)(CK
2f530 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2f540 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43  hSession) {..CAC
2f550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f560 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43  ("Called.");...C
2f570 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f580 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2f590 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
2f5a0 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43  ARALLEL (%i)", C
2f5b0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f5c0 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74  PARALLEL);...ret
2f5d0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2f5e0 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a  _NOT_PARALLEL);.
2f5f0 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65  ..hSession = hSe
2f600 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73  ssion; /* Supres
2f610 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c  s unused variabl
2f620 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a  e warning */.}..
2f630 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2f640 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46  ON(CK_RV, C_GetF
2f650 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28 43 4b 5f  unctionList)(CK_
2f660 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54  FUNCTION_LIST_PT
2f670 52 5f 50 54 52 20 70 70 46 75 6e 63 74 69 6f 6e  R_PTR ppFunction
2f680 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46 55 4e 43  List) {..CK_FUNC
2f690 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52 20 70 46  TION_LIST_PTR pF
2f6a0 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43  unctionList;...C
2f6b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f6c0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2f6d0 09 69 66 20 28 70 70 46 75 6e 63 74 69 6f 6e 4c  .if (ppFunctionL
2f6e0 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
2f6f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f700 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 70 46  INTF("Error. ppF
2f710 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69 73 20 4e  unctionList is N
2f720 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2f730 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2f740 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46 75 6e 63  BAD);..}...pFunc
2f750 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61 6c 6c 6f  tionList = mallo
2f760 63 28 73 69 7a 65 6f 66 28 2a 70 46 75 6e 63 74  c(sizeof(*pFunct
2f770 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09 70 46 75  ionList));...pFu
2f780 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73  nctionList->vers
2f790 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43 41  ion.major = ((CA
2f7a0 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
2f7b0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 31  RSION_CODE) >> 1
2f7c0 36 29 20 26 20 30 78 66 66 3b 0a 09 70 46 75 6e  6) & 0xff;..pFun
2f7d0 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65 72 73 69  ctionList->versi
2f7e0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41 43  on.minor = ((CAC
2f7f0 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45 52  KEY_CRYPTOKI_VER
2f800 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38 29  SION_CODE) >> 8)
2f810 20 26 20 30 78 66 66 3b 0a 0a 09 70 46 75 6e 63   & 0xff;...pFunc
2f820 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
2f830 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e 69 74 69  ialize = C_Initi
2f840 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  alize;..pFunctio
2f850 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61 6c 69 7a  nList->C_Finaliz
2f860 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a 65 3b 0a  e = C_Finalize;.
2f870 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f880 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43 5f 47 65  C_GetInfo = C_Ge
2f890 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  tInfo;..pFunctio
2f8a0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74  nList->C_GetSlot
2f8b0 4c 69 73 74 20 3d 20 43 5f 47 65 74 53 6c 6f 74  List = C_GetSlot
2f8c0 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  List;..pFunction
2f8d0 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c 6f 74 49  List->C_GetSlotI
2f8e0 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c 6f 74 49  nfo = C_GetSlotI
2f8f0 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nfo;..pFunctionL
2f900 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b 65 6e 49  ist->C_GetTokenI
2f910 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f 6b 65 6e  nfo = C_GetToken
2f920 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
2f930 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46 6f 72 53  List->C_WaitForS
2f940 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f 57 61 69  lotEvent = C_Wai
2f950 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 3b 0a 09  tForSlotEvent;..
2f960 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f970 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73  _GetMechanismLis
2f980 74 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  t = C_GetMechani
2f990 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74 69  smList;..pFuncti
2f9a0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63  onList->C_GetMec
2f9b0 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20 43 5f 47  hanismInfo = C_G
2f9c0 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 3b  etMechanismInfo;
2f9d0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f9e0 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20 3d 20 43  >C_InitToken = C
2f9f0 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09 70 46 75  _InitToken;..pFu
2fa00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e  nctionList->C_In
2fa10 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69 74 50 49  itPIN = C_InitPI
2fa20 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  N;..pFunctionLis
2fa30 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d 20 43 5f  t->C_SetPIN = C_
2fa40 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69  SetPIN;..pFuncti
2fa50 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65 6e 53 65  onList->C_OpenSe
2fa60 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65 6e 53 65  ssion = C_OpenSe
2fa70 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f  ssion;..pFunctio
2fa80 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 53 65  nList->C_CloseSe
2fa90 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f 73 65 53  ssion = C_CloseS
2faa0 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69  ession;..pFuncti
2fab0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73 65 41  onList->C_CloseA
2fac0 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20 43 5f 43  llSessions = C_C
2fad0 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 3b  loseAllSessions;
2fae0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2faf0 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66  >C_GetSessionInf
2fb00 6f 20 3d 20 43 5f 47 65 74 53 65 73 73 69 6f 6e  o = C_GetSession
2fb10 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Info;..pFunction
2fb20 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70 65 72 61  List->C_GetOpera
2fb30 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 47 65  tionState = C_Ge
2fb40 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b  tOperationState;
2fb50 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2fb60 3e 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53  >C_SetOperationS
2fb70 74 61 74 65 20 3d 20 43 5f 53 65 74 4f 70 65 72  tate = C_SetOper
2fb80 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75  ationState;..pFu
2fb90 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f  nctionList->C_Lo
2fba0 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e 3b 0a 09  gin = C_Login;..
2fbb0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2fbc0 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c 6f 67 6f  _Logout = C_Logo
2fbd0 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ut;..pFunctionLi
2fbe0 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f 62 6a 65  st->C_CreateObje
2fbf0 63 74 20 3d 20 43 5f 43 72 65 61 74 65 4f 62 6a  ct = C_CreateObj
2fc00 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
2fc10 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62 6a 65 63  ist->C_CopyObjec
2fc20 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a 65 63 74  t = C_CopyObject
2fc30 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2fc40 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  ->C_DestroyObjec
2fc50 74 20 3d 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a  t = C_DestroyObj
2fc60 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
2fc70 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a 65 63 74  ist->C_GetObject
2fc80 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f 62 6a 65  Size = C_GetObje
2fc90 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69  ctSize;..pFuncti
2fca0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 41 74 74  onList->C_GetAtt
2fcb0 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f  ributeValue = C_
2fcc0 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
2fcd0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2fce0 74 2d 3e 43 5f 53 65 74 41 74 74 72 69 62 75 74  t->C_SetAttribut
2fcf0 65 56 61 6c 75 65 20 3d 20 43 5f 53 65 74 41 74  eValue = C_SetAt
2fd00 74 72 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70  tributeValue;..p
2fd10 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2fd20 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 20  FindObjectsInit 
2fd30 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49  = C_FindObjectsI
2fd40 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
2fd50 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
2fd60 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  ts = C_FindObjec
2fd70 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ts;..pFunctionLi
2fd80 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
2fd90 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69 6e 64 4f  sFinal = C_FindO
2fda0 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a 09 70 46  bjectsFinal;..pF
2fdb0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
2fdc0 6e 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 45  ncryptInit = C_E
2fdd0 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75  ncryptInit;..pFu
2fde0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
2fdf0 63 72 79 70 74 20 3d 20 43 5f 45 6e 63 72 79 70  crypt = C_Encryp
2fe00 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2fe10 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55 70 64 61  t->C_EncryptUpda
2fe20 74 65 20 3d 20 43 5f 45 6e 63 72 79 70 74 55 70  te = C_EncryptUp
2fe30 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2fe40 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 46  List->C_EncryptF
2fe50 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72 79 70 74  inal = C_Encrypt
2fe60 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
2fe70 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
2fe80 49 6e 69 74 20 3d 20 43 5f 44 65 63 72 79 70 74  Init = C_Decrypt
2fe90 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
2fea0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 20  List->C_Decrypt 
2feb0 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a 09 70 46  = C_Decrypt;..pF
2fec0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2fed0 65 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43  ecryptUpdate = C
2fee0 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 3b 0a  _DecryptUpdate;.
2fef0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2ff00 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 20 3d  C_DecryptFinal =
2ff10 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 3b   C_DecryptFinal;
2ff20 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2ff30 3e 43 5f 44 69 67 65 73 74 49 6e 69 74 20 3d 20  >C_DigestInit = 
2ff40 43 5f 44 69 67 65 73 74 49 6e 69 74 3b 0a 09 70  C_DigestInit;..p
2ff50 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2ff60 44 69 67 65 73 74 20 3d 20 43 5f 44 69 67 65 73  Digest = C_Diges
2ff70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2ff80 74 2d 3e 43 5f 44 69 67 65 73 74 55 70 64 61 74  t->C_DigestUpdat
2ff90 65 20 3d 20 43 5f 44 69 67 65 73 74 55 70 64 61  e = C_DigestUpda
2ffa0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
2ffb0 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b 65 79 20  st->C_DigestKey 
2ffc0 3d 20 43 5f 44 69 67 65 73 74 4b 65 79 3b 0a 09  = C_DigestKey;..
2ffd0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ffe0 5f 44 69 67 65 73 74 46 69 6e 61 6c 20 3d 20 43  _DigestFinal = C
2fff0 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b 0a 09 70  _DigestFinal;..p
30000 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30010 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f 53 69 67  SignInit = C_Sig
30020 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  nInit;..pFunctio
30030 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 20 3d 20  nList->C_Sign = 
30040 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e 63 74 69  C_Sign;..pFuncti
30050 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 55 70  onList->C_SignUp
30060 64 61 74 65 20 3d 20 43 5f 53 69 67 6e 55 70 64  date = C_SignUpd
30070 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
30080 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69 6e 61 6c  ist->C_SignFinal
30090 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61 6c 3b 0a   = C_SignFinal;.
300a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
300b0 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69  C_SignRecoverIni
300c0 74 20 3d 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  t = C_SignRecove
300d0 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  rInit;..pFunctio
300e0 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63  nList->C_SignRec
300f0 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e 52 65 63  over = C_SignRec
30100 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  over;..pFunction
30110 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 49 6e  List->C_VerifyIn
30120 69 74 20 3d 20 43 5f 56 65 72 69 66 79 49 6e 69  it = C_VerifyIni
30130 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
30140 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d 20 43 5f  t->C_Verify = C_
30150 56 65 72 69 66 79 3b 0a 09 70 46 75 6e 63 74 69  Verify;..pFuncti
30160 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
30170 55 70 64 61 74 65 20 3d 20 43 5f 56 65 72 69 66  Update = C_Verif
30180 79 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  yUpdate;..pFunct
30190 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
301a0 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65 72 69 66  yFinal = C_Verif
301b0 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  yFinal;..pFuncti
301c0 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79  onList->C_Verify
301d0 52 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f  RecoverInit = C_
301e0 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
301f0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
30200 74 2d 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76  t->C_VerifyRecov
30210 65 72 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63  er = C_VerifyRec
30220 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  over;..pFunction
30230 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 45 6e  List->C_DigestEn
30240 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
30250 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
30260 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
30270 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 44 69  ist->C_DecryptDi
30280 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44  gestUpdate = C_D
30290 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61  ecryptDigestUpda
302a0 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
302b0 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63 72 79 70  st->C_SignEncryp
302c0 74 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e  tUpdate = C_Sign
302d0 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
302e0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
302f0 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70  _DecryptVerifyUp
30300 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74  date = C_Decrypt
30310 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70  VerifyUpdate;..p
30320 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30330 47 65 6e 65 72 61 74 65 4b 65 79 20 3d 20 43 5f  GenerateKey = C_
30340 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a 09 70 46  GenerateKey;..pF
30350 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
30360 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 20 3d  enerateKeyPair =
30370 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61   C_GenerateKeyPa
30380 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ir;..pFunctionLi
30390 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79 20 3d 20  st->C_WrapKey = 
303a0 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e  C_WrapKey;..pFun
303b0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 55 6e 77  ctionList->C_Unw
303c0 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e 77 72 61  rapKey = C_Unwra
303d0 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  pKey;..pFunction
303e0 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76 65 4b 65  List->C_DeriveKe
303f0 79 20 3d 20 43 5f 44 65 72 69 76 65 4b 65 79 3b  y = C_DeriveKey;
30400 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30410 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d 20 3d 20  >C_SeedRandom = 
30420 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b 0a 09 70  C_SeedRandom;..p
30430 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30440 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 20 3d  GenerateRandom =
30450 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f   C_GenerateRando
30460 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  m;..pFunctionLis
30470 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  t->C_GetFunction
30480 53 74 61 74 75 73 20 3d 20 43 5f 47 65 74 46 75  Status = C_GetFu
30490 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b 0a 09 70  nctionStatus;..p
304a0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
304b0 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 20 3d  CancelFunction =
304c0 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f   C_CancelFunctio
304d0 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
304e0 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  t->C_GetFunction
304f0 4c 69 73 74 20 3d 20 43 5f 47 65 74 46 75 6e 63  List = C_GetFunc
30500 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a 70 70 46  tionList;...*ppF
30510 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 70 46  unctionList = pF
30520 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 43  unctionList;...C
30530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
30540 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
30550 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
30560 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
30570 52 5f 4f 4b 29 3b 0a 7d 0a 0a                    R_OK);.}..