Hex Artifact Content

Artifact 6f86c48f0e4692007d29db567bd4fea47105f2f8:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23  ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74    include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a  define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e  #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72  E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65  urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f  fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69  nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55  ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72  NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e   returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f  ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f  CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28  me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20  * name).#ifndef 
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69  NULL_PTR.#  defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65  ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75  pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23  de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20   "md5.h"../*. * 
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f  Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68  urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75  is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75  an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20  nctions and not 
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62  include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61  . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63  sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69  lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a  nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20   0x58../*** PIV 
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69  Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49   0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37  TR_GENAUTH  0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e  xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20  _PIV_AID        
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78  , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20  00, 0x00, 0x10, 
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30  0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a  ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69  /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31  -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23  PIVAUTH   0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54  _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65  URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  KEY_KEYMGT    0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41  P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a  RDAUTH  0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e  * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50  tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65   800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78  ALGO_RSA1024  0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a  SA2048  0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66  * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54  0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66  able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20  _3_OID_PIVAUTH  
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43  NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20  1, 0x0A.#define 
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35  ID_KEYMGT    0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64  F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54  73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  H  0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x01../* Maximum 
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a           250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69   ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64   MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49  efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a  ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e  E_TIME_H.#    in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63  tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  time = 0;.static
1760: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43   unsigned long C
1770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
1780: 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09 69 66 20  IME(void) {..if 
1790: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74  (cackey_debug_st
17a0: 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29 20 7b  art_time == 0) {
17b0: 0a 09 09 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  ...cackey_debug_
17c0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17d0: 65 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  e(NULL);..}...re
17e0: 74 75 72 6e 28 74 69 6d 65 28 4e 55 4c 4c 29 20  turn(time(NULL) 
17f0: 2d 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73  - cackey_debug_s
1800: 74 61 72 74 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20  tart_time);.}.# 
1810: 20 65 6c 73 65 0a 73 74 61 74 69 63 20 75 6e 73   else.static uns
1820: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1830: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1840: 76 6f 69 64 29 20 7b 0a 09 72 65 74 75 72 6e 28  void) {..return(
1850: 30 29 3b 0a 7d 0a 23 20 20 65 6e 64 69 66 0a 0a  0);.}.#  endif..
1860: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1870: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
1880: 2e 2e 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 20  ..) { \..static 
1890: 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34 30  char buf_user[40
18a0: 39 36 5d 20 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e  96] = {0}; \..sn
18b0: 70 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 2c  printf(buf_user,
18c0: 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72   sizeof(buf_user
18d0: 29 2c 20 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73  ), x); \..buf_us
18e0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
18f0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1900: 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b   \..fprintf(cack
1910: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1920: 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20  [%lu]: %s():%i: 
1930: 25 73 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  %s\n", CACKEY_DE
1940: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1950: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1960: 5f 2c 20 62 75 66 5f 75 73 65 72 29 3b 20 5c 0a  _, buf_user); \.
1970: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
1980: 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a  ebug_fd()); \.}.
1990: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
19a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
19b0: 66 2c 20 78 2c 20 79 29 20 7b 20 5c 0a 09 73 74  f, x, y) { \..st
19c0: 61 74 69 63 20 63 68 61 72 20 62 75 66 5f 75 73  atic char buf_us
19d0: 65 72 5b 34 30 39 36 5d 20 3d 20 7b 30 7d 2c 20  er[4096] = {0}, 
19e0: 2a 62 75 66 5f 75 73 65 72 5f 70 3b 20 5c 0a 09  *buf_user_p; \..
19f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75  unsigned long bu
1a00: 66 5f 75 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09  f_user_size; \..
1a10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1a20: 4d 50 42 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e  MPBUF; \..unsign
1a30: 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09  ed long idx; \..
1a40: 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f 72 65 74  int snprintf_ret
1a50: 3b 20 5c 0a 09 54 4d 50 42 55 46 20 3d 20 28 75  ; \..TMPBUF = (u
1a60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1a70: 28 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  (x); \..buf_user
1a80: 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20 5c  _p = buf_user; \
1a90: 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1aa0: 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  = sizeof(buf_use
1ab0: 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78 20  r); \..for (idx 
1ac0: 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20  = 1; idx < (y); 
1ad0: 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20  idx++) { \...if 
1ae0: 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c  (buf_user_size <
1af0: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1b00: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e  k; \...}; \...sn
1b10: 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70  printf_ret = snp
1b20: 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70  rintf(buf_user_p
1b30: 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c  , buf_user_size,
1b40: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1b50: 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20  F[idx]); \...if 
1b60: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d  (snprintf_ret <=
1b70: 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b   0) { \....break
1b80: 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66  ; \...}; \...buf
1b90: 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69  _user_p += snpri
1ba0: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66  ntf_ret; \...buf
1bb0: 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e  _user_size -= sn
1bc0: 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d  printf_ret; \..}
1bd0: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1be0: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1bf0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
1c00: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1c10: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1c20: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28  : %s():%i: %s  (
1c30: 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78 25 73  %s/%lu = {%02x%s
1c40: 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  })\n", CACKEY_DE
1c50: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1c60: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1c70: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1c80: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1c90: 4d 50 42 55 46 5b 30 5d 2c 20 62 75 66 5f 75 73  MPBUF[0], buf_us
1ca0: 65 72 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63  er); \..fflush(c
1cb0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1cc0: 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65  ); \.}.#  define
1cd0: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1ce0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cf0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
1d00: 28 76 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b  (void *) x, #x);
1d10: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1d20: 74 69 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79  tic FILE *cackey
1d30: 5f 64 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20  _debug_fd(void) 
1d40: 7b 0a 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a  {..static FILE *
1d50: 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  fd = NULL;..char
1d60: 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20   *logfile;...if 
1d70: 28 66 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fd != NULL) {..
1d80: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a  .return(fd);..}.
1d90: 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20  ../*.. * Log to 
1da0: 73 74 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79  stderr initially
1db0: 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64   so we can use d
1dc0: 65 62 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a  ebugging within.
1dd0: 09 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  . * this functio
1de0: 6e 20 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e  n without gettin
1df0: 67 20 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69  g into an infini
1e00: 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64  te loop.. */..fd
1e10: 20 3d 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67   = stderr;...log
1e20: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1e30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1e40: 49 4c 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66  ILE");..if (logf
1e50: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
1e60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e70: 49 4e 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69  INTF("Found envi
1e80: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e90: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
1ea0: 0a 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74  ....logfile = st
1eb0: 72 63 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d  rchr(logfile, '=
1ec0: 27 29 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c  ');...if (logfil
1ed0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1ee0: 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  logfile = getenv
1ef0: 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  ("CACKEY_DEBUG_L
1f00: 4f 47 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c  OGFILE");...} el
1f10: 73 65 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b  se {....logfile+
1f20: 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65  +;...}..}..#ifde
1f30: 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  f CACKEY_DEBUG_L
1f40: 4f 47 46 49 4c 45 0a 09 69 66 20 28 6c 6f 67 66  OGFILE..if (logf
1f50: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
1f60: 09 6c 6f 67 66 69 6c 65 20 3d 20 43 41 43 4b 45  .logfile = CACKE
1f70: 59 5f 44 45 42 55 47 5f 4c 4f 47 46 49 4c 45 3b  Y_DEBUG_LOGFILE;
1f80: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  ..}.#endif...if 
1f90: 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (logfile != NULL
1fa0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fb0: 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1fc0: 20 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20   log file: %s", 
1fd0: 6c 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20  logfile);....fd 
1fe0: 3d 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c  = fopen(logfile,
1ff0: 20 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28   "a");..}...if (
2000: 66 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  fd == NULL) {...
2010: 66 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a  fd = stderr;..}.
2020: 0a 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65  ..if (fd == stde
2030: 72 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  rr) {...CACKEY_D
2040: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2050: 75 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b  urning stderr");
2060: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
2070: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2080: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c  ("Returning %p",
2090: 20 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09   (void *) fd);..
20a0: 7d 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a  }...return(fd);.
20b0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  }..static void *
20c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
20d0: 43 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20  C_MALLOC(size_t 
20e0: 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  size, const char
20f0: 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65   *func, int line
2100: 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61  ) {..void *retva
2110: 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61  l;...retval = ma
2120: 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70  lloc(size);...fp
2130: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2140: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2150: 20 25 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43   %s():%i: MALLOC
2160: 28 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b  () = %p\n", CACK
2170: 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45  EY_DEBUG_GETTIME
2180: 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20  (), func, line, 
2190: 72 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68  retval);..fflush
21a0: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
21b0: 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  ());...return(re
21c0: 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  tval);.}..static
21d0: 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45   void *CACKEY_DE
21e0: 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43  BUG_FUNC_REALLOC
21f0: 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65  (void *ptr, size
2200: 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63  _t size, const c
2210: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
2220: 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65  ine) {..void *re
2230: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
2240: 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69   realloc(ptr, si
2250: 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61  ze);...if (retva
2260: 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70  l != ptr) {...fp
2270: 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62  rintf(cackey_deb
2280: 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a  ug_fd(), "[%lu]:
2290: 20 25 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f   %s():%i: REALLO
22a0: 43 28 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43  C(%p) = %p\n", C
22b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
22c0: 49 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e  IME(), func, lin
22d0: 65 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b  e, ptr, retval);
22e0: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
22f0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
2300: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
2310: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
2320: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2330: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
2340: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2350: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2360: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2370: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2380: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2390: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
23a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
23b0: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
23c0: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
23d0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
23e0: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
23f0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
2400: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
2410: 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f  .fprintf(cackey_
2420: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c  debug_fd(), "[%l
2430: 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52  u]: %s():%i: STR
2440: 44 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25  DUP_MALLOC() = %
2450: 70 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  p\n", CACKEY_DEB
2460: 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75  UG_GETTIME(), fu
2470: 6e 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c  nc, line, retval
2480: 29 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65  );..fflush(cacke
2490: 79 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a  y_debug_fd());..
24a0: 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b  .return(retval);
24b0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
24c0: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
24d0: 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
24e0: 53 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61  STR(unsigned cha
24f0: 72 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68  r tag) {..switch
2500: 20 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20   (tag) {...case 
2510: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44  GSCIS_TAG_CARDID
2520: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2530: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b  IS_TAG_CARDID");
2540: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2550: 47 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65  G_CCC_VER:....re
2560: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2570: 43 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73  CCC_VER");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f  e GSCIS_TAG_CCG_
2590: 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  VER:....return("
25a0: 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45  GSCIS_TAG_CCG_VE
25b0: 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  R");...case GSCI
25c0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
25d0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
25e0: 54 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09  TAG_CARDURL");..
25f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2600: 50 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72  PKCS15:....retur
2610: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43  n("GSCIS_TAG_PKC
2620: 53 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53  S15");...case GS
2630: 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41  CIS_TAG_REG_DATA
2640: 5f 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72  _MODEL:....retur
2650: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47  n("GSCIS_TAG_REG
2660: 5f 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09  _DATA_MODEL");..
2670: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2680: 41 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65  ACR_TABLE:....re
2690: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
26a0: 41 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63  ACR_TABLE");...c
26b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41  ase GSCIS_TAG_CA
26c0: 52 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75  RD_APDU:....retu
26d0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41  rn("GSCIS_TAG_CA
26e0: 52 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73  RD_APDU");...cas
26f0: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49  e GSCIS_TAG_REDI
2700: 52 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  RECTION:....retu
2710: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45  rn("GSCIS_TAG_RE
2720: 44 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63  DIRECTION");...c
2730: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54  ase GSCIS_TAG_CT
2740: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2750: 49 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63  IS_TAG_CT");...c
2760: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54  ase GSCIS_TAG_ST
2770: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2780: 49 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63  IS_TAG_ST");...c
2790: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ase GSCIS_TAG_NE
27a0: 58 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e  XTCCC:....return
27b0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54  ("GSCIS_TAG_NEXT
27c0: 43 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53  CCC");...case GS
27d0: 43 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09  CIS_TAG_FNAME:..
27e0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
27f0: 54 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63  TAG_FNAME");...c
2800: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e  ase GSCIS_TAG_MN
2810: 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  AME:....return("
2820: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22  GSCIS_TAG_MNAME"
2830: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2840: 54 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_LNAME:....re
2850: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2860: 4c 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  LNAME");...case 
2870: 47 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58  GSCIS_TAG_SUFFIX
2880: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2890: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b  IS_TAG_SUFFIX");
28a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
28b0: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09  G_GOVT_AGENCY:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28d0: 54 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22  TAG_GOVT_AGENCY"
28e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
28f0: 54 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72  TAG_BUREAU:....r
2900: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2910: 5f 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73  _BUREAU");...cas
2920: 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45  e GSCIS_TAG_BURE
2930: 41 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  AU_CODE:....retu
2940: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55  rn("GSCIS_TAG_BU
2950: 52 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63  REAU_CODE");...c
2960: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45  ase GSCIS_TAG_DE
2970: 50 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75  PT_CODE:....retu
2980: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45  rn("GSCIS_TAG_DE
2990: 50 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73  PT_CODE");...cas
29a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c  e GSCIS_TAG_TITL
29b0: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  E:....return("GS
29c0: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b  CIS_TAG_TITLE");
29d0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29e0: 47 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72  G_BUILDING:....r
29f0: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2a00: 5f 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63  _BUILDING");...c
2a10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2a20: 46 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72  FICE_ADDR1:....r
2a30: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2a40: 5f 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b  _OFFICE_ADDR1");
2a50: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2a60: 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a  G_OFFICE_ADDR2:.
2a70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2a80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52  _TAG_OFFICE_ADDR
2a90: 32 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  2");...case GSCI
2aa0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54  S_TAG_OFFICE_CIT
2ab0: 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  Y:....return("GS
2ac0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2ad0: 49 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ITY");...case GS
2ae0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53  CIS_TAG_OFFICE_S
2af0: 54 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  TATE:....return(
2b00: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b10: 45 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73  E_STATE");...cas
2b20: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b30: 43 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72  CE_ZIP:....retur
2b40: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2b50: 49 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73  ICE_ZIP");...cas
2b60: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
2b70: 43 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72  CE_COUNTRY:....r
2b80: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b90: 5f 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22  _OFFICE_COUNTRY"
2ba0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bb0: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2bc0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2bd0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2be0: 4f 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ONE");...case GS
2bf0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50  CIS_TAG_OFFICE_P
2c00: 48 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74  HONE_EXT:....ret
2c10: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f  urn("GSCIS_TAG_O
2c20: 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22  FFICE_PHONE_EXT"
2c30: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2c40: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a  TAG_OFFICE_FAX:.
2c50: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2c60: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22  _TAG_OFFICE_FAX"
2c70: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2c80: 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c  TAG_OFFICE_EMAIL
2c90: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2ca0: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
2cb0: 41 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AIL");...case GS
2cc0: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52  CIS_TAG_OFFICE_R
2cd0: 4f 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OOM:....return("
2ce0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2cf0: 5f 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20  _ROOM");...case 
2d00: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2d10: 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75  _AGENCY:....retu
2d20: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f  rn("GSCIS_TAG_NO
2d30: 4e 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09  NGOV_AGENCY");..
2d40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d50: 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a  SSN_DESIGNATOR:.
2d60: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d70: 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41  _TAG_SSN_DESIGNA
2d80: 54 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  TOR");...case GS
2d90: 43 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09  CIS_TAG_SSN:....
2da0: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2db0: 47 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20  G_SSN");...case 
2dc0: 47 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09  GSCIS_TAG_DOB:..
2dd0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2de0: 54 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73  TAG_DOB");...cas
2df0: 65 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44  e GSCIS_TAG_GEND
2e00: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2e10: 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22  SCIS_TAG_GENDER"
2e20: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2e30: 54 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72  TAG_USERID:....r
2e40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2e50: 5f 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73  _USERID");...cas
2e60: 65 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41  e GSCIS_TAG_DOMA
2e70: 49 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IN:....return("G
2e80: 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22  SCIS_TAG_DOMAIN"
2e90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ea0: 54 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09  TAG_PASSWORD:...
2eb0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2ec0: 41 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09  AG_PASSWORD");..
2ed0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ee0: 49 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74  ISSUERID:....ret
2ef0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2f00: 53 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73  SSUERID");...cas
2f10: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e  e GSCIS_TAG_SERN
2f20: 4f 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  O:....return("GS
2f30: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b  CIS_TAG_SERNO");
2f40: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f50: 47 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09  G_ISSUE_DATE:...
2f60: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f70: 41 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b  AG_ISSUE_DATE");
2f80: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
2f90: 47 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09  G_EXPIRE_DATE:..
2fa0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2fb0: 54 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22  TAG_EXPIRE_DATE"
2fc0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2fd0: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09  TAG_CARD_TYPE:..
2fe0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2ff0: 54 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b  TAG_CARD_TYPE");
3000: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
3010: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a  G_SECURITY_CODE:
3020: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
3030: 53 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43  S_TAG_SECURITY_C
3040: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
3050: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
3060: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ID:....return("G
3070: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f  SCIS_TAG_CARDID_
3080: 41 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  AID");...case GS
3090: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
30a0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
30b0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
30c0: 49 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20  ICATE");...case 
30d0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49  GSCIS_TAG_CERT_I
30e0: 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  SSUE_DATE:....re
30f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
3100: 43 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22  CERT_ISSUE_DATE"
3110: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
3120: 54 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f  TAG_CERT_EXPIRE_
3130: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
3140: 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f  "GSCIS_TAG_CERT_
3150: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
3160: 7d 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e  }...return("UNKN
3170: 4f 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  OWN");.}..static
3180: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43   const char *CAC
3190: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
31a0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c  CARDERR_TO_STR(L
31b0: 4f 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09  ONG retcode) {..
31c0: 73 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29  switch (retcode)
31d0: 20 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f   {...case SCARD_
31e0: 53 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65  S_SUCCESS:....re
31f0: 74 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55  turn("SCARD_S_SU
3200: 43 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20  CCESS");...case 
3210: 53 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45  SCARD_E_CANCELLE
3220: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
3230: 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22  ARD_E_CANCELLED"
3240: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3250: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a  E_CANT_DISPOSE:.
3260: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3270: 5f 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22  _E_CANT_DISPOSE"
3280: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3290: 45 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42  E_INSUFFICIENT_B
32a0: 55 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  UFFER:....return
32b0: 28 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46  ("SCARD_E_INSUFF
32c0: 49 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b  ICIENT_BUFFER");
32d0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
32e0: 49 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09  INVALID_ATR:....
32f0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3300: 49 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09  INVALID_ATR");..
3310: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
3320: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09  VALID_HANDLE:...
3330: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3340: 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22  _INVALID_HANDLE"
3350: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3360: 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45  E_INVALID_PARAME
3370: 54 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TER:....return("
3380: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
3390: 50 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63  PARAMETER");...c
33a0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
33b0: 4c 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72  LID_TARGET:....r
33c0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
33d0: 4e 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b  NVALID_TARGET");
33e0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
33f0: 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09  INVALID_VALUE:..
3400: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3410: 45 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22  E_INVALID_VALUE"
3420: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3430: 45 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09  E_NO_MEMORY:....
3440: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3450: 4e 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63  NO_MEMORY");...c
3460: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3470: 4f 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72  OWN_READER:....r
3480: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
3490: 4e 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b  NKNOWN_READER");
34a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
34b0: 54 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75  TIMEOUT:....retu
34c0: 72 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45  rn("SCARD_E_TIME
34d0: 4f 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43  OUT");...case SC
34e0: 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49  ARD_E_SHARING_VI
34f0: 4f 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  OLATION:....retu
3500: 72 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52  rn("SCARD_E_SHAR
3510: 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b  ING_VIOLATION");
3520: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3530: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09  NO_SMARTCARD:...
3540: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3550: 5f 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b  _NO_SMARTCARD");
3560: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3570: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09  UNKNOWN_CARD:...
3580: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
3590: 5f 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b  _UNKNOWN_CARD");
35a0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
35b0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a  PROTO_MISMATCH:.
35c0: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
35d0: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
35e0: 48 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  H");...case SCAR
35f0: 44 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09  D_E_NOT_READY:..
3600: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3610: 45 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09  E_NOT_READY");..
3620: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59  .case SCARD_E_SY
3630: 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a  STEM_CANCELLED:.
3640: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3650: 5f 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c  _E_SYSTEM_CANCEL
3660: 4c 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  LED");...case SC
3670: 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41  ARD_E_NOT_TRANSA
3680: 43 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CTED:....return(
3690: 22 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41  "SCARD_E_NOT_TRA
36a0: 4e 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73  NSACTED");...cas
36b0: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
36c0: 5f 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09  _UNAVAILABLE:...
36d0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
36e0: 5f 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41  _READER_UNAVAILA
36f0: 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43  BLE");...case SC
3700: 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45  ARD_W_UNSUPPORTE
3710: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
3720: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50  n("SCARD_W_UNSUP
3730: 50 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09  PORTED_CARD");..
3740: 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e  .case SCARD_W_UN
3750: 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a  RESPONSIVE_CARD:
3760: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3770: 44 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45  D_W_UNRESPONSIVE
3780: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3790: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
37a0: 44 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  D_CARD:....retur
37b0: 6e 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  n("SCARD_W_UNPOW
37c0: 45 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63  ERED_CARD");...c
37d0: 61 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45  ase SCARD_W_RESE
37e0: 54 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72  T_CARD:....retur
37f0: 6e 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54  n("SCARD_W_RESET
3800: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3810: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
3820: 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  CARD:....return(
3830: 22 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44  "SCARD_W_REMOVED
3840: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
3850: 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f  SCARD_E_PCI_TOO_
3860: 53 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e  SMALL:....return
3870: 28 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f  ("SCARD_E_PCI_TO
3880: 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73  O_SMALL");...cas
3890: 65 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52  e SCARD_E_READER
38a0: 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09  _UNSUPPORTED:...
38b0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
38c0: 5f 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52  _READER_UNSUPPOR
38d0: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
38e0: 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f  ARD_E_DUPLICATE_
38f0: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
3900: 6e 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49  n("SCARD_E_DUPLI
3910: 43 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09  CATE_READER");..
3920: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
3930: 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a  RD_UNSUPPORTED:.
3940: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3950: 5f 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52  _E_CARD_UNSUPPOR
3960: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
3970: 41 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45  ARD_E_NO_SERVICE
3980: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3990: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22  RD_E_NO_SERVICE"
39a0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
39b0: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
39c0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  D:....return("SC
39d0: 41 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54  ARD_E_SERVICE_ST
39e0: 4f 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20  OPPED");...case 
39f0: 53 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52  SCARD_E_UNSUPPOR
3a00: 54 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09  TED_FEATURE:....
3a10: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3a20: 55 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54  UNSUPPORTED_FEAT
3a30: 55 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43  URE");.#ifdef SC
3a40: 41 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43  ARD_W_INSERTED_C
3a50: 41 52 44 0a 09 09 63 61 73 65 20 53 43 41 52 44  ARD...case SCARD
3a60: 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44  _W_INSERTED_CARD
3a70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a80: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
3a90: 52 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  RD");.#endif.#if
3aa0: 64 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  def SCARD_E_NO_R
3ab0: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
3ac0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3ad0: 4e 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c  NO_READERS_AVAIL
3ae0: 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABLE:....return(
3af0: 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44  "SCARD_E_NO_READ
3b00: 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b  ERS_AVAILABLE");
3b10: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74  .#endif..}...ret
3b20: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3b30: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3b40: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3b50: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
3b60: 5f 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62  _STR(uint16_t ob
3b70: 6a 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28  jid) {..switch (
3b80: 6f 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20  objid) {...case 
3b90: 30 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x2000:....retur
3ba0: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3bb0: 4a 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22  JID_GENERALINFO"
3bc0: 29 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 30  );...case 0x2100
3bd0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3be0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
3bf0: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b  OPERSONALINFO");
3c00: 0a 09 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a  ...case 0x3000:.
3c10: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3c20: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
3c30: 53 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63  SSCONTROL");...c
3c40: 61 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72  ase 0x4000:....r
3c50: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c60: 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b  V_OBJID_LOGIN");
3c70: 0a 09 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a  ...case 0x5000:.
3c80: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3c90: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44  Y_TLV_OBJID_CARD
3ca0: 49 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30  INFO");...case 0
3cb0: 78 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x6000:....return
3cc0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3cd0: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b  ID_BIOMETRICS");
3ce0: 0a 09 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a  ...case 0x7000:.
3cf0: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d00: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49  Y_TLV_OBJID_DIGI
3d10: 54 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09  TALSIGCERT");...
3d20: 63 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09  case 0x0200:....
3d30: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3d40: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d50: 53 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78  SON");...case 0x
3d60: 30 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  0202:....return(
3d70: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3d80: 44 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29  D_CAC_BENEFITS")
3d90: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 3a  ;...case 0x0203:
3da0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3db0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3dc0: 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 29  _OTHERBENEFITS")
3dd0: 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 3a  ;...case 0x0201:
3de0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3df0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
3e00: 5f 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09  _PERSONNEL");...
3e10: 63 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09  case 0x02FE:....
3e20: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3e30: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49  LV_OBJID_CAC_PKI
3e40: 43 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65  CERT");..}....re
3e50: 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b  turn("UNKNOWN");
3e60: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
3e70: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
3e80: 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45  BUG_FUNC_APPTYPE
3e90: 5f 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20  _TO_STR(uint8_t 
3ea0: 61 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74  apptype) {..swit
3eb0: 63 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09  ch (apptype) {..
3ec0: 09 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72  .case 0x00:....r
3ed0: 65 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09  eturn("NONE");..
3ee0: 09 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72  .case 0x01:....r
3ef0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f00: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b  V_APP_GENERIC");
3f10: 0a 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09  ...case 0x02:...
3f20: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3f30: 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09  TLV_APP_SKI");..
3f40: 09 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72  .case 0x03:....r
3f50: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3f60: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20  V_APP_GENERIC | 
3f70: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53  CACKEY_TLV_APP_S
3f80: 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  KI");...case 0x0
3f90: 34 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  4:....return("CA
3fa0: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49  CKEY_TLV_APP_PKI
3fb0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a  ");...case 0x05:
3fc0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3fd0: 45 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52  EY_TLV_APP_GENER
3fe0: 49 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f  IC | CACKEY_TLV_
3ff0: 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73  APP_PKI");...cas
4000: 65 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72  e 0x06:....retur
4010: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
4020: 50 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54  P_SKI | CACKEY_T
4030: 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09  LV_APP_PKI");...
4040: 63 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65  case 0x07:....re
4050: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
4060: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
4070: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
4080: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
4090: 50 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72  PP_PKI");..}...r
40a0: 65 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29  eturn("INVALID")
40b0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
40c0: 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44  t char *CACKEY_D
40d0: 45 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42  EBUG_FUNC_ATTRIB
40e0: 55 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54  UTE_TO_STR(CK_AT
40f0: 54 52 49 42 55 54 45 5f 54 59 50 45 20 61 74 74  TRIBUTE_TYPE att
4100: 72 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74  r) {..switch (at
4110: 74 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41  tr) {...case CKA
4120: 5f 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72  _CLASS:....retur
4130: 6e 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a  n("CKA_CLASS");.
4140: 09 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e  ..case CKA_TOKEN
4150: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4160: 5f 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65  _TOKEN");...case
4170: 20 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09   CKA_PRIVATE:...
4180: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49  .return("CKA_PRI
4190: 56 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43  VATE");...case C
41a0: 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74  KA_LABEL:....ret
41b0: 75 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29  urn("CKA_LABEL")
41c0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50  ;...case CKA_APP
41d0: 4c 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74  LICATION:....ret
41e0: 75 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41  urn("CKA_APPLICA
41f0: 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43  TION");...case C
4200: 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74  KA_VALUE:....ret
4210: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29  urn("CKA_VALUE")
4220: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a  ;...case CKA_OBJ
4230: 45 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72  ECT_ID:....retur
4240: 6e 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44  n("CKA_OBJECT_ID
4250: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43  ");...case CKA_C
4260: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a  ERTIFICATE_TYPE:
4270: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4280: 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45  CERTIFICATE_TYPE
4290: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49  ");...case CKA_I
42a0: 53 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  SSUER:....return
42b0: 28 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a  ("CKA_ISSUER");.
42c0: 09 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41  ..case CKA_SERIA
42d0: 4c 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74  L_NUMBER:....ret
42e0: 75 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f  urn("CKA_SERIAL_
42f0: 4e 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65  NUMBER");...case
4300: 20 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a   CKA_AC_ISSUER:.
4310: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
4320: 43 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  C_ISSUER");...ca
4330: 73 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09  se CKA_OWNER:...
4340: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e  .return("CKA_OWN
4350: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4360: 5f 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09  _ATTR_TYPES:....
4370: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52  return("CKA_ATTR
4380: 5f 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65  _TYPES");...case
4390: 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09   CKA_TRUSTED:...
43a0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55  .return("CKA_TRU
43b0: 53 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43  STED");...case C
43c0: 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
43d0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f  return("CKA_KEY_
43e0: 54 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TYPE");...case C
43f0: 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72  KA_SUBJECT:....r
4400: 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45  eturn("CKA_SUBJE
4410: 43 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  CT");...case CKA
4420: 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  _ID:....return("
4430: 43 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65  CKA_ID");...case
4440: 20 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a   CKA_SENSITIVE:.
4450: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4460: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4470: 73 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a  se CKA_ENCRYPT:.
4480: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45  ...return("CKA_E
4490: 4e 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65  NCRYPT");...case
44a0: 20 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09   CKA_DECRYPT:...
44b0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43  .return("CKA_DEC
44c0: 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43  RYPT");...case C
44d0: 4b 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75  KA_WRAP:....retu
44e0: 72 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a  rn("CKA_WRAP");.
44f0: 09 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41  ..case CKA_UNWRA
4500: 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  P:....return("CK
4510: 41 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61  A_UNWRAP");...ca
4520: 73 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09  se CKA_SIGN:....
4530: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
4540: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4550: 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09  IGN_RECOVER:....
4560: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e  return("CKA_SIGN
4570: 5f 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61  _RECOVER");...ca
4580: 73 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09  se CKA_VERIFY:..
4590: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
45a0: 52 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43  RIFY");...case C
45b0: 4b 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45  KA_VERIFY_RECOVE
45c0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
45d0: 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52  A_VERIFY_RECOVER
45e0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44  ");...case CKA_D
45f0: 45 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e  ERIVE:....return
4600: 28 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a  ("CKA_DERIVE");.
4610: 09 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54  ..case CKA_START
4620: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
4630: 28 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45  ("CKA_START_DATE
4640: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4650: 4e 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75  ND_DATE:....retu
4660: 72 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45  rn("CKA_END_DATE
4670: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d  ");...case CKA_M
4680: 4f 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72  ODULUS:....retur
4690: 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29  n("CKA_MODULUS")
46a0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44  ;...case CKA_MOD
46b0: 55 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65  ULUS_BITS:....re
46c0: 74 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55  turn("CKA_MODULU
46d0: 53 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65  S_BITS");...case
46e0: 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
46f0: 4e 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  NENT:....return(
4700: 22 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f  "CKA_PUBLIC_EXPO
4710: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
4720: 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e  KA_PRIVATE_EXPON
4730: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
4740: 43 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f  CKA_PRIVATE_EXPO
4750: 4e 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43  NENT");...case C
4760: 4b 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72  KA_PRIME_1:....r
4770: 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45  eturn("CKA_PRIME
4780: 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  _1");...case CKA
4790: 5f 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74  _PRIME_2:....ret
47a0: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32  urn("CKA_PRIME_2
47b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
47c0: 58 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65  XPONENT_1:....re
47d0: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
47e0: 4e 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_1");...case C
47f0: 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09  KA_EXPONENT_2:..
4800: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58  ..return("CKA_EX
4810: 50 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61  PONENT_2");...ca
4820: 73 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45  se CKA_COEFFICIE
4830: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
4840: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29  KA_COEFFICIENT")
4850: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
4860: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ME:....return("C
4870: 4b 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  KA_PRIME");...ca
4880: 73 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a  se CKA_SUBPRIME:
4890: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
48a0: 53 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61  SUBPRIME");...ca
48b0: 73 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09  se CKA_BASE:....
48c0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45  return("CKA_BASE
48d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
48e0: 52 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  RIME_BITS:....re
48f0: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
4900: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
4910: 4b 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54  KA_SUB_PRIME_BIT
4920: 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  S:....return("CK
4930: 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53  A_SUB_PRIME_BITS
4940: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4950: 41 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65  ALUE_BITS:....re
4960: 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f  turn("CKA_VALUE_
4970: 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43  BITS");...case C
4980: 4b 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09  KA_VALUE_LEN:...
4990: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c  .return("CKA_VAL
49a0: 55 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65  UE_LEN");...case
49b0: 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
49c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
49d0: 5f 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a  _EXTRACTABLE");.
49e0: 09 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c  ..case CKA_LOCAL
49f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4a00: 5f 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65  _LOCAL");...case
4a10: 20 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41   CKA_NEVER_EXTRA
4a20: 43 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72  CTABLE:....retur
4a30: 6e 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54  n("CKA_NEVER_EXT
4a40: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
4a50: 73 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45  se CKA_ALWAYS_SE
4a60: 4e 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75  NSITIVE:....retu
4a70: 72 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53  rn("CKA_ALWAYS_S
4a80: 45 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61  ENSITIVE");...ca
4a90: 73 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d  se CKA_KEY_GEN_M
4aa0: 45 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74  ECHANISM:....ret
4ab0: 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e  urn("CKA_KEY_GEN
4ac0: 5f 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09  _MECHANISM");...
4ad0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41  case CKA_MODIFIA
4ae0: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
4af0: 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29  CKA_MODIFIABLE")
4b00: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44  ;...case CKA_ECD
4b10: 53 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65  SA_PARAMS:....re
4b20: 74 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f  turn("CKA_ECDSA_
4b30: 50 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65  PARAMS");...case
4b40: 20 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09   CKA_EC_POINT:..
4b50: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43  ..return("CKA_EC
4b60: 5f 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65  _POINT");...case
4b70: 20 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41   CKA_SECONDARY_A
4b80: 55 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  UTH:....return("
4b90: 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55  CKA_SECONDARY_AU
4ba0: 54 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TH");...case CKA
4bb0: 5f 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a  _AUTH_PIN_FLAGS:
4bc0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4bd0: 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29  AUTH_PIN_FLAGS")
4be0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f  ;...case CKA_HW_
4bf0: 46 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09  FEATURE_TYPE:...
4c00: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f  .return("CKA_HW_
4c10: 46 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a  FEATURE_TYPE");.
4c20: 09 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54  ..case CKA_RESET
4c30: 5f 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74  _ON_INIT:....ret
4c40: 75 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f  urn("CKA_RESET_O
4c50: 4e 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65  N_INIT");...case
4c60: 20 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a   CKA_HAS_RESET:.
4c70: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48  ...return("CKA_H
4c80: 41 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61  AS_RESET");...ca
4c90: 73 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45  se CKA_VENDOR_DE
4ca0: 46 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e  FINED:....return
4cb0: 28 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46  ("CKA_VENDOR_DEF
4cc0: 49 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74  INED");..}...ret
4cd0: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
4ce0: 7d 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c  }..#  define mal
4cf0: 6c 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45  loc(x) CACKEY_DE
4d00: 42 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28  BUG_FUNC_MALLOC(
4d10: 78 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c  x, __func__, __L
4d20: 49 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65  INE__).#  define
4d30: 20 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43   realloc(x, y) C
4d40: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4d50: 5f 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f  _REALLOC(x, y, _
4d60: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4d70: 5f 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64  _).#  ifdef strd
4d80: 75 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74  up.#    undef st
4d90: 72 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20  rdup.#  endif.# 
4da0: 20 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78   define strdup(x
4db0: 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  ) CACKEY_DEBUG_F
4dc0: 55 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f  UNC_STRDUP(x, __
4dd0: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
4de0: 29 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  ).#else.#  defin
4df0: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  e CACKEY_DEBUG_P
4e00: 52 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f  RINTF(x...) /**/
4e10: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4e20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
4e30: 28 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23  (f, x, y) /**/.#
4e40: 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f    define CACKEY_
4e50: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
4e60: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4e70: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4e80: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4e90: 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
4ea0: 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f  O_STR(x) "DEBUG_
4eb0: 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66  DISABLED".#  def
4ec0: 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47  ine CACKEY_DEBUG
4ed0: 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
4ee0: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4ef0: 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65  ABLED".#  define
4f00: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4f10: 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54  NC_APPTYPE_TO_ST
4f20: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4f30: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
4f40: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4f50: 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53  C_ATTRIBUTE_TO_S
4f60: 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53  TR(x) "DEBUG_DIS
4f70: 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 74  ABLED".#endif..t
4f80: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
4f90: 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
4fa0: 43 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59  C,..CACKEY_ID_TY
4fb0: 50 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f  PE_PIV,..CACKEY_
4fc0: 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
4fd0: 59 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  Y.} cackey_pcsc_
4fe0: 69 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75 63 74  id_type;..struct
4ff0: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
5000: 6e 74 69 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f  ntity {..cackey_
5010: 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f  pcsc_id_type id_
5020: 74 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63  type;...size_t c
5030: 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a  ertificate_len;.
5040: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
5050: 63 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73  certificate;...s
5060: 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a  size_t keysize;.
5070: 0a 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75  ..union {...stru
5080: 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64  ct {....unsigned
5090: 20 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b   char applet[7];
50a0: 0a 09 09 09 75 69 6e 74 31 36 5f 74 20 66 69 6c  ....uint16_t fil
50b0: 65 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73  e;...} cac;....s
50c0: 74 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67  truct {....unsig
50d0: 6e 65 64 20 63 68 61 72 20 6b 65 79 5f 69 64 3b  ned char key_id;
50e0: 0a 09 09 09 63 68 61 72 20 6c 61 62 65 6c 5b 33  ....char label[3
50f0: 32 5d 3b 0a 09 09 7d 20 70 69 76 3b 0a 09 7d 20  2];...} piv;..} 
5100: 63 61 72 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74  card;.};..struct
5110: 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
5120: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
5130: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
5140: 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a  *pcsc_identity;.
5150: 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
5160: 61 74 74 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f  attributes;..CK_
5170: 55 4c 4f 4e 47 20 61 74 74 72 69 62 75 74 65 73  ULONG attributes
5180: 5f 63 6f 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75  _count;.};..stru
5190: 63 74 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ct cackey_sessio
51a0: 6e 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  n {..int active;
51b0: 0a 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ...CK_SLOT_ID sl
51c0: 6f 74 49 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45  otID;...CK_STATE
51d0: 20 73 74 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47   state;..CK_FLAG
51e0: 53 20 66 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f  S flags;..CK_ULO
51f0: 4e 47 20 75 6c 44 65 76 69 63 65 45 72 72 6f 72  NG ulDeviceError
5200: 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  ;..CK_VOID_PTR p
5210: 41 70 70 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b  Application;..CK
5220: 5f 4e 4f 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a  _NOTIFY Notify;.
5230: 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5240: 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
5250: 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ties;..unsigned 
5260: 6c 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f  long identities_
5270: 63 6f 75 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61  count;...int sea
5280: 72 63 68 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  rch_active;..CK_
5290: 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 73 65  ATTRIBUTE_PTR se
52a0: 61 72 63 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f  arch_query;..CK_
52b0: 55 4c 4f 4e 47 20 73 65 61 72 63 68 5f 71 75 65  ULONG search_que
52c0: 72 79 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67  ry_count;..unsig
52d0: 6e 65 64 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f  ned long search_
52e0: 63 75 72 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73  curr_id;...int s
52f0: 69 67 6e 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f  ign_active;..CK_
5300: 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 73  MECHANISM_TYPE s
5310: 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ign_mechanism;..
5320: 43 4b 5f 42 59 54 45 5f 50 54 52 20 73 69 67 6e  CK_BYTE_PTR sign
5330: 5f 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20  _buf;..unsigned 
5340: 6c 6f 6e 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e  long sign_buflen
5350: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
5360: 20 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09   sign_bufused;..
5370: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
5380: 65 6e 74 69 74 79 20 2a 73 69 67 6e 5f 69 64 65  entity *sign_ide
5390: 6e 74 69 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63  ntity;...int dec
53a0: 72 79 70 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b  rypt_active;..CK
53b0: 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20  _MECHANISM_TYPE 
53c0: 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
53d0: 6d 3b 0a 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20  m;..CK_VOID_PTR 
53e0: 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72  decrypt_mech_par
53f0: 6d 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63  m;..CK_ULONG dec
5400: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65  rypt_mech_parmle
5410: 6e 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65  n;..struct cacke
5420: 79 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 63 72  y_identity *decr
5430: 79 70 74 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b  ypt_identity;.};
5440: 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5450: 73 6c 6f 74 20 7b 0a 09 69 6e 74 20 61 63 74 69  slot {..int acti
5460: 76 65 3b 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61  ve;..int interna
5470: 6c 3b 0a 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  l;...char *pcsc_
5480: 72 65 61 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63  reader;...int pc
5490: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
54a0: 64 3b 0a 09 53 43 41 52 44 48 41 4e 44 4c 45 20  d;..SCARDHANDLE 
54b0: 70 63 73 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74  pcsc_card;...int
54c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70   transaction_dep
54d0: 74 68 3b 0a 09 69 6e 74 20 74 72 61 6e 73 61 63  th;..int transac
54e0: 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63  tion_need_hw_loc
54f0: 6b 3b 0a 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65  k;...int slot_re
5500: 73 65 74 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20  set;...CK_FLAGS 
5510: 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75  token_flags;...u
5520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61  nsigned char *la
5530: 62 65 6c 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f  bel;...DWORD pro
5540: 74 6f 63 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65  tocol;...unsigne
5550: 64 20 69 6e 74 20 63 61 63 68 65 64 5f 63 65 72  d int cached_cer
5560: 74 73 5f 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63  ts_count;..struc
5570: 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64  t cackey_pcsc_id
5580: 65 6e 74 69 74 79 20 2a 63 61 63 68 65 64 5f 63  entity *cached_c
5590: 65 72 74 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65  erts;.};..typede
55a0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
55b0: 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43  _TLV_APP_GENERIC
55c0: 20 3d 20 30 78 30 31 2c 0a 09 43 41 43 4b 45 59   = 0x01,..CACKEY
55d0: 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 20 20 20  _TLV_APP_SKI    
55e0: 20 3d 20 30 78 30 32 2c 0a 09 43 41 43 4b 45 59   = 0x02,..CACKEY
55f0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 20 20 20 20  _TLV_APP_PKI    
5600: 20 3d 20 30 78 30 34 0a 7d 20 63 61 63 6b 65 79   = 0x04.} cackey
5610: 5f 74 6c 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74  _tlv_apptype;..t
5620: 79 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43  ypedef enum {..C
5630: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
5640: 47 45 4e 45 52 41 4c 49 4e 46 4f 20 20 20 20 20  GENERALINFO     
5650: 20 20 3d 20 30 78 32 30 30 30 2c 0a 09 43 41 43    = 0x2000,..CAC
5660: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52  KEY_TLV_OBJID_PR
5670: 4f 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20  OPERSONALINFO   
5680: 3d 20 30 78 32 31 30 30 2c 0a 09 43 41 43 4b 45  = 0x2100,..CACKE
5690: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45  Y_TLV_OBJID_ACCE
56a0: 53 53 43 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20  SSCONTROL     = 
56b0: 30 78 33 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x3000,..CACKEY_
56c0: 54 4c 56 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20  TLV_OBJID_LOGIN 
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 78              = 0x
56e0: 34 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  4000,..CACKEY_TL
56f0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
5700: 20 20 20 20 20 20 20 20 20 20 3d 20 30 78 35 30            = 0x50
5710: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5720: 4f 42 4a 49 44 5f 42 49 4f 4d 45 54 52 49 43 53  OBJID_BIOMETRICS
5730: 20 20 20 20 20 20 20 20 3d 20 30 78 36 30 30 30          = 0x6000
5740: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5750: 4a 49 44 5f 44 49 47 49 54 41 4c 53 49 47 43 45  JID_DIGITALSIGCE
5760: 52 54 20 20 20 20 3d 20 30 78 37 30 30 30 2c 0a  RT    = 0x7000,.
5770: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
5780: 44 5f 43 41 43 5f 50 45 52 53 4f 4e 20 20 20 20  D_CAC_PERSON    
5790: 20 20 20 20 3d 20 30 78 30 32 30 30 2c 0a 09 43      = 0x0200,..C
57a0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
57b0: 43 41 43 5f 42 45 4e 45 46 49 54 53 20 20 20 20  CAC_BENEFITS    
57c0: 20 20 3d 20 30 78 30 32 30 32 2c 0a 09 43 41 43    = 0x0202,..CAC
57d0: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
57e0: 43 5f 4f 54 48 45 52 42 45 4e 45 46 49 54 53 20  C_OTHERBENEFITS 
57f0: 3d 20 30 78 30 32 30 33 2c 0a 09 43 41 43 4b 45  = 0x0203,..CACKE
5800: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
5810: 50 45 52 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20  PERSONNEL     = 
5820: 30 78 30 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f  0x0201,..CACKEY_
5830: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b  TLV_OBJID_CAC_PK
5840: 49 43 45 52 54 20 20 20 20 20 20 20 3d 20 30 78  ICERT       = 0x
5850: 30 32 46 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  02FE.} cackey_tl
5860: 76 5f 6f 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70  v_objectid;..typ
5870: 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43  edef enum {..CAC
5880: 4b 45 59 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e  KEY_PCSC_S_TOKEN
5890: 50 52 45 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a  PRESENT    = 1,.
58a0: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  .CACKEY_PCSC_S_O
58b0: 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d  K              =
58c0: 20 30 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43   0,..CACKEY_PCSC
58d0: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 20 20  _E_GENERIC      
58e0: 20 20 20 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59     = -1,..CACKEY
58f0: 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 20 20  _PCSC_E_BADPIN  
5900: 20 20 20 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43          = -2,..C
5910: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
5920: 4b 45 44 20 20 20 20 20 20 20 20 20 20 3d 20 2d  KED          = -
5930: 33 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f  3,..CACKEY_PCSC_
5940: 45 5f 4e 45 45 44 4c 4f 47 49 4e 20 20 20 20 20  E_NEEDLOGIN     
5950: 20 20 3d 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f    = -4,..CACKEY_
5960: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
5970: 4e 54 20 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41  NT     = -6,..CA
5980: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
5990: 59 20 20 20 20 20 20 20 20 20 20 20 3d 20 2d 37  Y           = -7
59a0: 0a 7d 20 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a  .} cackey_ret;..
59b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
59c0: 76 5f 63 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73  v_cardurl {..uns
59d0: 69 67 6e 65 64 20 63 68 61 72 20 20 20 20 20 20  igned char      
59e0: 20 20 72 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65    rid[5];..cacke
59f0: 79 5f 74 6c 76 5f 61 70 70 74 79 70 65 20 20 20  y_tlv_apptype   
5a00: 61 70 70 74 79 70 65 3b 0a 09 63 61 63 6b 65 79  apptype;..cackey
5a10: 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f  _tlv_objectid  o
5a20: 62 6a 65 63 74 69 64 3b 0a 09 63 61 63 6b 65 79  bjectid;..cackey
5a30: 5f 74 6c 76 5f 6f 62 6a 65 63 74 69 64 20 20 61  _tlv_objectid  a
5a40: 70 70 69 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ppid;..unsigned 
5a50: 63 68 61 72 20 20 20 20 20 20 20 20 70 69 6e 69  char        pini
5a60: 64 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  d;.};..struct ca
5a70: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b  ckey_tlv_entity;
5a80: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5a90: 6c 76 5f 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e  lv_entity {..uin
5aa0: 74 38 5f 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f  t8_t tag;..size_
5ab0: 74 20 6c 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f  t length;...unio
5ac0: 6e 20 7b 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75  n {...void *valu
5ad0: 65 3b 0a 09 09 73 74 72 75 63 74 20 63 61 63 6b  e;...struct cack
5ae0: 65 79 5f 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a  ey_tlv_cardurl *
5af0: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09  value_cardurl;..
5b00: 09 75 69 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62  .uint8_t value_b
5b10: 79 74 65 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63  yte;..};...struc
5b20: 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74  t cackey_tlv_ent
5b30: 69 74 79 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a  ity *_next;.};..
5b40: 2f 2a 20 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c  /* CACKEY Global
5b50: 20 48 61 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74   Handles */.stat
5b60: 69 63 20 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f  ic void *cackey_
5b70: 62 69 67 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  biglock = NULL;.
5b80: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
5b90: 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 63 61 63  ckey_session cac
5ba0: 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38  key_sessions[128
5bb0: 5d 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  ];.static struct
5bc0: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63   cackey_slot cac
5bd0: 6b 65 79 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a  key_slots[128];.
5be0: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
5bf0: 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
5c00: 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61  0;.static int ca
5c10: 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69  ckey_biglock_ini
5c20: 74 20 3d 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54  t = 0;.CK_C_INIT
5c30: 49 41 4c 49 5a 45 5f 41 52 47 53 20 63 61 63 6b  IALIZE_ARGS cack
5c40: 65 79 5f 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78  ey_args;../** Ex
5c50: 74 72 61 20 63 65 72 74 69 66 69 63 61 74 65 73  tra certificates
5c60: 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74   to include in t
5c70: 6f 6b 65 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20  oken **/.struct 
5c80: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
5c90: 74 69 74 79 20 65 78 74 72 61 5f 63 65 72 74 73  tity extra_certs
5ca0: 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20  [] = {.#include 
5cb0: 22 63 61 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f  "cackey_builtin_
5cc0: 63 65 72 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20  certs.h".};../* 
5cd0: 50 43 53 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64  PCSC Global Hand
5ce0: 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50  les */.static LP
5cf0: 53 43 41 52 44 43 4f 4e 54 45 58 54 20 63 61 63  SCARDCONTEXT cac
5d00: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
5d10: 3d 20 4e 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20  = NULL;..static 
5d20: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61  unsigned long ca
5d30: 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
5d40: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20  void) {..static 
5d50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65  unsigned long re
5d60: 74 76 61 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73  tval = 255;..uns
5d70: 69 67 6e 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72  igned long major
5d80: 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20   = 0;..unsigned 
5d90: 6c 6f 6e 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a  long minor = 0;.
5da0: 09 63 68 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72  .char *major_str
5db0: 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a   = NULL;..char *
5dc0: 6d 69 6e 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c  minor_str = NULL
5dd0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
5de0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
5df0: 22 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ");...if (retval
5e00: 20 21 3d 20 32 35 35 29 20 7b 0a 09 09 43 41 43   != 255) {...CAC
5e10: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
5e20: 28 22 52 65 74 75 72 6e 69 6e 67 20 30 78 25 6c  ("Returning 0x%l
5e30: 78 20 28 63 61 63 68 65 64 29 2e 22 2c 20 72 65  x (cached).", re
5e40: 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e  tval);....return
5e50: 28 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72  (retval);..}...r
5e60: 65 74 76 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64  etval = 0;..#ifd
5e70: 65 66 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ef PACKAGE_VERSI
5e80: 4f 4e 0a 20 20 20 20 20 20 20 20 6d 61 6a 6f 72  ON.        major
5e90: 5f 73 74 72 20 3d 20 50 41 43 4b 41 47 45 5f 56  _str = PACKAGE_V
5ea0: 45 52 53 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a  ERSION;..if (maj
5eb0: 6f 72 5f 73 74 72 29 20 7b 0a 09 20 20 20 20 20  or_str) {..     
5ec0: 20 20 20 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f     major = strto
5ed0: 75 6c 28 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d  ul(major_str, &m
5ee0: 69 6e 6f 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a  inor_str, 10);..
5ef0: 09 09 69 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29  ..if (minor_str)
5f00: 20 7b 0a 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74   {....minor = st
5f10: 72 74 6f 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20  rtoul(minor_str 
5f20: 2b 20 31 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a  + 1, NULL, 10);.
5f30: 09 09 7d 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20  ..}..}...retval 
5f40: 3d 20 28 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20  = (major << 16) 
5f50: 7c 20 28 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a  | (minor << 8);.
5f60: 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
5f70: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
5f80: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20  turning 0x%lx", 
5f90: 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
5fa0: 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a  n(retval);.}../*
5fb0: 20 50 43 2f 53 43 20 52 65 6c 61 74 65 64 20 46   PC/SC Related F
5fc0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20  unctions */./*. 
5fd0: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
5fe0: 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c    void cackey_sl
5ff0: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6000: 6c 6c 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20  ll(void);. *. * 
6010: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
6020: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
6030: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
6040: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
6050: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
6060: 63 74 69 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74  ction disconnect
6070: 73 20 66 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73  s from all cards
6080: 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  .. *. */.static 
6090: 76 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74  void cackey_slot
60a0: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
60b0: 28 76 6f 69 64 29 20 7b 0a 09 75 69 6e 74 33 32  (void) {..uint32
60c0: 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  _t idx;...CACKEY
60d0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
60e0: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20  alled.");...for 
60f0: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
6100: 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
6110: 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
6120: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
6130: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
6140: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
6150: 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  x].internal) {..
6160: 09 09 2f 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e  ../* Skip intern
6170: 61 6c 20 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63  al slots */....c
6180: 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09  ontinue;...}....
6190: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
61a0: 5b 69 64 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f  [idx].pcsc_card_
61b0: 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 09  connected) {....
61c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
61d0: 4e 54 46 28 22 53 43 61 72 64 44 69 73 63 6f 6e  NTF("SCardDiscon
61e0: 6e 65 63 74 28 25 6c 75 29 20 63 61 6c 6c 65 64  nect(%lu) called
61f0: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
6200: 67 29 20 69 64 78 29 3b 0a 0a 09 09 09 53 43 61  g) idx);.....SCa
6210: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 63 61 63  rdDisconnect(cac
6220: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
6230: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
6240: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d  LEAVE_CARD);...}
6250: 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
6260: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29  lots[idx].label)
6270: 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65   {....free(cacke
6280: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62  y_slots[idx].lab
6290: 65 6c 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  el);.....cackey_
62a0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c  slots[idx].label
62b0: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09   = NULL;...}....
62c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
62d0: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
62e0: 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 63 61 63  ected = 0;...cac
62f0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
6300: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
6310: 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
6320: 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
6330: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
6340: 63 6b 20 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63  ck = 0;....if (c
6350: 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
6360: 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 41  .active) {....CA
6370: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6380: 46 28 22 4d 61 72 6b 69 6e 67 20 61 63 74 69 76  F("Marking activ
6390: 65 20 73 6c 6f 74 20 25 6c 75 20 61 73 20 62 65  e slot %lu as be
63a0: 69 6e 67 20 72 65 73 65 74 22 2c 20 28 75 6e 73  ing reset", (uns
63b0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 78 29  igned long) idx)
63c0: 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f  ;...}....cackey_
63d0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f  slots[idx].slot_
63e0: 72 65 73 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09  reset = 1;..}...
63f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
6400: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 22 29  NTF("Returning")
6410: 3b 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;...return;.}../
6420: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
6430: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
6440: 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e  cackey_pcsc_conn
6450: 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a  ect(void);. *. *
6460: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6470: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6480: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6490: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
64a0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
64b0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
64c0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
64d0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
64e0: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
64f0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
6500: 6f 6e 6e 65 63 74 73 20 74 6f 20 74 68 65 20 50  onnects to the P
6510: 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20  C/SC Connection 
6520: 4d 61 6e 61 67 65 72 20 61 6e 64 20 75 70 64 61  Manager and upda
6530: 74 65 73 20 74 68 65 0a 20 2a 20 20 20 20 20 67  tes the. *     g
6540: 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a  lobal handle.. *
6550: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
6560: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 70 63  ey_ret cackey_pc
6570: 73 63 5f 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29  sc_connect(void)
6580: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65   {..LONG scard_e
6590: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a  st_context_ret;.
65a0: 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52  #ifdef HAVE_SCAR
65b0: 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a  DISVALIDCONTEXT.
65c0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 69 73 76 61  .LONG scard_isva
65d0: 6c 69 64 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a  lid_ret;.#endif.
65e0: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
65f0: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
6600: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
6610: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
6620: 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70  LL) {...cackey_p
6630: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c  csc_handle = mal
6640: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b  loc(sizeof(*cack
6650: 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 29  ey_pcsc_handle))
6660: 3b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
6670: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55  csc_handle == NU
6680: 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
6690: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
66a0: 6c 6c 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66  ll to malloc() f
66b0: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
66c0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
66d0: 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  ...cackey_slots_
66e0: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29  disconnect_all()
66f0: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
6700: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6710: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  IC);...}....CACK
6720: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6730: 22 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43  "SCardEstablishC
6740: 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c 65 64 22  ontext() called"
6750: 29 3b 0a 09 09 73 63 61 72 64 5f 65 73 74 5f 63  );...scard_est_c
6760: 6f 6e 74 65 78 74 5f 72 65 74 20 3d 20 53 43 61  ontext_ret = SCa
6770: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
6780: 78 74 28 53 43 41 52 44 5f 53 43 4f 50 45 5f 53  xt(SCARD_SCOPE_S
6790: 59 53 54 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  YSTEM, NULL, NUL
67a0: 4c 2c 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  L, cackey_pcsc_h
67b0: 61 6e 64 6c 65 29 3b 0a 09 09 69 66 20 28 73 63  andle);...if (sc
67c0: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
67d0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
67e0: 55 43 43 45 53 53 29 20 7b 0a 09 09 09 43 41 43  UCCESS) {....CAC
67f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6800: 28 22 43 61 6c 6c 20 74 6f 20 53 43 61 72 64 45  ("Call to SCardE
6810: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 20  stablishContext 
6820: 66 61 69 6c 65 64 20 28 72 65 74 75 72 6e 65 64  failed (returned
6830: 20 25 73 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e   %s/%li), return
6840: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 2c  ing in failure",
6850: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
6860: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
6870: 54 52 28 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e  TR(scard_est_con
6880: 74 65 78 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  text_ret), (long
6890: 29 20 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ) scard_est_cont
68a0: 65 78 74 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72  ext_ret);.....fr
68b0: 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ee(cackey_pcsc_h
68c0: 61 6e 64 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65  andle);....cacke
68d0: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
68e0: 4e 55 4c 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79  NULL;.....cackey
68f0: 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
6900: 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74  t_all();.....ret
6910: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6920: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a  E_GENERIC);...}.
6930: 09 7d 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  .}..#ifdef HAVE_
6940: 53 43 41 52 44 49 53 56 41 4c 49 44 43 4f 4e 54  SCARDISVALIDCONT
6950: 45 58 54 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  EXT..CACKEY_DEBU
6960: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 49  G_PRINTF("SCardI
6970: 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 29 20  sValidContext() 
6980: 63 61 6c 6c 65 64 22 29 3b 0a 09 73 63 61 72 64  called");..scard
6990: 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 3d 20 53  _isvalid_ret = S
69a0: 43 61 72 64 49 73 56 61 6c 69 64 43 6f 6e 74 65  CardIsValidConte
69b0: 78 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  xt(*cackey_pcsc_
69c0: 68 61 6e 64 6c 65 29 3b 0a 09 69 66 20 28 73 63  handle);..if (sc
69d0: 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 20  ard_isvalid_ret 
69e0: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
69f0: 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  SS) {...CACKEY_D
6a00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48 61 6e  EBUG_PRINTF("Han
6a10: 64 6c 65 20 68 61 73 20 62 65 63 6f 6d 65 20 69  dle has become i
6a20: 6e 76 61 6c 69 64 20 28 53 43 61 72 64 49 73 56  nvalid (SCardIsV
6a30: 61 6c 69 64 43 6f 6e 74 65 78 74 20 3d 20 25 73  alidContext = %s
6a40: 2f 25 6c 69 29 2c 20 74 72 79 69 6e 67 20 74 6f  /%li), trying to
6a50: 20 72 65 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e   re-establish...
6a60: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
6a70: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
6a80: 5f 53 54 52 28 73 63 61 72 64 5f 69 73 76 61 6c  _STR(scard_isval
6a90: 69 64 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  id_ret), (long) 
6aa0: 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72 65  scard_isvalid_re
6ab0: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
6ac0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
6ad0: 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78  dEstablishContex
6ae0: 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09  t() called");...
6af0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
6b00: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73 74  t_ret = SCardEst
6b10: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53 43  ablishContext(SC
6b20: 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d  ARD_SCOPE_SYSTEM
6b30: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61  , NULL, NULL, ca
6b40: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6b50: 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f 65  );...if (scard_e
6b60: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20 21  st_context_ret !
6b70: 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
6b80: 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  S) {....CACKEY_D
6b90: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6ba0: 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62 6c  l to SCardEstabl
6bb0: 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c 65  ishContext faile
6bc0: 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f 25  d (returned %s/%
6bd0: 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  li), returning i
6be0: 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43 4b  n failure", CACK
6bf0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
6c00: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
6c10: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6c20: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
6c30: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6c40: 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63 61  et);.....free(ca
6c50: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6c60: 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63 73  );....cackey_pcs
6c70: 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b  c_handle = NULL;
6c80: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6c90: 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c  s_disconnect_all
6ca0: 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ();.....return(C
6cb0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
6cc0: 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41  ERIC);...}....CA
6cd0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6ce0: 46 28 22 48 61 6e 64 6c 65 20 68 61 73 20 62 65  F("Handle has be
6cf0: 65 6e 20 72 65 2d 65 73 74 61 62 6c 69 73 68 65  en re-establishe
6d00: 64 22 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a  d");..}.#endif..
6d10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
6d20: 49 4e 54 46 28 22 53 75 63 65 73 73 66 75 6c 6c  INTF("Sucessfull
6d30: 79 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50  y connected to P
6d40: 43 2f 53 43 2c 20 72 65 74 75 72 6e 69 6e 67 20  C/SC, returning 
6d50: 69 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09  in success");...
6d60: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
6d70: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
6d80: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
6d90: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
6da0: 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e  ckey_pcsc_discon
6db0: 6e 65 63 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20  nect(void);. *. 
6dc0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
6dd0: 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45     None. *. * RE
6de0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
6df0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
6e00: 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75  OK         On su
6e10: 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43  ccess. *     CAC
6e20: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
6e30: 49 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20  IC    On error. 
6e40: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
6e50: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
6e60: 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d  disconnects from
6e70: 20 74 68 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65   the PC/SC Conne
6e80: 63 74 69 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e  ction manager an
6e90: 64 20 75 70 64 61 74 65 73 0a 20 2a 20 20 20 20  d updates. *    
6ea0: 20 74 68 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64   the global hand
6eb0: 6c 65 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  le.. *. */.stati
6ec0: 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63  c cackey_ret cac
6ed0: 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e  key_pcsc_disconn
6ee0: 65 63 74 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e  ect(void) {..LON
6ef0: 47 20 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74  G scard_rel_cont
6f00: 65 78 74 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  ext_ret;...CACKE
6f10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6f20: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
6f30: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
6f40: 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  dle == NULL) {..
6f50: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6f60: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
6f70: 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78  scard_rel_contex
6f80: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 6c  t_ret = SCardRel
6f90: 65 61 73 65 43 6f 6e 74 65 78 74 28 2a 63 61 63  easeContext(*cac
6fa0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29  key_pcsc_handle)
6fb0: 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ;...if (cackey_p
6fc0: 63 73 63 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09  csc_handle) {...
6fd0: 66 72 65 65 28 63 61 63 6b 65 79 5f 70 63 73 63  free(cackey_pcsc
6fe0: 5f 68 61 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61  _handle);.....ca
6ff0: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7000: 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66   = NULL;..}...if
7010: 20 28 73 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74   (scard_rel_cont
7020: 65 78 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  ext_ret != SCARD
7030: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
7040: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7050: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
7060: 7d 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  }...return(CACKE
7070: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
7080: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
7090: 20 2a 20 20 20 20 20 76 6f 69 64 20 63 61 63 6b   *     void cack
70a0: 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
70b0: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
70c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a  _slot *slot);. *
70d0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
70e0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20       None. *. * 
70f0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
7100: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
7110: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
7120: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20   function marks 
7130: 61 20 73 6c 6f 74 20 68 61 73 20 68 61 76 69 6e  a slot has havin
7140: 67 20 62 65 65 6e 20 72 65 73 65 74 2c 20 74 6f  g been reset, to
7150: 20 6c 61 74 65 72 20 62 65 20 63 6c 65 61 6e 65   later be cleane
7160: 64 20 75 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65  d up.. *     Cle
7170: 61 6e 75 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e  anup only happen
7180: 73 20 77 68 65 6e 20 61 20 50 4b 43 53 23 31 31  s when a PKCS#11
7190: 20 63 6c 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f   client calls C_
71a0: 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e  FindObjectsInit.
71b0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
71c0: 6f 69 64 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  oid cackey_mark_
71d0: 73 6c 6f 74 5f 72 65 73 65 74 28 73 74 72 75 63  slot_reset(struc
71e0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
71f0: 6c 6f 74 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74  lot) {..if (slot
7200: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
7210: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  turn;..}...CACKE
7220: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7230: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
7240: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
7250: 5f 63 6f 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09  _connected) {...
7260: 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28  SCardDisconnect(
7270: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7280: 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52   SCARD_LEAVE_CAR
7290: 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73  D);..}...slot->s
72a0: 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09  lot_reset = 1;..
72b0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f  slot->pcsc_card_
72c0: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
72d0: 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67  slot->token_flag
72e0: 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
72f0: 51 55 49 52 45 44 3b 0a 0a 09 43 41 43 4b 45 59  QUIRED;...CACKEY
7300: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
7310: 65 74 75 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72  eturning.");...r
7320: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  eturn;.}../*. * 
7330: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
7340: 4c 4f 4e 47 20 63 61 63 6b 65 79 5f 72 65 63 6f  LONG cackey_reco
7350: 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75 63  nnect_card(struc
7360: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
7370: 6c 6f 74 2c 20 44 57 4f 52 44 20 64 65 66 61 75  lot, DWORD defau
7380: 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44  lt_protocol, LPD
7390: 57 4f 52 44 20 73 65 6c 65 63 74 65 64 5f 70 72  WORD selected_pr
73a0: 6f 74 6f 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41  otocol);. *. * A
73b0: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
73c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
73d0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
73e0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
73f0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
7400: 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72  DWORD default_pr
7410: 6f 74 6f 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20  otocol. *       
7420: 20 20 50 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74    Protocol to at
7430: 74 65 6d 70 74 20 66 69 72 73 74 0a 20 2a 0a 20  tempt first. *. 
7440: 2a 20 20 20 20 20 4c 50 44 57 4f 52 44 20 73 65  *     LPDWORD se
7450: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a  lected_protocol.
7460: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
7470: 20 50 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   Protocol select
7480: 65 64 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ed. *. * RETURN 
7490: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 65  VALUE. *     The
74a0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
74b0: 6f 6d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63  om SCardReconnec
74c0: 74 28 29 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  t(). *. * NOTES.
74d0: 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63   *     This func
74e0: 74 69 6f 6e 20 69 73 20 61 20 77 72 61 70 70 65  tion is a wrappe
74f0: 72 20 61 72 6f 75 6e 64 20 53 43 61 72 64 52 65  r around SCardRe
7500: 63 6f 6e 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20  connect(). *. * 
7510: 20 20 20 20 54 68 65 20 53 43 61 72 64 52 65 63      The SCardRec
7520: 6f 6e 6e 65 63 74 28 29 20 66 75 6e 63 74 69 6f  onnect() functio
7530: 6e 20 63 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63  n call will be c
7540: 61 6c 6c 65 64 20 66 69 72 73 74 20 77 69 74 68  alled first with
7550: 20 74 68 65 0a 20 2a 20 20 20 20 20 64 77 50 72   the. *     dwPr
7560: 65 66 65 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73  eferredProtocols
7570: 20 6f 66 20 22 64 65 66 61 75 6c 74 5f 70 72 6f   of "default_pro
7580: 74 6f 63 6f 6c 22 2e 20 20 49 66 20 74 68 61 74  tocol".  If that
7590: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a   call returns. *
75a0: 20 20 20 20 20 53 43 41 52 44 5f 45 5f 50 52 4f       SCARD_E_PRO
75b0: 54 4f 5f 4d 49 53 4d 41 54 43 48 20 74 72 79 20  TO_MISMATCH try 
75c0: 61 67 61 69 6e 20 77 69 74 68 20 61 20 70 72 6f  again with a pro
75d0: 74 6f 63 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e  tocol of T=0, an
75e0: 64 20 66 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20  d failing. *    
75f0: 20 74 68 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a   that T=1.. *. *
7600: 2f 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 63 61  /.static LONG ca
7610: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
7620: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7630: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57  y_slot *slot, DW
7640: 4f 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74  ORD default_prot
7650: 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65  ocol, LPDWORD se
7660: 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29  lected_protocol)
7670: 20 7b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63   {..LONG scard_c
7680: 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 73 63 61 72 64  onn_ret;...scard
7690: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
76a0: 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  dReconnect(slot-
76b0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
76c0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
76d0: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
76e0: 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41  , SCARD_RESET_CA
76f0: 52 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f  RD, selected_pro
7700: 74 6f 63 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63  tocol);...if (sc
7710: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
7720: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7730: 53 4d 41 54 43 48 29 20 7b 0a 09 09 43 41 43 4b  SMATCH) {...CACK
7740: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7750: 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28  "SCardReconnect(
7760: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
7770: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7780: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
7790: 75 73 74 20 54 3d 30 22 29 0a 09 09 73 63 61 72  ust T=0")...scar
77a0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61  d_conn_ret = SCa
77b0: 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  rdReconnect(slot
77c0: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
77d0: 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c  RD_SHARE_SHARED,
77e0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
77f0: 54 30 2c 20 53 43 41 52 44 5f 52 45 53 45 54 5f  T0, SCARD_RESET_
7800: 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f 70  CARD, selected_p
7810: 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20  rotocol);....if 
7820: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7830: 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  == SCARD_E_PROTO
7840: 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09  _MISMATCH) {....
7850: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7860: 4e 54 46 28 22 53 43 61 72 64 52 65 63 6f 6e 6e  NTF("SCardReconn
7870: 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20 53  ect() returned S
7880: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
7890: 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69  MATCH, trying wi
78a0: 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09  th just T=1")...
78b0: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
78c0: 3d 20 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  = SCardReconnect
78d0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
78e0: 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48  , SCARD_SHARE_SH
78f0: 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54  ARED, SCARD_PROT
7900: 4f 43 4f 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52  OCOL_T1, SCARD_R
7910: 45 53 45 54 5f 43 41 52 44 2c 20 73 65 6c 65 63  ESET_CARD, selec
7920: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  ted_protocol);..
7930: 09 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73  .}..}...return(s
7940: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a  card_conn_ret);.
7950: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
7960: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
7970: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  ret cackey_conne
7980: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
7990: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
79a0: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
79b0: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
79c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
79d0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
79e0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
79f0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
7a00: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
7a10: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
7a20: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
7a30: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
7a40: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
7a50: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
7a60: 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20  ES. *     None. 
7a70: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
7a80: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63  key_ret cackey_c
7a90: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 74 72 75  onnect_card(stru
7aa0: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
7ab0: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
7ac0: 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74  ret pcsc_connect
7ad0: 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f  _ret;..DWORD pro
7ae0: 74 6f 63 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61  tocol;..LONG sca
7af0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43  rd_conn_ret;...C
7b00: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7b10: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
7b20: 09 69 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09  .if (!slot) {...
7b30: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7b40: 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f  NTF("Invalid slo
7b50: 74 20 73 70 65 63 69 66 69 65 64 2c 20 72 65 74  t specified, ret
7b60: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
7b70: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
7b80: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
7b90: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  ERIC);..}...pcsc
7ba0: 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
7bb0: 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
7bc0: 63 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  ct();..if (pcsc_
7bd0: 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
7be0: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
7bf0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
7c00: 47 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63  G_PRINTF("Connec
7c10: 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61  tion to PC/SC fa
7c20: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
7c30: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
7c40: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
7c50: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
7c60: 09 7d 0a 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20  .}.../* Connect 
7c70: 74 6f 20 72 65 61 64 65 72 2c 20 69 66 20 6e 65  to reader, if ne
7c80: 65 64 65 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c  eded */..if (!sl
7c90: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
7ca0: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43  nnected) {...CAC
7cb0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7cc0: 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 25  ("SCardConnect(%
7cd0: 73 29 20 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74  s) called", slot
7ce0: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ->pcsc_reader);.
7cf0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
7d00: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
7d10: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
7d20: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
7d30: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
7d40: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
7d50: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20  D_PROTOCOL_T0 | 
7d60: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7d70: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
7d80: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
7d90: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
7da0: 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  nn_ret == SCARD_
7db0: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
7dc0: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
7dd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72  BUG_PRINTF("SCar
7de0: 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72  dConnect() retur
7df0: 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ned SCARD_E_PROT
7e00: 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69  O_MISMATCH, tryi
7e10: 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 30  ng with just T=0
7e20: 22 29 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ")....scard_conn
7e30: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7e40: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7e50: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7e60: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7e70: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7e80: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7e90: 30 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  0, &slot->pcsc_c
7ea0: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
7eb0: 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 63  .....if (scard_c
7ec0: 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  onn_ret == SCARD
7ed0: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7ee0: 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  H) {.....CACKEY_
7ef0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7f00: 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65 74  ardConnect() ret
7f10: 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50 52  urned SCARD_E_PR
7f20: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72  OTO_MISMATCH, tr
7f30: 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20 54  ying with just T
7f40: 3d 31 22 29 0a 09 09 09 09 73 63 61 72 64 5f 63  =1").....scard_c
7f50: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43  onn_ret = SCardC
7f60: 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70  onnect(*cackey_p
7f70: 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74  csc_handle, slot
7f80: 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53  ->pcsc_reader, S
7f90: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7fa0: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7fb0: 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73  L_T1, &slot->pcs
7fc0: 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f  c_card, &protoco
7fd0: 6c 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  l);....}...}....
7fe0: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7ff0: 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e  et == SCARD_W_UN
8000: 50 4f 57 45 52 45 44 5f 43 41 52 44 29 20 7b 0a  POWERED_CARD) {.
8010: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8020: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8030: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
8040: 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45  SCARD_W_UNPOWERE
8050: 44 5f 43 41 52 44 2c 20 74 72 79 69 6e 67 20 74  D_CARD, trying t
8060: 6f 20 72 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22  o re-connect..."
8070: 29 3b 0a 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e  );.....scard_con
8080: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e  n_ret = SCardCon
8090: 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73  nect(*cackey_pcs
80a0: 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e  c_handle, slot->
80b0: 70 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41  pcsc_reader, SCA
80c0: 52 44 5f 53 48 41 52 45 5f 44 49 52 45 43 54 2c  RD_SHARE_DIRECT,
80d0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
80e0: 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f  T0 | SCARD_PROTO
80f0: 43 4f 4c 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T1, &slot->p
8100: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
8110: 63 6f 6c 29 3b 0a 0a 09 09 09 69 66 20 28 73 63  col);.....if (sc
8120: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
8130: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
8140: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 43 41  SMATCH) {.....CA
8150: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8160: 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74 28  F("SCardConnect(
8170: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
8180: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
8190: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
81a0: 75 73 74 20 54 3d 30 22 29 0a 09 09 09 09 73 63  ust T=0").....sc
81b0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
81c0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
81d0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
81e0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
81f0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
8200: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
8210: 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74  OTOCOL_T0, &slot
8220: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26 70 72  ->pcsc_card, &pr
8230: 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66  otocol);......if
8240: 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74   (scard_conn_ret
8250: 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52 4f 54   == SCARD_E_PROT
8260: 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a 09 09  O_MISMATCH) {...
8270: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
8280: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
8290: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
82a0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
82b0: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
82c0: 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29 0a 09  ith just T=1")..
82d0: 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
82e0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
82f0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
8300: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
8310: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
8320: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
8330: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
8340: 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72   &slot->pcsc_car
8350: 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09  d, &protocol);..
8360: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63  ...}....}.....sc
8370: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63  ard_conn_ret = c
8380: 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f  ackey_reconnect_
8390: 63 61 72 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f  card(slot, proto
83a0: 63 6f 6c 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  col, &protocol);
83b0: 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
83c0: 64 5f 63 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43  d_conn_ret != SC
83d0: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
83e0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
83f0: 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
8400: 69 6f 6e 20 74 6f 20 63 61 72 64 20 66 61 69 6c  ion to card fail
8410: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
8420: 20 66 61 69 6c 75 72 65 20 28 53 43 61 72 64 43   failure (SCardC
8430: 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 2f 25 6c  onnect() = %s/%l
8440: 69 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  i)", CACKEY_DEBU
8450: 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
8460: 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 63 6f 6e  TO_STR(scard_con
8470: 6e 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  n_ret), (long) s
8480: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a  card_conn_ret);.
8490: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
84a0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
84b0: 29 3b 0a 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e  );...}....slot->
84c0: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
84d0: 74 65 64 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d  ted = 1;...slot-
84e0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
84f0: 74 68 20 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e  th = 0;...slot->
8500: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64  transaction_need
8510: 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09  _hw_lock = 0;...
8520: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d  slot->protocol =
8530: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09   protocol;..}...
8540: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8550: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
8560: 6e 20 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72  n success");...r
8570: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8580: 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20  C_S_OK);.}../*. 
8590: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
85a0: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
85b0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
85c0: 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63  ction(struct cac
85d0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b  key_slot *slot);
85e0: 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
85f0: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73  . *     cackey_s
8600: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
8610: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
8620: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
8630: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
8640: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8650: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
8660: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
8670: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
8680: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
8690: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
86a0: 0a 20 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e  . *     The tran
86b0: 73 61 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  saction should b
86c0: 65 20 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69  e terminated usi
86d0: 6e 67 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ng "cackey_end_t
86e0: 72 61 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20  ransaction". *. 
86f0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
8700: 5f 72 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69  _ret cackey_begi
8710: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74  n_transaction(st
8720: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
8730: 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65   *slot) {..cacke
8740: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e  y_ret cackey_con
8750: 6e 5f 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61  n_ret;..LONG sca
8760: 72 64 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09  rd_trans_ret;...
8770: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8780: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
8790: 0a 09 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65  ..cackey_conn_re
87a0: 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  t = cackey_conne
87b0: 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09  ct_card(slot);..
87c0: 69 66 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  if (cackey_conn_
87d0: 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
87e0: 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43  SC_S_OK) {...CAC
87f0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8800: 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
8810: 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
8820: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
8830: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
8840: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
8850: 49 43 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e  IC);..}...slot->
8860: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8870: 68 2b 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  h++;...if (slot-
8880: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8890: 74 68 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d  th > 1 && !slot-
88a0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65  >transaction_nee
88b0: 64 5f 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43  d_hw_lock) {...C
88c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
88d0: 54 46 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61  TF("Already in a
88e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65   transaction, pe
88f0: 72 66 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69  rforming no acti
8900: 6f 6e 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20  on (new depth = 
8910: 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e  %i)", slot->tran
8920: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a  saction_depth);.
8930: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8940: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
8950: 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
8960: 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b  ion_need_hw_lock
8970: 20 3d 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72   = 0;...scard_tr
8980: 61 6e 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42  ans_ret = SCardB
8990: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
89a0: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29  slot->pcsc_card)
89b0: 3b 0a 09 69 66 20 28 73 63 61 72 64 5f 74 72 61  ;..if (scard_tra
89c0: 6e 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  ns_ret != SCARD_
89d0: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
89e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
89f0: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 62 65  TF("Unable to be
8a00: 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  gin transaction,
8a10: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72   returning in er
8a20: 72 6f 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ror");....return
8a30: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
8a40: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41  ENERIC);..}...CA
8a50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8a60: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62  F("Sucessfully b
8a70: 65 67 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  egan transaction
8a80: 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20   on slot (%s)", 
8a90: 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65  slot->pcsc_reade
8aa0: 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  r);...return(CAC
8ab0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
8ac0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
8ad0: 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f  S. *     cackey_
8ae0: 72 65 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ret cackey_end_t
8af0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
8b00: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8b10: 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  lot);. *. * ARGU
8b20: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
8b30: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
8b40: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
8b50: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
8b60: 74 6f 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  to. *. * RETURN 
8b70: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
8b80: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
8b90: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
8ba0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
8bb0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
8bc0: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
8bd0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
8be0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69  s function requi
8bf0: 72 65 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69  res "cackey_begi
8c00: 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74  n_transaction" t
8c10: 6f 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  o be called firs
8c20: 74 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20  t. *. */.static 
8c30: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
8c40: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
8c50: 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  n(struct cackey_
8c60: 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c  slot *slot) {..L
8c70: 4f 4e 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f  ONG scard_trans_
8c80: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
8c90: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
8ca0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c  ed.");...if (!sl
8cb0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
8cc0: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43  nnected) {...CAC
8cd0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
8ce0: 28 22 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f  ("Card is not co
8cf0: 6e 6e 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20  nnected, unable 
8d00: 74 6f 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69  to end transacti
8d10: 6f 6e 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09  on on card");...
8d20: 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73  .if (slot->trans
8d30: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30  action_depth > 0
8d40: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
8d50: 42 55 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72  BUG_PRINTF("Decr
8d60: 65 61 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69  easing transacti
8d70: 6f 6e 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b  on depth and ask
8d80: 69 6e 67 20 66 6f 72 20 61 20 68 61 72 64 77 61  ing for a hardwa
8d90: 72 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e  re lock on the n
8da0: 65 78 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ext begin transa
8db0: 63 74 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64  ction (current d
8dc0: 65 70 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f  epth = %i)", slo
8dd0: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
8de0: 65 70 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d  epth);.....slot-
8df0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8e00: 74 68 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c  th--;.....if (sl
8e10: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8e20: 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09  depth > 0) {....
8e30: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
8e40: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
8e50: 3d 20 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  = 1;....}...}...
8e60: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8e70: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
8e80: 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .}...if (slot->t
8e90: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8ea0: 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
8eb0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8ec0: 54 65 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72  Terminating a tr
8ed0: 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68  ansaction that h
8ee0: 61 73 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b  as not begun!");
8ef0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8f00: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8f10: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8f20: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
8f30: 2d 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  -;...if (slot->t
8f40: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8f50: 20 3e 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59   > 0) {...CACKEY
8f60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
8f70: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
8f80: 6c 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e  l in progress, n
8f90: 6f 74 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f  ot terminating o
8fa0: 6e 2d 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  n-card Transacti
8fb0: 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74  on (current dept
8fc0: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
8fd0: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8fe0: 68 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  h);....return(CA
8ff0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
9000: 0a 09 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e  ..}...scard_tran
9010: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64  s_ret = SCardEnd
9020: 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  Transaction(slot
9030: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
9040: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
9050: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
9060: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
9070: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...CAC
9080: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9090: 28 22 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20  ("Unable to end 
90a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74  transaction, ret
90b0: 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22  urning in error"
90c0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
90d0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
90e0: 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  IC);..}...CACKEY
90f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
9100: 75 63 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69  ucessfully termi
9110: 6e 61 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  nated transactio
9120: 6e 20 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c  n on slot (%s)",
9130: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
9140: 65 72 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41  er);...return(CA
9150: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b  CKEY_PCSC_S_OK);
9160: 0a 7d 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61  .}../* APDU Rela
9170: 74 65 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f  ted Functions */
9180: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
9190: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
91a0: 74 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  t cackey_send_ap
91b0: 64 75 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  du(struct cackey
91c0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
91d0: 69 67 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73  igned char class
91e0: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
91f0: 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73  instruction, uns
9200: 69 67 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75  igned char p1, u
9210: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c  nsigned char p2,
9220: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c   unsigned char l
9230: 63 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  c, unsigned char
9240: 20 2a 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64   *data, unsigned
9250: 20 63 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36   char le, uint16
9260: 5f 74 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e  _t *respcode, un
9270: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73  signed char *res
9280: 70 64 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72  pdata, size_t *r
9290: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a  espdata_len);. *
92a0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
92b0: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
92c0: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
92d0: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
92e0: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
92f0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9300: 61 72 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20  ar class. *     
9310: 20 20 20 20 41 50 44 55 20 43 6c 61 73 73 20 28      APDU Class (
9320: 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37  GSCIS_CLASS_ISO7
9330: 38 31 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41  816 or GSCIS_CLA
9340: 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
9350: 52 4d 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73  RM. *         us
9360: 75 61 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a  ually), (CLA). *
9370: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9380: 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f   char instructio
9390: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44  n. *         APD
93a0: 55 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49  U Instruction (I
93b0: 4e 53 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e  NS). *. *     un
93c0: 73 69 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20  signed char p1. 
93d0: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 50  *         APDU P
93e0: 61 72 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a  arameter 1 (P1).
93f0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9400: 65 64 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20  ed char p2. *   
9410: 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61 6d        APDU Param
9420: 65 74 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20  eter 2 (P2). *. 
9430: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9440: 68 61 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20  har lc. *       
9450: 20 20 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66    APDU Length of
9460: 20 43 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d   Content (Lc) --
9470: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
9480: 67 74 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a  gth of "data". *
9490: 20 20 20 20 20 20 20 20 20 70 61 72 61 6d 65 74           paramet
94a0: 65 72 2e 20 20 49 66 20 22 64 61 74 61 22 20 69  er.  If "data" i
94b0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e  s specified as N
94c0: 55 4c 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65  ULL, this parame
94d0: 74 65 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20  ter will. *     
94e0: 20 20 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a      be ignored..
94f0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
9500: 65 64 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a  ed char *data. *
9510: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72           Pointer
9520: 20 74 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65   to buffer to se
9530: 6e 64 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62  nd.  It should b
9540: 65 20 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e  e "Lc" bytes lon
9550: 67 2e 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20  g.  If. *       
9560: 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e    specified as N
9570: 55 4c 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e  ULL, "Lc" will n
9580: 6f 74 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20  ot be sent, and 
9590: 74 68 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c  this buffer will
95a0: 20 62 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69   be. *         i
95b0: 67 6e 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20  gnored.. *. *   
95c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
95d0: 6c 65 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50  le. *         AP
95e0: 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70  DU Length of Exp
95f0: 65 63 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d  ectation (Le) --
9600: 20 74 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e   this is the len
9610: 67 74 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20  gth of the. *   
9620: 20 20 20 20 20 20 65 78 70 65 63 74 65 64 20 72        expected r
9630: 65 70 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69  eply.  If this i
9640: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 30  s specified as 0
9650: 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f   then it will no
9660: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 62 65 20  t. *         be 
9670: 73 65 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  sent.. *. *     
9680: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
9690: 64 65 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  de. *         [O
96a0: 55 54 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73  UT] Pointer to s
96b0: 74 6f 72 61 67 65 20 6f 66 20 41 50 44 55 20 72  torage of APDU r
96c0: 65 73 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49  esponse code.  I
96d0: 66 20 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20  f this is. *    
96e0: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 20 61       specified a
96f0: 73 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70  s NULL, the resp
9700: 6f 6e 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62  onse code will b
9710: 65 20 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a  e discarded.. *.
9720: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9730: 63 68 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20  char *respdata. 
9740: 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20  *         [OUT] 
9750: 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61  Pointer to stora
9760: 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f  ge of APDU respo
9770: 6e 73 65 20 64 61 74 61 2e 20 20 49 66 20 74 68  nse data.  If th
9780: 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20  is is. *        
9790: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55   specified as NU
97a0: 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65  LL, the response
97b0: 20 64 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69   data will be di
97c0: 73 63 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20  scarded.  If. * 
97d0: 20 20 20 20 20 20 20 20 74 68 65 20 22 72 65 73          the "res
97e0: 70 64 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d  pdata_len" param
97f0: 65 74 65 72 20 69 73 20 73 70 65 63 69 66 69 65  eter is specifie
9800: 64 20 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20  d as NULL, this 
9810: 62 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20  buffer. *       
9820: 20 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70    will not be up
9830: 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20  dated.. *. *    
9840: 20 73 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74   size_t *respdat
9850: 61 5f 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20  a_len. *        
9860: 20 5b 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74   [IN, OUT] Point
9870: 65 72 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f  er initialing co
9880: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a  ntaining the siz
9890: 65 20 6f 66 20 74 68 65 20 22 72 65 73 70 64 61  e of the "respda
98a0: 74 61 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62  ta". *         b
98b0: 75 66 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72  uffer.  Before r
98c0: 65 74 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f  eturning, the po
98d0: 69 6e 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69  inted to value i
98e0: 73 20 75 70 64 61 74 65 64 20 74 6f 20 74 68 65  s updated to the
98f0: 0a 20 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62  . *         numb
9900: 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
9910: 74 65 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65  ten to the buffe
9920: 72 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  r.  If this is s
9930: 70 65 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20  pecified as. *  
9940: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20         NULL, it 
9950: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9960: 74 65 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61  ted, and "respda
9970: 74 61 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  ta" will be igno
9980: 72 65 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20  red causing. *  
9990: 20 20 20 20 20 20 20 74 68 65 20 72 65 73 70 6f         the respo
99a0: 6e 73 65 20 64 61 74 61 20 74 6f 20 62 65 20 64  nse data to be d
99b0: 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20  iscarded.. *. * 
99c0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
99d0: 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f      CACKEY_PCSC_
99e0: 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f  S_OK           O
99f0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
9a00: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
9a10: 45 4e 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65  ENERIC      On e
9a20: 72 72 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b  rror. *     CACK
9a30: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
9a40: 42 53 45 4e 54 20 20 49 66 20 74 68 65 20 73 65  BSENT  If the se
9a50: 6e 64 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63  nding failed bec
9a60: 61 75 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69  ause the token i
9a70: 73 0a 20 2a 20 20 20 20 20 20 20 20 20 20 20 20  s. *            
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a      absent. *. *
9aa0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
9ab0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  is function will
9ac0: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20   connect to the 
9ad0: 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e  PC/SC Connection
9ae0: 20 4d 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20   Manager via. * 
9af0: 20 20 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f      cackey_pcsc_
9b00: 63 6f 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65  connect() if nee
9b10: 64 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49  ded.. *. *     I
9b20: 74 20 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74  t will connect t
9b30: 6f 20 74 68 65 20 63 61 72 64 20 69 6e 20 74 68  o the card in th
9b40: 65 20 72 65 61 64 65 72 20 61 74 74 61 63 68 65  e reader attache
9b50: 64 20 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a  d to the slot. *
9b60: 20 20 20 20 20 73 70 65 63 69 66 69 65 64 2e 20       specified. 
9b70: 20 49 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65   It will reconne
9b80: 63 74 20 74 6f 20 74 68 65 20 63 61 72 64 20 69  ct to the card i
9b90: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
9ba0: 0a 20 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61  . *     goes awa
9bb0: 79 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  y.. *. */.static
9bc0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
9bd0: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72  ey_send_apdu(str
9be0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
9bf0: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
9c00: 63 68 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69  char class, unsi
9c10: 67 6e 65 64 20 63 68 61 72 20 69 6e 73 74 72 75  gned char instru
9c20: 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20  ction, unsigned 
9c30: 63 68 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65  char p1, unsigne
9c40: 64 20 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67  d char p2, unsig
9c50: 6e 65 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69  ned int lc, unsi
9c60: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c  gned char *data,
9c70: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
9c80: 2c 20 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70  , uint16_t *resp
9c90: 63 6f 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  code, unsigned c
9ca0: 68 61 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73  har *respdata, s
9cb0: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9cc0: 6c 65 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20  len) {..uint8_t 
9cd0: 6d 61 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f  major_rc, minor_
9ce0: 72 63 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65  rc;..size_t byte
9cf0: 73 5f 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72  s_to_copy, tmp_r
9d00: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50  espdata_len;..LP
9d10: 43 53 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53  CSCARD_IO_REQUES
9d20: 54 20 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44  T pioSendPci;..D
9d30: 57 4f 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09  WORD protocol;..
9d40: 44 57 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20  DWORD xmit_len, 
9d50: 72 65 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20  recv_len;..LONG 
9d60: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20  scard_xmit_ret, 
9d70: 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74  scard_reconn_ret
9d80: 3b 0a 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66  ;..BYTE xmit_buf
9d90: 5b 31 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66  [1024], recv_buf
9da0: 5b 31 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73  [1024];..int pcs
9db0: 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70  c_connect_ret, p
9dc0: 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b  csc_getresp_ret;
9dd0: 0a 09 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43  ..int idx;...CAC
9de0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
9df0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
9e00: 66 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41  f (!slot) {...CA
9e10: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
9e20: 46 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  F("Invalid slot 
9e30: 73 70 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09  specified.");...
9e40: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
9e50: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
9e60: 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63  .}...pcsc_connec
9e70: 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63  t_ret = cackey_c
9e80: 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
9e90: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
9ea0: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
9eb0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
9ec0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
9ed0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
9ee0: 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64   connect to card
9ef0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
9f00: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
9f10: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
9f20: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
9f30: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  ./* Determine wh
9f40: 69 63 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20  ich protocol to 
9f50: 73 65 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73  send using */..s
9f60: 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f  witch (slot->pro
9f70: 74 6f 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20  tocol) {...case 
9f80: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
9f90: 30 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  0:....CACKEY_DEB
9fa0: 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f  UG_PRINTF("Proto
9fb0: 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61  col to send data
9fc0: 67 72 61 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a  gram is T=0");..
9fd0: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
9fe0: 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09  SCARD_PCI_T0;...
9ff0: 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20  ..break;...case 
a000: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
a010: 31 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  1:....CACKEY_DEB
a020: 55 47 5f 50 52 49 4e 54 46 28 22 50 72 6f 74 6f  UG_PRINTF("Proto
a030: 63 6f 6c 20 74 6f 20 73 65 6e 64 20 64 61 74 61  col to send data
a040: 67 72 61 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a  gram is T=1");..
a050: 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20  ...pioSendPci = 
a060: 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09  SCARD_PCI_T1;...
a070: 09 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75  ..break;...defau
a080: 6c 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  lt:....CACKEY_DE
a090: 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
a0a0: 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75  lid protocol fou
a0b0: 6e 64 2c 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b  nd, aborting.");
a0c0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
a0d0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
a0e0: 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e  C);..}.../* Tran
a0f0: 73 6d 69 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65  smit */..xmit_le
a100: 6e 20 3d 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66  n = 0;..xmit_buf
a110: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63  [xmit_len++] = c
a120: 6c 61 73 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b  lass;..xmit_buf[
a130: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e  xmit_len++] = in
a140: 73 74 72 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74  struction;..xmit
a150: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a160: 20 3d 20 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66   = p1;..xmit_buf
a170: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70  [xmit_len++] = p
a180: 32 3b 0a 09 69 66 20 28 64 61 74 61 29 20 7b 0a  2;..if (data) {.
a190: 09 09 69 66 20 28 6c 63 20 3e 20 32 35 35 29 20  ..if (lc > 255) 
a1a0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
a1b0: 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54 49 4f  G_PRINTF("CAUTIO
a1c0: 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c 63 20  N!  Using an Lc 
a1d0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 32 35 35  greater than 255
a1e0: 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20 20 4c   is untested.  L
a1f0: 63 20 3d 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09  c = %u", lc);...
a200: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a210: 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f  len++] = 0x82; /
a220: 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a  * XXX UNTESTED *
a230: 2f 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 28 6c 63 20  it_len++] = (lc 
a250: 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a  & 0xff00) >> 8;.
a260: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a270: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30  _len++] = lc & 0
a280: 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  xff;...} else {.
a290: 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74  ...xmit_buf[xmit
a2a0: 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09  _len++] = lc;...
a2b0: 7d 0a 09 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
a2c0: 3b 20 69 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b  ; idx < lc; idx+
a2d0: 2b 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66  +) {....xmit_buf
a2e0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64  [xmit_len++] = d
a2f0: 61 74 61 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d  ata[idx];...}..}
a300: 0a 0a 09 69 66 20 28 6c 65 20 21 3d 20 30 78 30  ...if (le != 0x0
a310: 30 29 20 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20  0) {...if (le > 
a320: 32 35 36 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  256) {....CACKEY
a330: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
a340: 41 55 54 49 4f 4e 21 20 20 55 73 69 6e 67 20 61  AUTION!  Using a
a350: 6e 20 4c 65 20 67 72 65 61 74 65 72 20 74 68 61  n Le greater tha
a360: 6e 20 32 35 36 20 69 73 20 75 6e 74 65 73 74 65  n 256 is unteste
a370: 64 2e 20 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65  d.  Le = %u", le
a380: 29 3b 0a 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  );.....xmit_buf[
a390: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78  xmit_len++] = 0x
a3a0: 38 32 3b 20 2f 2a 20 58 58 58 20 55 4e 54 45 53  82; /* XXX UNTES
a3b0: 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62  TED */....xmit_b
a3c0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
a3d0: 20 28 6c 65 20 26 20 30 78 66 66 30 30 29 20 3e   (le & 0xff00) >
a3e0: 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66  > 8;....xmit_buf
a3f0: 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c  [xmit_len++] = l
a400: 65 20 26 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c  e & 0xff;...} el
a410: 73 65 20 69 66 20 28 6c 65 20 3d 3d 20 32 35 36  se if (le == 256
a420: 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b  ) {....xmit_buf[
a430: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78  xmit_len++] = 0x
a440: 30 30 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  00;...} else {..
a450: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a460: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d  len++] = le;...}
a470: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53  ..}.../* Begin S
a480: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
a490: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
a4a0: 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f  begin_transactio
a4b0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63  n(slot);...if (c
a4c0: 6c 61 73 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c  lass == GSCIS_CL
a4d0: 41 53 53 5f 49 53 4f 37 38 31 36 20 26 26 20 69  ASS_ISO7816 && i
a4e0: 6e 73 74 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53  nstruction == GS
a4f0: 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59  CIS_INSTR_VERIFY
a500: 20 26 26 20 70 31 20 3d 3d 20 30 78 30 30 29 20   && p1 == 0x00) 
a510: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
a520: 5f 50 52 49 4e 54 46 28 22 53 65 6e 64 69 6e 67  _PRINTF("Sending
a530: 20 41 50 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65   APDU: <<censore
a540: 64 3e 3e 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  d>>");..} else {
a550: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a560: 50 52 49 4e 54 42 55 46 28 22 53 65 6e 64 69 6e  PRINTBUF("Sendin
a570: 67 20 41 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62  g APDU:", xmit_b
a580: 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09  uf, xmit_len);..
a590: 7d 0a 0a 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73  }...recv_len = s
a5a0: 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b  izeof(recv_buf);
a5b0: 0a 09 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ..scard_xmit_ret
a5c0: 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d 69 74   = SCardTransmit
a5d0: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
a5e0: 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d  , pioSendPci, xm
a5f0: 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e  it_buf, xmit_len
a600: 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66  , NULL, recv_buf
a610: 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  , &recv_len);...
a620: 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f 72  if (scard_xmit_r
a630: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f  et == SCARD_E_NO
a640: 54 5f 54 52 41 4e 53 41 43 54 45 44 29 20 7b 0a  T_TRANSACTED) {.
a650: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a660: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
a670: 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61   send APDU to ca
a680: 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  rd (SCardTransmi
a690: 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77  t() = %s/%lx), w
a6a0: 69 6c 6c 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20  ill ask calling 
a6b0: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 74 72  function to retr
a6c0: 79 20 28 6e 6f 74 20 72 65 73 65 74 74 69 6e 67  y (not resetting
a6d0: 20 63 61 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b   card)...", CACK
a6e0: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
a6f0: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
a700: 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28  ard_xmit_ret), (
a710: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
a720: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a  card_xmit_ret);.
a730: 0a 09 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72  .../* Begin Smar
a740: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a750: 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e  n */...cackey_en
a760: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
a770: 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ot);....return(C
a780: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
a790: 52 59 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63  RY);..}...if (sc
a7a0: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20  ard_xmit_ret != 
a7b0: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
a7c0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
a7d0: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
a7e0: 20 74 6f 20 73 65 6e 64 20 41 50 44 55 20 74 6f   to send APDU to
a7f0: 20 63 61 72 64 20 28 53 43 61 72 64 54 72 61 6e   card (SCardTran
a800: 73 6d 69 74 28 29 20 3d 20 25 73 2f 25 6c 78 29  smit() = %s/%lx)
a810: 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
a820: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
a830: 5f 53 54 52 28 73 63 61 72 64 5f 78 6d 69 74 5f  _STR(scard_xmit_
a840: 72 65 74 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ret), (unsigned 
a850: 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74  long) scard_xmit
a860: 5f 72 65 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  _ret);....CACKEY
a870: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
a880: 61 72 6b 69 6e 67 20 73 6c 6f 74 20 61 73 20 68  arking slot as h
a890: 61 76 69 6e 67 20 62 65 65 6e 20 72 65 73 65 74  aving been reset
a8a0: 22 29 3b 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72  ");...cackey_mar
a8b0: 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f  k_slot_reset(slo
a8c0: 74 29 3b 0a 0a 09 09 69 66 20 28 73 63 61 72 64  t);....if (scard
a8d0: 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20 53 43 41  _xmit_ret == SCA
a8e0: 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29  RD_W_RESET_CARD)
a8f0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
a900: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
a910: 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73   required, pleas
a920: 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09  e hold...");....
a930: 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  .scard_reconn_re
a940: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
a950: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
a960: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
a970: 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
a980: 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c  OL_T1, &protocol
a990: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
a9a0: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  _reconn_ret == S
a9b0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
a9c0: 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20  {...../* Update 
a9d0: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09  protocol */.....
a9e0: 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d  slot->protocol =
a9f0: 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 09 09 09 73   protocol;.....s
aa00: 77 69 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f  witch (slot->pro
aa10: 74 6f 63 6f 6c 29 20 7b 0a 09 09 09 09 09 63 61  tocol) {......ca
aa20: 73 65 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  se SCARD_PROTOCO
aa30: 4c 5f 54 30 3a 0a 09 09 09 09 09 09 70 69 6f 53  L_T0:.......pioS
aa40: 65 6e 64 50 63 69 20 3d 20 53 43 41 52 44 5f 50  endPci = SCARD_P
aa50: 43 49 5f 54 30 3b 0a 0a 09 09 09 09 09 09 62 72  CI_T0;........br
aa60: 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 53  eak;......case S
aa70: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
aa80: 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50  :.......pioSendP
aa90: 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54  ci = SCARD_PCI_T
aaa0: 31 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  1;........break;
aab0: 0a 09 09 09 09 09 64 65 66 61 75 6c 74 3a 0a 09  ......default:..
aac0: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
aad0: 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69  G_PRINTF("Invali
aae0: 64 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64  d protocol found
aaf0: 2c 20 62 75 74 20 74 6f 6f 20 6c 61 74 65 20 74  , but too late t
ab00: 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 62  o do anything ab
ab10: 6f 75 74 20 69 74 20 6e 6f 77 20 2d 2d 20 74 72  out it now -- tr
ab20: 79 69 6e 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a  ying anyway.");.
ab30: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
ab40: 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65  ..}....../* Re-e
ab50: 73 74 61 62 6c 69 73 68 20 74 72 61 6e 73 61 63  stablish transac
ab60: 74 69 6f 6e 2c 20 69 66 20 69 74 20 77 61 73 20  tion, if it was 
ab70: 70 72 65 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69  present */.....i
ab80: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
ab90: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
aba0: 7b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  {......slot->tra
abb0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d  nsaction_depth--
abc0: 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61  ;......slot->tra
abd0: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
abe0: 5f 6c 6f 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09  _lock = 1;......
abf0: 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61  cackey_begin_tra
ac00: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
ac10: 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
ac20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
ac30: 52 65 73 65 74 20 73 75 63 63 65 73 73 66 75 6c  Reset successful
ac40: 2c 20 72 65 74 72 61 6e 73 6d 69 74 74 69 6e 67  , retransmitting
ac50: 22 29 3b 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65  ");......recv_le
ac60: 6e 20 3d 20 73 69 7a 65 6f 66 28 72 65 63 76 5f  n = sizeof(recv_
ac70: 62 75 66 29 3b 0a 09 09 09 09 73 63 61 72 64 5f  buf);.....scard_
ac80: 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61 72 64  xmit_ret = SCard
ac90: 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70  Transmit(slot->p
aca0: 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e  csc_card, pioSen
acb0: 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20  dPci, xmit_buf, 
acc0: 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20  xmit_len, NULL, 
acd0: 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63 76 5f  recv_buf, &recv_
ace0: 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28 73  len);......if (s
acf0: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d  card_xmit_ret !=
ad00: 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
ad10: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
ad20: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
ad30: 74 72 61 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c  transmit failed,
ad40: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
ad50: 69 6c 75 72 65 20 61 66 74 65 72 20 64 69 73 63  ilure after disc
ad60: 6f 6e 6e 65 63 74 69 6e 67 20 74 68 65 20 63 61  onnecting the ca
ad70: 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  rd (SCardTransmi
ad80: 74 20 3d 20 25 73 2f 25 6c 69 29 22 2c 20 43 41  t = %s/%li)", CA
ad90: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
ada0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
adb0: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c  scard_xmit_ret),
adc0: 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d   (long) scard_xm
add0: 69 74 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 53  it_ret);.......S
ade0: 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73  CardDisconnect(s
adf0: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
ae00: 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44  SCARD_LEAVE_CARD
ae10: 29 3b 0a 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63  );......slot->pc
ae20: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
ae30: 64 20 3d 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20  d = 0;......./* 
ae40: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
ae50: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
ae60: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
ae70: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
ae80: 09 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
ae90: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
aea0: 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43  ;.......return(C
aeb0: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
aec0: 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d  ENABSENT);.....}
aed0: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
aee0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
aef0: 49 4e 54 46 28 22 44 69 73 63 6f 6e 6e 65 63 74  INTF("Disconnect
af00: 69 6e 67 20 63 61 72 64 22 29 3b 0a 0a 09 09 09  ing card");.....
af10: 09 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  .SCardDisconnect
af20: 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  (slot->pcsc_card
af30: 2c 20 53 43 41 52 44 5f 4c 45 41 56 45 5f 43 41  , SCARD_LEAVE_CA
af40: 52 44 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70  RD);.....slot->p
af50: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
af60: 65 64 20 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20  ed = 0;....../* 
af70: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
af80: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09  ansaction */....
af90: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
afa0: 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09  on_depth = 1;...
afb0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
afc0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
afd0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
afe0: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
aff0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
b000: 3b 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ;.....return(CAC
b010: 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
b020: 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09  ABSENT);....}...
b030: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b  } else {....CACK
b040: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
b050: 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63  "Disconnecting c
b060: 61 72 64 22 29 3b 0a 0a 09 09 09 53 43 61 72 64  ard");.....SCard
b070: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
b080: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
b090: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
b0a0: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
b0b0: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
b0c0: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
b0d0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
b0e0: 6e 20 2a 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72  n */....slot->tr
b0f0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
b100: 3d 20 31 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65  = 1;....cackey_e
b110: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b120: 6c 6f 74 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  lot);.....CACKEY
b130: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
b140: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b150: 75 72 65 22 29 3b 0a 09 09 09 72 65 74 75 72 6e  ure");....return
b160: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
b170: 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d  OKENABSENT);...}
b180: 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
b190: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 65 74  UG_PRINTBUF("Ret
b1a0: 75 72 6e 65 64 20 56 61 6c 75 65 3a 22 2c 20 72  urned Value:", r
b1b0: 65 63 76 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65  ecv_buf, recv_le
b1c0: 6e 29 3b 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c  n);...if (recv_l
b1d0: 65 6e 20 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d  en < 2) {.../* M
b1e0: 69 6e 69 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20  inimal response 
b1f0: 6c 65 6e 67 74 68 20 69 73 20 32 20 62 79 74 65  length is 2 byte
b200: 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  s, returning in 
b210: 66 61 69 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43  failure */...CAC
b220: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b230: 28 22 52 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73  ("Response too s
b240: 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20  mall, returning 
b250: 69 6e 20 66 61 69 6c 75 72 65 20 28 72 65 63 76  in failure (recv
b260: 5f 6c 65 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75  _len = %lu)", (u
b270: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65  nsigned long) re
b280: 63 76 5f 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45  cv_len);..../* E
b290: 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61  nd Smartcard Tra
b2a0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61  nsaction */...ca
b2b0: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b2c0: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72  tion(slot);....r
b2d0: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
b2e0: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
b2f0: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
b300: 72 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09  result code */..
b310: 6d 61 6a 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f  major_rc = recv_
b320: 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32  buf[recv_len - 2
b330: 5d 3b 0a 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72  ];..minor_rc = r
b340: 65 63 76 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e  ecv_buf[recv_len
b350: 20 2d 20 31 5d 3b 0a 09 69 66 20 28 72 65 73 70   - 1];..if (resp
b360: 63 6f 64 65 29 20 7b 0a 09 09 2a 72 65 73 70 63  code) {...*respc
b370: 6f 64 65 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20  ode = (major_rc 
b380: 3c 3c 20 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63  << 8) | minor_rc
b390: 3b 0a 09 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74  ;..}.../* Adjust
b3a0: 20 6d 65 73 73 61 67 65 20 62 75 66 66 65 72 20   message buffer 
b3b0: 2a 2f 0a 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20  */..recv_len -= 
b3c0: 32 3b 0a 0a 09 2f 2a 20 41 64 64 20 62 79 74 65  2;.../* Add byte
b3d0: 73 20 74 6f 20 72 65 74 75 72 6e 20 76 61 6c 75  s to return valu
b3e0: 65 20 2a 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61  e */..tmp_respda
b3f0: 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20  ta_len = 0;..if 
b400: 28 72 65 73 70 64 61 74 61 20 26 26 20 72 65 73  (respdata && res
b410: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74  pdata_len) {...t
b420: 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  mp_respdata_len 
b430: 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b  = *respdata_len;
b440: 0a 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70  ....bytes_to_cop
b450: 79 20 3d 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  y = *respdata_le
b460: 6e 3b 0a 0a 09 09 69 66 20 28 72 65 63 76 5f 6c  n;....if (recv_l
b470: 65 6e 20 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f  en < bytes_to_co
b480: 70 79 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74  py) {....bytes_t
b490: 6f 5f 63 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65  o_copy = recv_le
b4a0: 6e 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  n;...}....CACKEY
b4b0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
b4c0: 6f 70 79 69 6e 67 20 25 6c 75 20 62 79 74 65 73  opying %lu bytes
b4d0: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 28   to the buffer (
b4e0: 72 65 63 76 27 64 20 25 6c 75 20 62 79 74 65 73  recv'd %lu bytes
b4f0: 2c 20 62 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62  , but only %lu b
b500: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 6f 75 72  ytes left in our
b510: 20 62 75 66 66 65 72 29 22 2c 20 28 75 6e 73 69   buffer)", (unsi
b520: 67 6e 65 64 20 6c 6f 6e 67 29 20 62 79 74 65 73  gned long) bytes
b530: 5f 74 6f 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67  _to_copy, (unsig
b540: 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c  ned long) recv_l
b550: 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  en, (unsigned lo
b560: 6e 67 29 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  ng) *respdata_le
b570: 6e 29 3b 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65  n);....memcpy(re
b580: 73 70 64 61 74 61 2c 20 72 65 63 76 5f 62 75 66  spdata, recv_buf
b590: 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  , bytes_to_copy)
b5a0: 3b 0a 09 09 72 65 73 70 64 61 74 61 20 2b 3d 20  ;...respdata += 
b5b0: 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a  bytes_to_copy;..
b5c0: 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20  ..*respdata_len 
b5d0: 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  = bytes_to_copy;
b5e0: 0a 09 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  ...tmp_respdata_
b5f0: 6c 65 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f  len -= bytes_to_
b600: 63 6f 70 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  copy;..} else {.
b610: 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 21  ..if (recv_len !
b620: 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
b630: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
b640: 68 72 6f 77 69 6e 67 20 61 77 61 79 20 25 6c 75  hrowing away %lu
b650: 20 62 79 74 65 73 2c 20 6e 6f 77 68 65 72 65 20   bytes, nowhere 
b660: 74 6f 20 70 75 74 20 74 68 65 6d 21 22 2c 20 28  to put them!", (
b670: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72  unsigned long) r
b680: 65 63 76 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d  ecv_len);...}..}
b690: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20  ...if (major_rc 
b6a0: 3d 3d 20 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20  == 0x61) {.../* 
b6b0: 57 65 20 6e 65 65 64 20 74 6f 20 52 45 41 44 20  We need to READ 
b6c0: 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  */...CACKEY_DEBU
b6d0: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
b6e0: 20 72 65 61 64 20 72 65 71 75 69 72 65 64 22 29   read required")
b6f0: 3b 0a 0a 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72  ;....if (minor_r
b700: 63 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  c == 0x00) {....
b710: 6d 69 6e 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45  minor_rc = CACKE
b720: 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a  Y_APDU_MTU;...}.
b730: 0a 09 09 70 63 73 63 5f 67 65 74 72 65 73 70 5f  ...pcsc_getresp_
b740: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
b750: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
b760: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
b770: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  , GSCIS_INSTR_GE
b780: 54 5f 52 45 53 50 4f 4e 53 45 2c 20 30 78 30 30  T_RESPONSE, 0x00
b790: 2c 20 30 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c  , 0x00, 0, NULL,
b7a0: 20 6d 69 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63   minor_rc, respc
b7b0: 6f 64 65 2c 20 72 65 73 70 64 61 74 61 2c 20 26  ode, respdata, &
b7c0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
b7d0: 29 3b 0a 0a 09 09 69 66 20 28 70 63 73 63 5f 67  );....if (pcsc_g
b7e0: 65 74 72 65 73 70 5f 72 65 74 20 21 3d 20 43 41  etresp_ret != CA
b7f0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
b800: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
b810: 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72  G_PRINTF("Buffer
b820: 20 72 65 61 64 20 66 61 69 6c 65 64 21 20 20 52   read failed!  R
b830: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
b840: 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e  ure");...../* En
b850: 64 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e  d Smartcard Tran
b860: 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61  saction */....ca
b870: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
b880: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
b890: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70  if (pcsc_getresp
b8a0: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
b8b0: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
b8c0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b8d0: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a  _PCSC_E_RETRY);.
b8e0: 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28  ...}.....return(
b8f0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
b900: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69  NERIC);...}....i
b910: 66 20 28 72 65 73 70 64 61 74 61 5f 6c 65 6e 29  f (respdata_len)
b920: 20 7b 0a 09 09 09 2a 72 65 73 70 64 61 74 61 5f   {....*respdata_
b930: 6c 65 6e 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64  len += tmp_respd
b940: 61 74 61 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  ata_len;...}....
b950: 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64  /* End Smartcard
b960: 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
b970: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
b980: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
b990: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b9a0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
b9b0: 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 62 75  g in success (bu
b9c0: 66 66 65 72 20 72 65 61 64 20 63 6f 6d 70 6c 65  ffer read comple
b9d0: 74 65 29 22 29 3b 0a 09 09 72 65 74 75 72 6e 28  te)");...return(
b9e0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
b9f0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53  );..}.../* End S
ba00: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
ba10: 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f  tion */..cackey_
ba20: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
ba30: 73 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a  slot);...if (maj
ba40: 6f 72 5f 72 63 20 3d 3d 20 30 78 39 30 29 20 7b  or_rc == 0x90) {
ba50: 0a 09 09 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f  .../* Success */
ba60: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
ba70: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
ba80: 67 20 69 6e 20 73 75 63 63 65 73 73 20 28 6d 61  g in success (ma
ba90: 6a 6f 72 5f 72 63 20 3d 20 30 78 39 30 29 22 29  jor_rc = 0x90)")
baa0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
bab0: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
bac0: 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
bad0: 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 52  G_PRINTF("APDU R
bae0: 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72  eturned an error
baf0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
bb00: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 72 65 74 75  ailure");...retu
bb10: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
bb20: 5f 47 45 4e 45 52 49 43 29 3b 0a 7d 0a 0a 73 74  _GENERIC);.}..st
bb30: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68  atic unsigned ch
bb40: 61 72 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ar *cackey_read_
bb50: 62 65 72 74 6c 76 5f 74 61 67 28 75 6e 73 69 67  bertlv_tag(unsig
bb60: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
bb70: 2c 20 73 69 7a 65 5f 74 20 2a 62 75 66 66 65 72  , size_t *buffer
bb80: 5f 6c 65 6e 5f 70 2c 20 75 6e 73 69 67 6e 65 64  _len_p, unsigned
bb90: 20 63 68 61 72 20 74 61 67 2c 20 75 6e 73 69 67   char tag, unsig
bba0: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66  ned char *outbuf
bbb0: 66 65 72 2c 20 73 69 7a 65 5f 74 20 2a 6f 75 74  fer, size_t *out
bbc0: 62 75 66 66 65 72 5f 6c 65 6e 5f 70 29 20 7b 0a  buffer_len_p) {.
bbd0: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
bbe0: 62 75 66 66 65 72 5f 70 3b 0a 09 73 69 7a 65 5f  buffer_p;..size_
bbf0: 74 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 2c  t outbuffer_len,
bc00: 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 73 69   buffer_len;..si
bc10: 7a 65 5f 74 20 73 69 7a 65 3b 0a 09 69 6e 74 20  ze_t size;..int 
bc20: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
bc30: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
bc40: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 62 75 66  ed.");...if (buf
bc50: 66 65 72 5f 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c  fer_len_p == NUL
bc60: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
bc70: 42 55 47 5f 50 52 49 4e 54 46 28 22 62 75 66 66  BUG_PRINTF("buff
bc80: 65 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c  er_len_p is NULL
bc90: 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20  .  Returning in 
bca0: 66 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72  failure.");....r
bcb0: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
bcc0: 0a 09 69 66 20 28 6f 75 74 62 75 66 66 65 72 5f  ..if (outbuffer_
bcd0: 6c 65 6e 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b  len_p == NULL) {
bce0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
bcf0: 50 52 49 4e 54 46 28 22 6f 75 74 62 75 66 66 65  PRINTF("outbuffe
bd00: 72 5f 6c 65 6e 5f 70 20 69 73 20 4e 55 4c 4c 2e  r_len_p is NULL.
bd10: 20 20 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 66    Returning in f
bd20: 61 69 6c 75 72 65 2e 22 29 3b 0a 0a 09 09 72 65  ailure.");....re
bd30: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
bd40: 09 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 2a 6f  .buffer_len = *o
bd50: 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f 70 3b 0a  utbuffer_len_p;.
bd60: 09 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 20 3d  .outbuffer_len =
bd70: 20 2a 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e 5f   *outbuffer_len_
bd80: 70 3b 0a 0a 09 62 75 66 66 65 72 5f 70 20 3d 20  p;...buffer_p = 
bd90: 62 75 66 66 65 72 3b 0a 09 69 66 20 28 62 75 66  buffer;..if (buf
bda0: 66 65 72 5f 70 5b 30 5d 20 21 3d 20 74 61 67 29  fer_p[0] != tag)
bdb0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
bdc0: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 66 6f  G_PRINTF("Tag fo
bdd0: 75 6e 64 20 77 61 73 20 6e 6f 74 20 74 61 67 20  und was not tag 
bde0: 65 78 70 65 63 74 65 64 2e 20 20 54 61 67 20 3d  expected.  Tag =
bdf0: 20 25 30 32 78 2c 20 45 78 70 65 63 74 65 64 20   %02x, Expected 
be00: 3d 20 25 30 32 78 2e 20 20 52 65 74 75 72 6e 69  = %02x.  Returni
be10: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 22 2c  ng in failure.",
be20: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
be30: 62 75 66 66 65 72 5f 70 5b 30 5d 2c 20 74 61 67  buffer_p[0], tag
be40: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
be50: 4c 29 3b 0a 09 7d 0a 0a 09 62 75 66 66 65 72 5f  L);..}...buffer_
be60: 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f 6c 65 6e  p++;..buffer_len
be70: 2d 2d 3b 0a 0a 09 69 66 20 28 28 62 75 66 66 65  --;...if ((buffe
be80: 72 5f 70 5b 30 5d 20 26 20 30 78 38 30 29 20 3d  r_p[0] & 0x80) =
be90: 3d 20 30 78 38 30 29 20 7b 0a 09 09 73 69 7a 65  = 0x80) {...size
bea0: 20 3d 20 30 3b 0a 09 09 69 64 78 20 3d 20 28 62   = 0;...idx = (b
beb0: 75 66 66 65 72 5f 70 5b 30 5d 20 26 20 30 78 37  uffer_p[0] & 0x7
bec0: 66 29 3b 0a 0a 09 09 69 66 20 28 69 64 78 20 3e  f);....if (idx >
bed0: 20 62 75 66 66 65 72 5f 6c 65 6e 29 20 7b 0a 09   buffer_len) {..
bee0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bef0: 52 49 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64  RINTF("Malformed
bf00: 20 42 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f   BER value -- no
bf10: 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 61  t enough bytes a
bf20: 76 61 69 6c 61 62 6c 65 20 74 6f 20 72 65 61 64  vailable to read
bf30: 20 6c 65 6e 67 74 68 20 28 69 64 78 20 3d 20 25   length (idx = %
bf40: 69 2c 20 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20  i, buffer_len = 
bf50: 25 6c 75 29 22 2c 20 69 64 78 2c 20 28 75 6e 73  %lu)", idx, (uns
bf60: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66 66  igned long) buff
bf70: 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 09 72 65 74  er_len);.....ret
bf80: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 09 7d 0a 0a  urn(NULL);...}..
bf90: 09 09 66 6f 72 20 28 3b 20 69 64 78 20 3e 20 30  ..for (; idx > 0
bfa0: 3b 20 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75  ; idx--) {....bu
bfb0: 66 66 65 72 5f 70 2b 2b 3b 0a 09 09 09 62 75 66  ffer_p++;....buf
bfc0: 66 65 72 5f 6c 65 6e 2d 2d 3b 0a 0a 09 09 09 73  fer_len--;.....s
bfd0: 69 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69  ize <<= 8;....si
bfe0: 7a 65 20 7c 3d 20 62 75 66 66 65 72 5f 70 5b 30  ze |= buffer_p[0
bff0: 5d 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  ];...}..} else {
c000: 0a 09 09 73 69 7a 65 20 3d 20 62 75 66 66 65 72  ...size = buffer
c010: 5f 70 5b 30 5d 3b 0a 09 7d 0a 0a 09 62 75 66 66  _p[0];..}...buff
c020: 65 72 5f 70 2b 2b 3b 0a 09 62 75 66 66 65 72 5f  er_p++;..buffer_
c030: 6c 65 6e 2d 2d 3b 0a 0a 09 69 66 20 28 73 69 7a  len--;...if (siz
c040: 65 20 3e 20 6f 75 74 62 75 66 66 65 72 5f 6c 65  e > outbuffer_le
c050: 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
c060: 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
c070: 6c 65 20 74 6f 20 63 6f 70 79 20 76 61 6c 75 65  le to copy value
c080: 20 62 75 66 66 65 72 20 74 6f 20 6f 75 74 62 75   buffer to outbu
c090: 66 66 65 72 2c 20 6e 6f 74 20 65 6e 6f 75 67 68  ffer, not enough
c0a0: 20 72 6f 6f 6d 2e 20 20 56 61 6c 75 65 20 62 75   room.  Value bu
c0b0: 66 66 65 72 20 6c 65 6e 67 74 68 20 3d 20 25 6c  ffer length = %l
c0c0: 75 2c 20 6f 75 74 20 62 75 66 66 65 72 20 6c 65  u, out buffer le
c0d0: 6e 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e  ngth = %lu", (un
c0e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
c0f0: 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
c100: 67 29 20 6f 75 74 62 75 66 66 65 72 5f 6c 65 6e  g) outbuffer_len
c110: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
c120: 4c 29 3b 0a 09 7d 0a 0a 09 2a 6f 75 74 62 75 66  L);..}...*outbuf
c130: 66 65 72 5f 6c 65 6e 5f 70 20 3d 20 73 69 7a 65  fer_len_p = size
c140: 3b 0a 09 69 66 20 28 6f 75 74 62 75 66 66 65 72  ;..if (outbuffer
c150: 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 6f 75 74  ) {...memcpy(out
c160: 62 75 66 66 65 72 2c 20 62 75 66 66 65 72 5f 70  buffer, buffer_p
c170: 2c 20 73 69 7a 65 29 3b 0a 09 09 62 75 66 66 65  , size);...buffe
c180: 72 5f 70 20 2b 3d 20 73 69 7a 65 3b 0a 09 09 62  r_p += size;...b
c190: 75 66 66 65 72 5f 6c 65 6e 20 2d 3d 20 73 69 7a  uffer_len -= siz
c1a0: 65 3b 0a 0a 09 09 2a 62 75 66 66 65 72 5f 6c 65  e;....*buffer_le
c1b0: 6e 5f 70 20 3d 20 62 75 66 66 65 72 5f 6c 65 6e  n_p = buffer_len
c1c0: 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
c1d0: 47 5f 50 52 49 4e 54 42 55 46 28 22 42 45 52 2d  G_PRINTBUF("BER-
c1e0: 54 4c 56 20 72 65 73 75 6c 74 73 3a 22 2c 20 6f  TLV results:", o
c1f0: 75 74 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b  utbuffer, size);
c200: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d 65 6d  ..} else {...mem
c210: 6d 6f 76 65 28 62 75 66 66 65 72 2c 20 62 75 66  move(buffer, buf
c220: 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 09 09  fer_p, size);...
c230: 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66 65  buffer_p = buffe
c240: 72 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  r;....CACKEY_DEB
c250: 55 47 5f 50 52 49 4e 54 42 55 46 28 22 42 45 52  UG_PRINTBUF("BER
c260: 2d 54 4c 56 20 72 65 73 75 6c 74 73 3a 22 2c 20  -TLV results:", 
c270: 62 75 66 66 65 72 2c 20 73 69 7a 65 29 3b 0a 09  buffer, size);..
c280: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
c290: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
c2a0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2e 20 20  ng in success.  
c2b0: 53 69 7a 65 20 6f 66 20 63 6f 6e 74 65 6e 74 73  Size of contents
c2c0: 20 66 6f 72 20 74 61 67 20 25 30 32 78 20 69 73   for tag %02x is
c2d0: 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64   %lu", (unsigned
c2e0: 20 69 6e 74 29 20 74 61 67 2c 20 28 75 6e 73 69   int) tag, (unsi
c2f0: 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65 29  gned long) size)
c300: 3b 0a 0a 09 72 65 74 75 72 6e 28 62 75 66 66 65  ;...return(buffe
c310: 72 5f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  r_p);.}../*. * S
c320: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73  YNPOSIS. *     s
c330: 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65  size_t cackey_ge
c340: 74 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61  t_data(struct ca
c350: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
c360: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
c370: 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 62  buffer, size_t b
c380: 75 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73 69 67  uffer_len, unsig
c390: 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 29  ned char oid[3])
c3a0: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
c3b0: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
c3c0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
c3d0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
c3e0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
c3f0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
c400: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
c410: 75 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20  uffer. *        
c420: 20 5b 4f 55 54 5d 20 42 75 66 66 65 72 0a 20 2a   [OUT] Buffer. *
c430: 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 62  . *     size_t b
c440: 75 66 66 65 72 5f 6c 65 6e 0a 20 2a 20 20 20 20  uffer_len. *    
c450: 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62       Number of b
c460: 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74 20  ytes to attempt 
c470: 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20 20  to read. *. *   
c480: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c490: 6f 69 64 5b 33 5d 0a 20 2a 20 20 20 20 20 20 20  oid[3]. *       
c4a0: 20 20 33 2d 62 79 74 65 20 4f 49 44 20 74 6f 20    3-byte OID to 
c4b0: 72 65 61 64 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45  read. *. *. * RE
c4c0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
c4d0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
c4e0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
c4f0: 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
c500: 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d 31  ally read, or -1
c510: 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a   on error.. *. *
c520: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f   NOTES. *     No
c530: 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ne. *. */.static
c540: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
c550: 67 65 74 5f 64 61 74 61 28 73 74 72 75 63 74 20  get_data(struct 
c560: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
c570: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
c580: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
c590: 20 62 75 66 66 65 72 5f 6c 65 6e 2c 20 75 6e 73   buffer_len, uns
c5a0: 69 67 6e 65 64 20 63 68 61 72 20 6f 69 64 5b 33  igned char oid[3
c5b0: 5d 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ]) {..unsigned c
c5c0: 68 61 72 20 63 6d 64 5b 5d 20 3d 20 7b 30 78 35  har cmd[] = {0x5
c5d0: 43 2c 20 30 78 30 33 2c 20 30 78 30 30 2c 20 30  C, 0x03, 0x00, 0
c5e0: 78 30 30 2c 20 30 78 30 30 7d 3b 0a 09 75 6e 73  x00, 0x00};..uns
c5f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c600: 65 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e  er_p;..size_t in
c610: 69 74 5f 62 75 66 66 65 72 5f 6c 65 6e 2c 20 73  it_buffer_len, s
c620: 69 7a 65 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72  ize;..uint16_t r
c630: 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65  espcode;..int se
c640: 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  nd_ret;...CACKEY
c650: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
c660: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74  alled.");...init
c670: 5f 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 62 75  _buffer_len = bu
c680: 66 66 65 72 5f 6c 65 6e 3b 0a 0a 09 63 6d 64 5b  ffer_len;...cmd[
c690: 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63 6d  2] = oid[0];..cm
c6a0: 64 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a 09  d[3] = oid[1];..
c6b0: 63 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d 3b  cmd[4] = oid[2];
c6c0: 0a 0a 09 2f 2a 20 32 35 36 20 74 6f 20 69 6e 64  .../* 256 to ind
c6d0: 69 63 61 74 65 20 74 68 65 20 6c 61 72 67 65 73  icate the larges
c6e0: 74 20 6d 65 73 73 61 67 65 20 73 69 7a 65 20 2d  t message size -
c6f0: 2d 20 6e 6f 74 20 63 6c 65 61 72 20 69 66 20 74  - not clear if t
c700: 68 69 73 20 77 69 6c 6c 20 77 6f 72 6b 20 77 69  his will work wi
c710: 74 68 20 61 6c 6c 20 6d 65 73 73 61 67 65 73 20  th all messages 
c720: 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  */..send_ret = c
c730: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
c740: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
c750: 53 5f 49 53 4f 37 38 31 36 2c 20 4e 49 53 54 53  S_ISO7816, NISTS
c760: 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f  P800_73_3_INSTR_
c770: 47 45 54 5f 44 41 54 41 2c 20 30 78 33 46 2c 20  GET_DATA, 0x3F, 
c780: 30 78 46 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64  0xFF, sizeof(cmd
c790: 29 2c 20 63 6d 64 2c 20 32 35 36 2c 20 26 72 65  ), cmd, 256, &re
c7a0: 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72 2c 20  spcode, buffer, 
c7b0: 26 62 75 66 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09  &buffer_len);...
c7c0: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
c7d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
c7e0: 54 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TRY) {...CACKEY_
c7f0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44  DEBUG_PRINTF("AD
c800: 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65  PU Sending faile
c810: 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61 64  d, retrying read
c820: 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 72 65   buffer");....re
c830: 74 75 72 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f  turn(cackey_get_
c840: 64 61 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65  data(slot, buffe
c850: 72 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 5f 6c  r, init_buffer_l
c860: 65 6e 2c 20 6f 69 64 29 29 3b 0a 09 7d 0a 0a 09  en, oid));..}...
c870: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
c880: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
c890: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
c8a0: 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65  UG_PRINTF("cacke
c8b0: 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61  y_send_apdu() fa
c8c0: 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20  iled, returning 
c8d0: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
c8e0: 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
c8f0: 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50  .#ifdef CACKEY_P
c900: 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66  ARANOID.#  ifdef
c910: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
c920: 58 0a 09 69 66 20 28 62 75 66 66 65 72 5f 6c 65  X..if (buffer_le
c930: 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  n > _POSIX_SSIZE
c940: 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59  _MAX) {...CACKEY
c950: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
c960: 65 61 64 20 62 79 74 65 73 20 28 62 75 66 66 65  ead bytes (buffe
c970: 72 5f 6c 65 6e 29 20 65 78 63 65 65 64 73 20 6d  r_len) exceeds m
c980: 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
c990: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
c9a0: 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
c9b0: 62 75 66 66 65 72 5f 6c 65 6e 20 3d 20 25 6c 75  buffer_len = %lu
c9c0: 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49  )", (long) _POSI
c9d0: 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e  X_SSIZE_MAX, (un
c9e0: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 62 75 66  signed long) buf
c9f0: 66 65 72 5f 6c 65 6e 29 3b 0a 0a 09 09 72 65 74  fer_len);....ret
ca00: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65  urn(-1);..}.#  e
ca10: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66  ndif.#endif...if
ca20: 20 28 62 75 66 66 65 72 5f 6c 65 6e 20 3c 20 32   (buffer_len < 2
ca30: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
ca40: 55 47 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20  UG_PRINTF("APDU 
ca50: 47 45 54 20 44 41 54 41 20 72 65 74 75 72 6e 65  GET DATA returne
ca60: 64 20 25 6c 75 20 62 79 74 65 73 2c 20 77 68 69  d %lu bytes, whi
ca70: 63 68 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20  ch is too short 
ca80: 66 6f 72 20 61 20 42 45 52 2d 54 4c 56 20 72 65  for a BER-TLV re
ca90: 73 70 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e  sponse", (unsign
caa0: 65 64 20 6c 6f 6e 67 29 20 62 75 66 66 65 72 5f  ed long) buffer_
cab0: 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  len);....return(
cac0: 2d 31 29 3b 0a 09 7d 0a 0a 09 73 69 7a 65 20 3d  -1);..}...size =
cad0: 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a 09 62 75   buffer_len;..bu
cae0: 66 66 65 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f  ffer_p = cackey_
caf0: 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28  read_bertlv_tag(
cb00: 62 75 66 66 65 72 2c 20 26 62 75 66 66 65 72 5f  buffer, &buffer_
cb10: 6c 65 6e 2c 20 30 78 35 33 2c 20 4e 55 4c 4c 2c  len, 0x53, NULL,
cb20: 20 26 73 69 7a 65 29 3b 0a 0a 09 69 66 20 28 62   &size);...if (b
cb30: 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55 4c 4c 29  uffer_p == NULL)
cb40: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
cb50: 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 64 65  G_PRINTF("Tag de
cb60: 63 6f 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72  coding failed, r
cb70: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
cb80: 72 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  r.");....return(
cb90: 2d 31 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  -1);..}...CACKEY
cba0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
cbb0: 22 47 45 54 20 44 41 54 41 20 72 65 73 75 6c 74  "GET DATA result
cbc0: 22 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65 29  ", buffer, size)
cbd0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
cbe0: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
cbf0: 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72  ng in success, r
cc00: 65 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20  ead %lu bytes", 
cc10: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
cc20: 73 69 7a 65 29 3b 0a 0a 09 72 65 74 75 72 6e 28  size);...return(
cc30: 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  size);.}../*. * 
cc40: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
cc50: 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72  ssize_t cackey_r
cc60: 65 61 64 5f 62 75 66 66 65 72 28 73 74 72 75 63  ead_buffer(struc
cc70: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
cc80: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
cc90: 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65  ar *buffer, size
cca0: 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e  _t count, unsign
ccb0: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20  ed char t_or_v, 
ccc0: 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f  size_t initial_o
ccd0: 66 66 73 65 74 29 3b 0a 20 2a 0a 20 2a 20 41 52  ffset);. *. * AR
cce0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73  GUMENTS. *     s
ccf0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
cd00: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
cd10: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
cd20: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
cd30: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
cd40: 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a 20 20  har *buffer. *  
cd50: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42 75 66         [OUT] Buf
cd60: 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  fer. *. *     si
cd70: 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20 20 20  ze_t count. *   
cd80: 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20        Number of 
cd90: 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d 70 74  bytes to attempt
cda0: 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a 20 20   to read. *. *  
cdb0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
cdc0: 20 74 5f 6f 72 5f 76 0a 20 2a 20 20 20 20 20 20   t_or_v. *      
cdd0: 20 20 20 53 65 6c 65 63 74 20 74 68 65 20 54 2d     Select the T-
cde0: 62 75 66 66 65 72 20 28 30 31 29 20 6f 72 20 56  buffer (01) or V
cdf0: 2d 62 75 66 66 65 72 20 28 30 32 29 20 74 6f 20  -buffer (02) to 
ce00: 72 65 61 64 20 66 72 6f 6d 2e 20 20 0a 20 2a 0a  read from.  . *.
ce10: 20 2a 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e   *     size_t in
ce20: 69 74 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20  itial_offset. * 
ce30: 20 20 20 20 20 20 20 20 53 70 65 63 69 66 79 20          Specify 
ce40: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  the offset to be
ce50: 67 69 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f  gin the read fro
ce60: 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52  m. *. *. * RETUR
ce70: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54  N VALUE. *     T
ce80: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
ce90: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
cea0: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
ceb0: 79 20 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e  y read, or -1 on
cec0: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f   error.. *. * NO
ced0: 54 45 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  TES. *     None.
cee0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73   *. */.static ss
cef0: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 72 65 61  ize_t cackey_rea
cf00: 64 5f 62 75 66 66 65 72 28 73 74 72 75 63 74 20  d_buffer(struct 
cf10: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
cf20: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
cf30: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
cf40: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64   count, unsigned
cf50: 20 63 68 61 72 20 74 5f 6f 72 5f 76 2c 20 73 69   char t_or_v, si
cf60: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
cf70: 73 65 74 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  set) {..unsigned
cf80: 20 63 68 61 72 20 2a 69 6e 69 74 5f 62 75 66 66   char *init_buff
cf90: 65 72 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74  er;..size_t init
cfa0: 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a 65 5f 74 20  _count;..size_t 
cfb0: 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66  init_initial_off
cfc0: 73 65 74 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f 66  set;...size_t of
cfd0: 66 73 65 74 20 3d 20 30 2c 20 6d 61 78 5f 6f 66  fset = 0, max_of
cfe0: 66 73 65 74 2c 20 6d 61 78 5f 63 6f 75 6e 74 3b  fset, max_count;
cff0: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
d000: 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e 74 31 36 5f  cmd[2];..uint16_
d010: 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74  t respcode;..int
d020: 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43   send_ret;...CAC
d030: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
d040: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
d050: 6e 69 74 5f 62 75 66 66 65 72 20 3d 20 62 75 66  nit_buffer = buf
d060: 66 65 72 3b 0a 09 69 6e 69 74 5f 63 6f 75 6e 74  fer;..init_count
d070: 20 3d 20 63 6f 75 6e 74 3b 0a 09 69 6e 69 74 5f   = count;..init_
d080: 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 3d  initial_offset =
d090: 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 3b   initial_offset;
d0a0: 0a 0a 09 6d 61 78 5f 6f 66 66 73 65 74 20 3d 20  ...max_offset = 
d0b0: 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f 63 6f 75 6e  count;..max_coun
d0c0: 74 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  t = CACKEY_APDU_
d0d0: 4d 54 55 3b 0a 0a 09 69 66 20 28 74 5f 6f 72 5f  MTU;...if (t_or_
d0e0: 76 20 21 3d 20 31 20 26 26 20 74 5f 6f 72 5f 76  v != 1 && t_or_v
d0f0: 20 21 3d 20 32 29 20 7b 0a 09 09 43 41 43 4b 45   != 2) {...CACKE
d100: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d110: 49 6e 76 61 6c 69 64 20 54 20 6f 72 20 56 20 70  Invalid T or V p
d120: 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
d130: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
d140: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
d150: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
d160: 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f 72 5f 76 3b  cmd[0] = t_or_v;
d170: 0a 0a 09 77 68 69 6c 65 20 28 31 29 20 7b 0a 09  ...while (1) {..
d180: 09 69 66 20 28 6f 66 66 73 65 74 20 3e 3d 20 6d  .if (offset >= m
d190: 61 78 5f 6f 66 66 73 65 74 29 20 7b 0a 09 09 09  ax_offset) {....
d1a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
d1b0: 4e 54 46 28 22 42 75 66 66 65 72 20 74 6f 6f 20  NTF("Buffer too 
d1c0: 73 6d 61 6c 6c 2c 20 72 65 74 75 72 6e 69 6e 67  small, returning
d1d0: 20 77 68 61 74 20 77 65 20 67 6f 74 2e 2e 2e 22   what we got..."
d1e0: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
d1f0: 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78  }....count = max
d200: 5f 6f 66 66 73 65 74 20 2d 20 6f 66 66 73 65 74  _offset - offset
d210: 3b 0a 09 09 69 66 20 28 63 6f 75 6e 74 20 3e 20  ;...if (count > 
d220: 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  max_count) {....
d230: 63 6f 75 6e 74 20 3d 20 6d 61 78 5f 63 6f 75 6e  count = max_coun
d240: 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d 64 5b 31 5d  t;...}....cmd[1]
d250: 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 73 65 6e   = count;....sen
d260: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
d270: 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47  end_apdu(slot, G
d280: 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41  SCIS_CLASS_GLOBA
d290: 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53 43 49  L_PLATFORM, GSCI
d2a0: 53 5f 49 4e 53 54 52 5f 52 45 41 44 5f 42 55 46  S_INSTR_READ_BUF
d2b0: 46 45 52 2c 20 28 28 69 6e 69 74 69 61 6c 5f 6f  FER, ((initial_o
d2c0: 66 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20  ffset + offset) 
d2d0: 3e 3e 20 38 29 20 26 20 30 78 66 66 2c 20 28 69  >> 8) & 0xff, (i
d2e0: 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20  nitial_offset + 
d2f0: 6f 66 66 73 65 74 29 20 26 20 30 78 66 66 2c 20  offset) & 0xff, 
d300: 73 69 7a 65 6f 66 28 63 6d 64 29 2c 20 63 6d 64  sizeof(cmd), cmd
d310: 2c 20 30 78 30 30 2c 20 26 72 65 73 70 63 6f 64  , 0x00, &respcod
d320: 65 2c 20 62 75 66 66 65 72 20 2b 20 6f 66 66 73  e, buffer + offs
d330: 65 74 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 09  et, &count);....
d340: 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20  if (send_ret == 
d350: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45  CACKEY_PCSC_E_RE
d360: 54 52 59 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  TRY) {....CACKEY
d370: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
d380: 44 50 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c  DPU Sending fail
d390: 65 64 2c 20 72 65 74 72 79 69 6e 67 20 72 65 61  ed, retrying rea
d3a0: 64 20 62 75 66 66 65 72 22 29 3b 0a 0a 09 09 09  d buffer");.....
d3b0: 72 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 72 65  return(cackey_re
d3c0: 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c 20  ad_buffer(slot, 
d3d0: 69 6e 69 74 5f 62 75 66 66 65 72 2c 20 69 6e 69  init_buffer, ini
d3e0: 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f 72 5f 76 2c  t_count, t_or_v,
d3f0: 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66   init_initial_of
d400: 66 73 65 74 29 29 3b 0a 09 09 7d 0a 0a 09 09 69  fset));...}....i
d410: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
d420: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
d430: 20 7b 0a 09 09 09 69 66 20 28 72 65 73 70 63 6f   {....if (respco
d440: 64 65 20 3d 3d 20 30 78 36 41 38 36 29 20 7b 0a  de == 0x6A86) {.
d450: 09 09 09 09 69 66 20 28 6d 61 78 5f 63 6f 75 6e  ....if (max_coun
d460: 74 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 09 62  t == 1) {......b
d470: 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
d480: 09 6d 61 78 5f 63 6f 75 6e 74 20 3d 20 6d 61 78  .max_count = max
d490: 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a 0a 09 09 09  _count / 2;.....
d4a0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
d4b0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
d4c0: 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
d4d0: 73 65 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c  send_apdu() fail
d4e0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
d4f0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
d500: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
d510: 0a 09 09 6f 66 66 73 65 74 20 2b 3d 20 63 6f 75  ...offset += cou
d520: 6e 74 3b 0a 0a 09 09 69 66 20 28 63 6f 75 6e 74  nt;....if (count
d530: 20 3c 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b 0a   < max_count) {.
d540: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d550: 50 52 49 4e 54 46 28 22 53 68 6f 72 74 20 72 65  PRINTF("Short re
d560: 61 64 20 2d 2d 20 63 6f 75 6e 74 20 3d 20 25 69  ad -- count = %i
d570: 2c 20 63 6d 64 5b 31 5d 20 3d 20 25 69 22 2c 20  , cmd[1] = %i", 
d580: 28 69 6e 74 29 20 63 6f 75 6e 74 2c 20 28 69 6e  (int) count, (in
d590: 74 29 20 63 6d 64 5b 31 5d 29 3b 0a 0a 09 09 09  t) cmd[1]);.....
d5a0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 23  break;...}..}..#
d5b0: 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52  ifdef CACKEY_PAR
d5c0: 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f  ANOID.#  ifdef _
d5d0: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a  POSIX_SSIZE_MAX.
d5e0: 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50  .if (offset > _P
d5f0: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20  OSIX_SSIZE_MAX) 
d600: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
d610: 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20  _PRINTF("Offset 
d620: 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20  exceeds maximum 
d630: 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67  value, returning
d640: 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61   in failure. (ma
d650: 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20  x = %li, offset 
d660: 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20  = %lu)", (long) 
d670: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
d680: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
d690: 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65  ) offset);....re
d6a0: 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
d6b0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 43  endif.#endif...C
d6c0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d6d0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
d6e0: 20 73 75 63 63 65 73 73 2c 20 72 65 61 64 20 25   success, read %
d6f0: 6c 75 20 62 79 74 65 73 22 2c 20 28 75 6e 73 69  lu bytes", (unsi
d700: 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65  gned long) offse
d710: 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 6f 66 66  t);...return(off
d720: 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  set);.}../*. * S
d730: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
d740: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
d750: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
d760: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
d770: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
d780: 64 20 63 68 61 72 20 2a 61 69 64 2c 20 73 69 7a  d char *aid, siz
d790: 65 5f 74 20 61 69 64 5f 6c 65 6e 29 3b 0a 20 2a  e_t aid_len);. *
d7a0: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
d7b0: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
d7c0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
d7d0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
d7e0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
d7f0: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  o. *. *     unsi
d800: 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 0a 20  gned char *aid. 
d810: 2a 20 20 20 20 20 20 20 20 20 42 75 66 66 65 72  *         Buffer
d820: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 41 70 70 6c   containing Appl
d830: 65 74 20 49 44 20 74 6f 20 73 65 6c 65 63 74 0a  et ID to select.
d840: 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f 74   *. *     size_t
d850: 20 61 69 64 5f 6c 65 6e 0a 20 2a 20 20 20 20 20   aid_len. *     
d860: 20 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79      Number of by
d870: 74 65 73 20 69 6e 20 74 68 65 20 22 61 69 64 22  tes in the "aid"
d880: 20 28 41 70 70 6c 65 74 20 49 44 29 20 70 61 72   (Applet ID) par
d890: 61 6d 65 74 65 72 0a 20 2a 0a 20 2a 20 52 45 54  ameter. *. * RET
d8a0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
d8b0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
d8c0: 4b 20 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63  K         On suc
d8d0: 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b  cess. *     CACK
d8e0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
d8f0: 43 20 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a  C    On error. *
d900: 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
d910: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61   None. *. */.sta
d920: 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
d930: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
d940: 6c 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65  let(struct cacke
d950: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
d960: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64  signed char *aid
d970: 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e  , size_t aid_len
d980: 29 20 7b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65  ) {..int send_re
d990: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
d9a0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
d9b0: 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  .");...CACKEY_DE
d9c0: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 53 65  BUG_PRINTBUF("Se
d9d0: 6c 65 63 74 69 6e 67 20 61 70 70 6c 65 74 3a 22  lecting applet:"
d9e0: 2c 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 3b  , aid, aid_len);
d9f0: 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61  ...send_ret = ca
da00: 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73  ckey_send_apdu(s
da10: 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53  lot, GSCIS_CLASS
da20: 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f  _ISO7816, GSCIS_
da30: 49 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 47 53  INSTR_SELECT, GS
da40: 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43 54  CIS_PARAM_SELECT
da50: 5f 41 50 50 4c 45 54 2c 20 30 78 30 30 2c 20 61  _APPLET, 0x00, a
da60: 69 64 5f 6c 65 6e 2c 20 61 69 64 2c 20 30 78 30  id_len, aid, 0x0
da70: 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  0, NULL, NULL, N
da80: 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 73 65 6e 64  ULL);...if (send
da90: 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
daa0: 43 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09  CSC_E_RETRY) {..
dab0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
dac0: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
dad0: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79  ng failed, retry
dae0: 69 6e 67 20 73 65 6c 65 63 74 20 61 70 70 6c 65  ing select apple
daf0: 74 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 63  t");....return(c
db00: 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70  ackey_select_app
db10: 6c 65 74 28 73 6c 6f 74 2c 20 61 69 64 2c 20 61  let(slot, aid, a
db20: 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d 0a 0a 09 69  id_len));..}...i
db30: 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43  f (send_ret != C
db40: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
db50: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
db60: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
db70: 20 74 6f 20 6f 70 65 6e 20 61 70 70 6c 65 74 2c   to open applet,
db80: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
db90: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
dba0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
dbb0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
dbc0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dbd0: 4e 54 46 28 22 53 75 63 63 65 73 73 66 75 6c 6c  NTF("Successfull
dbe0: 79 20 73 65 6c 65 63 74 65 64 20 66 69 6c 65 22  y selected file"
dbf0: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
dc00: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
dc10: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
dc20: 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72  . *     cackey_r
dc30: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
dc40: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63  _file(struct cac
dc50: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
dc60: 75 69 6e 74 31 36 5f 74 20 65 66 29 3b 0a 20 2a  uint16_t ef);. *
dc70: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
dc80: 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63 6b       struct cack
dc90: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
dca0: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
dcb0: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
dcc0: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e 74  o. *. *     uint
dcd0: 31 36 5f 74 20 65 66 0a 20 2a 20 20 20 20 20 20  16_t ef. *      
dce0: 20 20 20 45 6c 65 6d 65 6e 74 61 6c 20 46 69 6c     Elemental Fil
dcf0: 65 20 74 6f 20 73 65 6c 65 63 74 0a 20 2a 0a 20  e to select. *. 
dd00: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
dd10: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
dd20: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
dd30: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
dd40: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
dd50: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
dd60: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
dd70: 2a 20 20 20 20 20 54 68 69 73 20 73 65 6c 65 63  *     This selec
dd80: 74 73 20 61 6e 20 45 6c 65 6d 65 6e 74 61 72 79  ts an Elementary
dd90: 20 46 69 6c 65 20 28 45 46 29 20 75 6e 64 65 72   File (EF) under
dda0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 73   the currently s
ddb0: 65 6c 65 63 74 65 64 0a 20 2a 20 20 20 20 20 44  elected. *     D
ddc0: 65 64 69 63 61 74 65 64 20 46 69 6c 65 20 28 44  edicated File (D
ddd0: 46 29 0a 20 2a 0a 20 2a 20 20 20 20 20 54 79 70  F). *. *     Typ
dde0: 69 63 61 6c 6c 79 20 74 68 69 73 20 69 73 20 63  ically this is c
ddf0: 61 6c 6c 65 64 20 61 66 74 65 72 20 73 65 6c 65  alled after sele
de00: 63 74 69 6e 67 20 74 68 65 20 63 6f 72 72 65 63  cting the correc
de10: 74 20 41 70 70 6c 65 74 20 28 75 73 69 6e 67 0a  t Applet (using.
de20: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 65   *     cackey_se
de30: 6c 65 63 74 5f 61 70 70 6c 65 74 29 20 66 6f 72  lect_applet) for
de40: 20 56 4d 20 63 61 72 64 73 0a 20 2a 0a 20 2a 2f   VM cards. *. */
de50: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
de60: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
de70: 5f 66 69 6c 65 28 73 74 72 75 63 74 20 63 61 63  _file(struct cac
de80: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
de90: 75 69 6e 74 31 36 5f 74 20 65 66 29 20 7b 0a 09  uint16_t ef) {..
dea0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 66 69  unsigned char fi
deb0: 64 5f 62 75 66 5b 32 5d 3b 0a 09 69 6e 74 20 73  d_buf[2];..int s
dec0: 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  end_ret;...CACKE
ded0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
dee0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 2f 2a 20  Called.");.../* 
def0: 4f 70 65 6e 20 74 68 65 20 65 6c 65 6d 65 6e 74  Open the element
df00: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 09 66 69 64  ary file */..fid
df10: 5f 62 75 66 5b 30 5d 20 3d 20 28 65 66 20 3e 3e  _buf[0] = (ef >>
df20: 20 38 29 20 26 20 30 78 66 66 3b 0a 09 66 69 64   8) & 0xff;..fid
df30: 5f 62 75 66 5b 31 5d 20 3d 20 65 66 20 26 20 30  _buf[1] = ef & 0
df40: 78 66 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  xff;...CACKEY_DE
df50: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65 6c 65  BUG_PRINTF("Sele
df60: 63 74 69 6e 67 20 66 69 6c 65 3a 20 25 30 34 6c  cting file: %04l
df70: 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  x", (unsigned lo
df80: 6e 67 29 20 65 66 29 3b 0a 0a 09 73 65 6e 64 5f  ng) ef);...send_
df90: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e  ret = cackey_sen
dfa0: 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43  d_apdu(slot, GSC
dfb0: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
dfc0: 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45  , GSCIS_INSTR_SE
dfd0: 4c 45 43 54 2c 20 30 78 30 32 2c 20 30 78 30 43  LECT, 0x02, 0x0C
dfe0: 2c 20 73 69 7a 65 6f 66 28 66 69 64 5f 62 75 66  , sizeof(fid_buf
dff0: 29 2c 20 66 69 64 5f 62 75 66 2c 20 30 78 30 30  ), fid_buf, 0x00
e000: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55  , NULL, NULL, NU
e010: 4c 4c 29 3b 0a 09 69 66 20 28 73 65 6e 64 5f 72  LL);..if (send_r
e020: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
e030: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
e040: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e050: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "Failed to open 
e060: 66 69 6c 65 2c 20 72 65 74 75 72 6e 69 6e 67 20  file, returning 
e070: 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09  in failure");...
e080: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
e090: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
e0a0: 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
e0b0: 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73  G_PRINTF("Succes
e0c0: 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20  sfully selected 
e0d0: 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e  file");...return
e0e0: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
e0f0: 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
e100: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f 69  POSIS. *     voi
e110: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c  d cackey_free_tl
e120: 76 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  v(struct cackey_
e130: 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74  tlv_entity *root
e140: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
e150: 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74  TS. *     struct
e160: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
e170: 74 79 20 2a 72 6f 6f 74 0a 20 2a 20 20 20 20 20  ty *root. *     
e180: 20 20 20 20 52 6f 6f 74 20 6f 66 20 74 68 65 20      Root of the 
e190: 54 4c 56 20 6c 69 73 74 20 74 6f 20 73 74 61 72  TLV list to star
e1a0: 74 20 66 72 65 65 69 6e 67 0a 20 2a 0a 20 2a 20  t freeing. *. * 
e1b0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
e1c0: 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e      None. *. * N
e1d0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
e1e0: 20 66 75 6e 63 74 69 6f 6e 20 66 72 65 65 73 20   function frees 
e1f0: 74 68 65 20 54 4c 56 20 6c 69 6e 6b 65 64 20 6c  the TLV linked l
e200: 69 73 74 65 64 20 72 65 74 75 72 6e 65 64 20 66  isted returned f
e210: 72 6f 6d 0a 20 2a 20 20 20 20 20 22 63 61 63 6b  rom. *     "cack
e220: 65 79 5f 72 65 61 64 5f 74 6c 76 22 0a 20 2a 0a  ey_read_tlv". *.
e230: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
e240: 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28  cackey_free_tlv(
e250: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c  struct cackey_tl
e260: 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 29 20  v_entity *root) 
e270: 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  {..struct cackey
e280: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72  _tlv_entity *cur
e290: 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09 69 66 20 28  r, *next;...if (
e2a0: 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  root == NULL) {.
e2b0: 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66  ..return;..}...f
e2c0: 6f 72 20 28 63 75 72 72 20 3d 20 72 6f 6f 74 3b  or (curr = root;
e2d0: 20 63 75 72 72 3b 20 63 75 72 72 20 3d 20 6e 65   curr; curr = ne
e2e0: 78 74 29 20 7b 0a 09 09 6e 65 78 74 20 3d 20 63  xt) {...next = c
e2f0: 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a 0a 09 09 73  urr->_next;....s
e300: 77 69 74 63 68 20 28 63 75 72 72 2d 3e 74 61 67  witch (curr->tag
e310: 29 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ) {....case GSCI
e320: 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45 3a  S_TAG_ACR_TABLE:
e330: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
e340: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
e350: 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61  ....if (curr->va
e360: 6c 75 65 29 20 7b 0a 09 09 09 09 09 66 72 65 65  lue) {......free
e370: 28 63 75 72 72 2d 3e 76 61 6c 75 65 29 3b 0a 09  (curr->value);..
e380: 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
e390: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
e3a0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 09 69  G_CARDURL:.....i
e3b0: 66 20 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  f (curr->value_c
e3c0: 61 72 64 75 72 6c 29 20 7b 0a 09 09 09 09 09 66  ardurl) {......f
e3d0: 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ree(curr->value_
e3e0: 63 61 72 64 75 72 6c 29 3b 0a 09 09 09 09 7d 0a  cardurl);.....}.
e3f0: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a  ....break;...}..
e400: 09 09 66 72 65 65 28 63 75 72 72 29 3b 0a 09 7d  ..free(curr);..}
e410: 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  ...return;.}../*
e420: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
e430: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
e440: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
e450: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
e460: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
e470: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
e480: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
e490: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
e4a0: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
e4b0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28  cackey_read_tlv(
e4c0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
e4d0: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 73 74 72  ot *slot) {..str
e4e0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
e4f0: 6e 74 69 74 79 20 2a 63 75 72 72 5f 65 6e 74 69  ntity *curr_enti
e500: 74 79 2c 20 2a 72 6f 6f 74 20 3d 20 4e 55 4c 4c  ty, *root = NULL
e510: 2c 20 2a 6c 61 73 74 20 3d 20 4e 55 4c 4c 3b 0a  , *last = NULL;.
e520: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74  .unsigned char t
e530: 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 74 76 61 6c  len_buf[2], tval
e540: 5f 62 75 66 5b 31 30 32 34 5d 2c 20 2a 74 76 61  _buf[1024], *tva
e550: 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  l;..unsigned cha
e560: 72 20 76 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20 76  r vlen_buf[2], v
e570: 76 61 6c 5f 62 75 66 5b 38 31 39 32 5d 2c 20 2a  val_buf[8192], *
e580: 76 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64 20  vval;..unsigned 
e590: 63 68 61 72 20 2a 74 6d 70 62 75 66 3b 0a 09 75  char *tmpbuf;..u
e5a0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 6d 70  nsigned long tmp
e5b0: 62 75 66 6c 65 6e 3b 0a 09 73 73 69 7a 65 5f 74  buflen;..ssize_t
e5c0: 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b 0a 09 73 73   tlen, vlen;..ss
e5d0: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
e5e0: 09 73 69 7a 65 5f 74 20 6f 66 66 73 65 74 5f 74  .size_t offset_t
e5f0: 20 3d 20 30 2c 20 6f 66 66 73 65 74 5f 76 20 3d   = 0, offset_v =
e600: 20 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68   0;..unsigned ch
e610: 61 72 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20  ar tag;..size_t 
e620: 6c 65 6e 67 74 68 3b 0a 23 69 66 64 65 66 20 48  length;.#ifdef H
e630: 41 56 45 5f 4c 49 42 5a 0a 09 69 6e 74 20 75 6e  AVE_LIBZ..int un
e640: 63 6f 6d 70 72 65 73 73 5f 72 65 74 3b 0a 23 65  compress_ret;.#e
e650: 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ndif...CACKEY_DE
e660: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
e670: 65 64 2e 22 29 3b 0a 0a 09 72 65 61 64 5f 72 65  ed.");...read_re
e680: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
e690: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 6c 65  buffer(slot, tle
e6a0: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 74 6c  n_buf, sizeof(tl
e6b0: 65 6e 5f 62 75 66 29 2c 20 31 2c 20 6f 66 66 73  en_buf), 1, offs
e6c0: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
e6d0: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 74  _ret != sizeof(t
e6e0: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
e6f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e700: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
e710: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
e720: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
e730: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74 6c  n(NULL);..}...tl
e740: 65 6e 20 3d 20 28 74 6c 65 6e 5f 62 75 66 5b 31  en = (tlen_buf[1
e750: 5d 20 3c 3c 20 38 29 20 7c 20 74 6c 65 6e 5f 62  ] << 8) | tlen_b
e760: 75 66 5b 30 5d 3b 0a 0a 09 72 65 61 64 5f 72 65  uf[0];...read_re
e770: 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  t = cackey_read_
e780: 62 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 6c 65  buffer(slot, vle
e790: 6e 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 76 6c  n_buf, sizeof(vl
e7a0: 65 6e 5f 62 75 66 29 2c 20 32 2c 20 6f 66 66 73  en_buf), 2, offs
e7b0: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
e7c0: 5f 72 65 74 20 21 3d 20 73 69 7a 65 6f 66 28 76  _ret != sizeof(v
e7d0: 6c 65 6e 5f 62 75 66 29 29 20 7b 0a 09 09 43 41  len_buf)) {...CA
e7e0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
e7f0: 46 28 22 52 65 61 64 20 66 61 69 6c 65 64 2c 20  F("Read failed, 
e800: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
e810: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
e820: 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 76 6c  n(NULL);..}...vl
e830: 65 6e 20 3d 20 28 76 6c 65 6e 5f 62 75 66 5b 31  en = (vlen_buf[1
e840: 5d 20 3c 3c 20 38 29 20 7c 20 76 6c 65 6e 5f 62  ] << 8) | vlen_b
e850: 75 66 5b 30 5d 3b 0a 0a 09 43 41 43 4b 45 59 5f  uf[0];...CACKEY_
e860: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 61  DEBUG_PRINTF("Ta
e870: 67 20 4c 65 6e 67 74 68 20 3d 20 25 6c 75 2c 20  g Length = %lu, 
e880: 56 61 6c 75 65 20 4c 65 6e 67 74 68 20 3d 20 25  Value Length = %
e890: 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
e8a0: 6f 6e 67 29 20 74 6c 65 6e 2c 20 28 75 6e 73 69  ong) tlen, (unsi
e8b0: 67 6e 65 64 20 6c 6f 6e 67 29 20 76 6c 65 6e 29  gned long) vlen)
e8c0: 3b 0a 0a 09 6f 66 66 73 65 74 5f 74 20 2b 3d 20  ;...offset_t += 
e8d0: 32 3b 0a 09 6f 66 66 73 65 74 5f 76 20 2b 3d 20  2;..offset_v += 
e8e0: 32 3b 0a 0a 09 69 66 20 28 74 6c 65 6e 20 3e 20  2;...if (tlen > 
e8f0: 73 69 7a 65 6f 66 28 74 76 61 6c 5f 62 75 66 29  sizeof(tval_buf)
e900: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
e910: 55 47 5f 50 52 49 4e 54 46 28 22 54 61 67 20 6c  UG_PRINTF("Tag l
e920: 65 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72  ength is too lar
e930: 67 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ge, returning in
e940: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e950: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e960: 0a 09 69 66 20 28 76 6c 65 6e 20 3e 20 73 69 7a  ..if (vlen > siz
e970: 65 6f 66 28 76 76 61 6c 5f 62 75 66 29 29 20 7b  eof(vval_buf)) {
e980: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e990: 50 52 49 4e 54 46 28 22 56 61 6c 75 65 20 6c 65  PRINTF("Value le
e9a0: 6e 67 74 68 20 69 73 20 74 6f 6f 20 6c 61 72 67  ngth is too larg
e9b0: 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  e, returning in 
e9c0: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
e9d0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
e9e0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
e9f0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
ea00: 6c 6f 74 2c 20 74 76 61 6c 5f 62 75 66 2c 20 74  lot, tval_buf, t
ea10: 6c 65 6e 2c 20 31 2c 20 6f 66 66 73 65 74 5f 74  len, 1, offset_t
ea20: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
ea30: 20 21 3d 20 74 6c 65 6e 29 20 7b 0a 09 09 43 41   != tlen) {...CA
ea40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ea50: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
ea60: 64 20 65 6e 74 69 72 65 20 54 2d 62 75 66 66 65  d entire T-buffe
ea70: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
ea80: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
ea90: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
eaa0: 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b  .read_ret = cack
eab0: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
eac0: 6c 6f 74 2c 20 76 76 61 6c 5f 62 75 66 2c 20 76  lot, vval_buf, v
ead0: 6c 65 6e 2c 20 32 2c 20 6f 66 66 73 65 74 5f 76  len, 2, offset_v
eae0: 29 3b 0a 09 69 66 20 28 72 65 61 64 5f 72 65 74  );..if (read_ret
eaf0: 20 21 3d 20 76 6c 65 6e 29 20 7b 0a 09 09 43 41   != vlen) {...CA
eb00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
eb10: 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 61  F("Unable to rea
eb20: 64 20 65 6e 74 69 72 65 20 56 2d 62 75 66 66 65  d entire V-buffe
eb30: 72 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  r, returning in 
eb40: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
eb50: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
eb60: 09 74 76 61 6c 20 3d 20 74 76 61 6c 5f 62 75 66  .tval = tval_buf
eb70: 3b 0a 09 76 76 61 6c 20 3d 20 76 76 61 6c 5f 62  ;..vval = vval_b
eb80: 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6c 65 6e  uf;..while (tlen
eb90: 20 3e 20 30 20 26 26 20 76 6c 65 6e 20 3e 20 30   > 0 && vlen > 0
eba0: 29 20 7b 0a 09 09 74 61 67 20 3d 20 2a 74 76 61  ) {...tag = *tva
ebb0: 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 74  l;...tval++;...t
ebc0: 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66 20 28 2a 74  len--;....if (*t
ebd0: 76 61 6c 20 3d 3d 20 30 78 66 66 29 20 7b 0a 09  val == 0xff) {..
ebe0: 09 09 6c 65 6e 67 74 68 20 3d 20 28 74 76 61 6c  ..length = (tval
ebf0: 5b 32 5d 20 3c 3c 20 38 29 20 7c 20 74 76 61 6c  [2] << 8) | tval
ec00: 5b 31 5d 3b 0a 09 09 09 74 76 61 6c 20 2b 3d 20  [1];....tval += 
ec10: 33 3b 0a 09 09 09 74 6c 65 6e 20 2d 3d 20 33 3b  3;....tlen -= 3;
ec20: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c  ...} else {....l
ec30: 65 6e 67 74 68 20 3d 20 2a 74 76 61 6c 3b 0a 09  ength = *tval;..
ec40: 09 09 74 76 61 6c 2b 2b 3b 0a 09 09 09 74 6c 65  ..tval++;....tle
ec50: 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b  n--;...}....CACK
ec60: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ec70: 22 54 61 67 3a 20 25 73 20 28 25 30 32 78 29 22  "Tag: %s (%02x)"
ec80: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
ec90: 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28 74  UNC_TAG_TO_STR(t
eca0: 61 67 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  ag), (unsigned i
ecb0: 6e 74 29 20 74 61 67 29 3b 0a 09 09 43 41 43 4b  nt) tag);...CACK
ecc0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
ecd0: 46 28 22 56 61 6c 75 65 3a 22 2c 20 76 76 61 6c  F("Value:", vval
ece0: 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 63 75  , length);....cu
ecf0: 72 72 5f 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c  rr_entity = NULL
ed00: 3b 0a 09 09 73 77 69 74 63 68 20 28 74 61 67 29  ;...switch (tag)
ed10: 20 7b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53   {....case GSCIS
ed20: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
ed30: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
ed40: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63  malloc(sizeof(*c
ed50: 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 09 09  urr_entity));...
ed60: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  ..curr_entity->v
ed70: 61 6c 75 65 5f 63 61 72 64 75 72 6c 20 3d 20 6d  alue_cardurl = m
ed80: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
ed90: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
eda0: 5f 63 61 72 64 75 72 6c 29 29 3b 0a 0a 09 09 09  _cardurl));.....
edb0: 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 65 6e 74  .memcpy(curr_ent
edc0: 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  ity->value_cardu
edd0: 72 6c 2d 3e 72 69 64 2c 20 76 76 61 6c 2c 20 35  rl->rid, vval, 5
ede0: 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  );.....curr_enti
edf0: 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  ty->value_cardur
ee00: 6c 2d 3e 61 70 70 74 79 70 65 20 3d 20 76 76 61  l->apptype = vva
ee10: 6c 5b 35 5d 3b 0a 09 09 09 09 63 75 72 72 5f 65  l[5];.....curr_e
ee20: 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72  ntity->value_car
ee30: 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 20 3d  durl->objectid =
ee40: 20 28 76 76 61 6c 5b 36 5d 20 3c 3c 20 38 29 20   (vval[6] << 8) 
ee50: 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09 09 09 09 63  | vval[7];.....c
ee60: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
ee70: 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
ee80: 20 3d 20 28 76 76 61 6c 5b 38 5d 20 3c 3c 20 38   = (vval[8] << 8
ee90: 29 20 7c 20 76 76 61 6c 5b 39 5d 3b 0a 0a 09 09  ) | vval[9];....
eea0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
eeb0: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
eec0: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
eed0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
eee0: 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43  eak;....case GSC
eef0: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
ef00: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
ef10: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
ef20: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
ef30: 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d  ;.....tmpbuf = m
ef40: 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 29 3b 0a 0a  alloc(length);..
ef50: 09 09 09 09 6d 65 6d 63 70 79 28 74 6d 70 62 75  ....memcpy(tmpbu
ef60: 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  f, vval, length)
ef70: 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  ;......curr_enti
ef80: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
ef90: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
efa0: 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
efb0: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
efc0: 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66  ->value = tmpbuf
efd0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
efe0: 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b  y->_next = NULL;
eff0: 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
f000: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43  case GSCIS_TAG_C
f010: 45 52 54 49 46 49 43 41 54 45 3a 0a 09 09 09 09  ERTIFICATE:.....
f020: 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61  curr_entity = ma
f030: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72  lloc(sizeof(*cur
f040: 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 23 69 66  r_entity));..#if
f050: 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 09  def HAVE_LIBZ...
f060: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
f070: 6e 67 74 68 20 2a 20 32 3b 0a 09 09 09 09 74 6d  ngth * 2;.....tm
f080: 70 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d  pbuf = malloc(tm
f090: 70 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 75  pbuflen);......u
f0a0: 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74 20 3d 20  ncompress_ret = 
f0b0: 75 6e 63 6f 6d 70 72 65 73 73 28 74 6d 70 62 75  uncompress(tmpbu
f0c0: 66 2c 20 26 74 6d 70 62 75 66 6c 65 6e 2c 20 76  f, &tmpbuflen, v
f0d0: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09  val, length);...
f0e0: 09 09 69 66 20 28 75 6e 63 6f 6d 70 72 65 73 73  ..if (uncompress
f0f0: 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a  _ret != Z_OK) {.
f100: 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
f110: 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64  G_PRINTF("Failed
f120: 20 74 6f 20 64 65 63 6f 6d 70 72 65 73 73 2c 20   to decompress, 
f130: 75 6e 63 6f 6d 70 72 65 73 73 28 29 20 72 65 74  uncompress() ret
f140: 75 72 6e 65 64 20 25 69 20 2d 2d 20 72 65 73 6f  urned %i -- reso
f150: 72 74 69 6e 67 20 74 6f 20 64 69 72 65 63 74 20  rting to direct 
f160: 63 6f 70 79 22 2c 20 75 6e 63 6f 6d 70 72 65 73  copy", uncompres
f170: 73 5f 72 65 74 29 3b 0a 0a 09 09 09 09 09 74 6d  s_ret);.......tm
f180: 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e 67 74 68  pbuflen = length
f190: 3b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 74 6d  ;......memcpy(tm
f1a0: 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  pbuf, vval, leng
f1b0: 74 68 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  th);.....}......
f1c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
f1d0: 4e 54 42 55 46 28 22 44 65 63 6f 6d 70 72 65 73  NTBUF("Decompres
f1e0: 73 65 64 20 74 6f 3a 22 2c 20 74 6d 70 62 75 66  sed to:", tmpbuf
f1f0: 2c 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 23 65  , tmpbuflen);.#e
f200: 6c 73 65 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  lse.....CACKEY_D
f210: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 69 73  EBUG_PRINTF("Mis
f220: 73 69 6e 67 20 5a 4c 49 42 20 53 75 70 70 6f 72  sing ZLIB Suppor
f230: 74 2c 20 74 68 69 73 20 63 65 72 74 69 66 69 63  t, this certific
f240: 61 74 65 20 69 73 20 6c 69 6b 65 6c 79 20 75 73  ate is likely us
f250: 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a 0a 09 09 09  eless...");.....
f260: 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65 6e  .tmpbuflen = len
f270: 67 74 68 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  gth;.....memcpy(
f280: 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65  tmpbuf, vval, le
f290: 6e 67 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ngth);.#endif...
f2a0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
f2b0: 74 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63  tag = tag;.....c
f2c0: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 6c 65 6e 67  urr_entity->leng
f2d0: 74 68 20 3d 20 74 6d 70 62 75 66 6c 65 6e 3b 0a  th = tmpbuflen;.
f2e0: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d  ....curr_entity-
f2f0: 3e 76 61 6c 75 65 20 3d 20 74 6d 70 62 75 66 3b  >value = tmpbuf;
f300: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
f310: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
f320: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
f330: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b  ase GSCIS_TAG_PK
f340: 43 53 31 35 3a 0a 09 09 09 09 63 75 72 72 5f 65  CS15:.....curr_e
f350: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
f360: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
f370: 74 79 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ty));......curr_
f380: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
f390: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
f3a0: 74 79 2d 3e 76 61 6c 75 65 5f 62 79 74 65 20 3d  ty->value_byte =
f3b0: 20 76 76 61 6c 5b 30 5d 3b 0a 09 09 09 09 63 75   vval[0];.....cu
f3c0: 72 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74  rr_entity->_next
f3d0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72   = NULL;......br
f3e0: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 76 76 61 6c  eak;...}....vval
f3f0: 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 76 6c   += length;...vl
f400: 65 6e 20 2d 3d 20 6c 65 6e 67 74 68 3b 0a 0a 09  en -= length;...
f410: 09 69 66 20 28 63 75 72 72 5f 65 6e 74 69 74 79  .if (curr_entity
f420: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 69   != NULL) {....i
f430: 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c 29  f (root == NULL)
f440: 20 7b 0a 09 09 09 09 72 6f 6f 74 20 3d 20 63 75   {.....root = cu
f450: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
f460: 0a 09 09 09 69 66 20 28 6c 61 73 74 20 21 3d 20  ....if (last != 
f470: 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 6c 61 73 74  NULL) {.....last
f480: 2d 3e 5f 6e 65 78 74 20 3d 20 63 75 72 72 5f 65  ->_next = curr_e
f490: 6e 74 69 74 79 3b 0a 09 09 09 7d 0a 0a 09 09 09  ntity;....}.....
f4a0: 6c 61 73 74 20 3d 20 63 75 72 72 5f 65 6e 74 69  last = curr_enti
f4b0: 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 72 65 74  ty;...}..}...ret
f4c0: 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d 0a 0a 2f 2a  urn(root);.}../*
f4d0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
f4e0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
f4f0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
f500: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
f510: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
f520: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
f530: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
f540: 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
f550: 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 74 72  y_free_certs(str
f560: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
f570: 69 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c  identity *start,
f580: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 69   size_t count, i
f590: 6e 74 20 66 72 65 65 5f 73 74 61 72 74 29 20 7b  nt free_start) {
f5a0: 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09  ..size_t idx;...
f5b0: 69 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c  if (start == NUL
f5c0: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09  L) {...return;..
f5d0: 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
f5e0: 3b 20 69 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69  ; idx < count; i
f5f0: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 73 74  dx++) {...if (st
f600: 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  art[idx].certifi
f610: 63 61 74 65 29 20 7b 0a 09 09 09 66 72 65 65 28  cate) {....free(
f620: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
f630: 66 69 63 61 74 65 29 3b 0a 09 09 7d 0a 09 7d 0a  ficate);...}..}.
f640: 0a 09 69 66 20 28 66 72 65 65 5f 73 74 61 72 74  ..if (free_start
f650: 29 20 7b 0a 09 09 66 72 65 65 28 73 74 61 72 74  ) {...free(start
f660: 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a  );..}...return;.
f670: 7d 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  }..static struct
f680: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
f690: 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 63 6f  ntity *cackey_co
f6a0: 70 79 5f 63 65 72 74 73 28 73 74 72 75 63 74 20  py_certs(struct 
f6b0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f6c0: 74 69 74 79 20 2a 64 65 73 74 2c 20 73 74 72 75  tity *dest, stru
f6d0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
f6e0: 64 65 6e 74 69 74 79 20 2a 73 74 61 72 74 2c 20  dentity *start, 
f6f0: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 29 20 7b 0a  size_t count) {.
f700: 09 73 69 7a 65 5f 74 20 69 64 78 3b 0a 0a 09 69  .size_t idx;...i
f710: 66 20 28 73 74 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (start == NULL
f720: 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  ) {...return(NUL
f730: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 64 65 73  L);..}...if (des
f740: 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 64  t == NULL) {...d
f750: 65 73 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  est = malloc(siz
f760: 65 6f 66 28 2a 64 65 73 74 29 20 2a 20 63 6f 75  eof(*dest) * cou
f770: 6e 74 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  nt);..}...for (i
f780: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f  dx = 0; idx < co
f790: 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
f7a0: 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f 74 79 70  dest[idx].id_typ
f7b0: 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 69  e = start[idx].i
f7c0: 64 5f 74 79 70 65 3b 0a 0a 09 09 73 77 69 74 63  d_type;....switc
f7d0: 68 20 28 64 65 73 74 5b 69 64 78 5d 2e 69 64 5f  h (dest[idx].id_
f7e0: 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
f7f0: 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43  CACKEY_ID_TYPE_C
f800: 41 43 3a 0a 09 09 09 09 6d 65 6d 63 70 79 28 64  AC:.....memcpy(d
f810: 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61  est[idx].card.ca
f820: 63 2e 61 70 70 6c 65 74 2c 20 73 74 61 72 74 5b  c.applet, start[
f830: 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e 61 70  idx].card.cac.ap
f840: 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 64 65 73  plet, sizeof(des
f850: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e  t[idx].card.cac.
f860: 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 64 65  applet));.....de
f870: 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63  st[idx].card.cac
f880: 2e 66 69 6c 65 20 3d 20 73 74 61 72 74 5b 69 64  .file = start[id
f890: 78 5d 2e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65  x].card.cac.file
f8a0: 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
f8b0: 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
f8c0: 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 64 65 73  YPE_PIV:.....des
f8d0: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e  t[idx].card.piv.
f8e0: 6b 65 79 5f 69 64 20 3d 20 73 74 61 72 74 5b 69  key_id = start[i
f8f0: 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6b 65 79  dx].card.piv.key
f900: 5f 69 64 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  _id;.....memcpy(
f910: 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70  dest[idx].card.p
f920: 69 76 2e 6c 61 62 65 6c 2c 20 73 74 61 72 74 5b  iv.label, start[
f930: 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c 61  idx].card.piv.la
f940: 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 73 74  bel, sizeof(dest
f950: 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76 2e 6c  [idx].card.piv.l
f960: 61 62 65 6c 29 29 3b 0a 09 09 09 09 62 72 65 61  abel));.....brea
f970: 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45  k;....case CACKE
f980: 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
f990: 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  NLY:.....break;.
f9a0: 09 09 7d 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e  ..}...dest[idx].
f9b0: 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
f9c0: 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72  = start[idx].cer
f9d0: 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09  tificate_len;...
f9e0: 64 65 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a  dest[idx].keysiz
f9f0: 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b  e = start[idx].k
fa00: 65 79 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b  eysize;....dest[
fa10: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
fa20: 20 3d 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69   = malloc(dest[i
fa30: 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f  dx].certificate_
fa40: 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64  len);...memcpy(d
fa50: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
fa60: 63 61 74 65 2c 20 73 74 61 72 74 5b 69 64 78 5d  cate, start[idx]
fa70: 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 64 65  .certificate, de
fa80: 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63  st[idx].certific
fa90: 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72  ate_len);..}...r
faa0: 65 74 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a  eturn(dest);.}..
fab0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
fac0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
fad0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
fae0: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52   .... *. * RETUR
faf0: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e  N VALUE. *     .
fb00: 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  ... *. * NOTES. 
fb10: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f  *     .... *. */
fb20: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
fb30: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
fb40: 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64  ity *cackey_read
fb50: 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63 61  _certs(struct ca
fb60: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
fb70: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
fb80: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65  csc_identity *ce
fb90: 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f  rts, unsigned lo
fba0: 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74  ng *count) {..st
fbb0: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
fbc0: 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  _identity *curr_
fbd0: 69 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b  id;..struct cack
fbe0: 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63  ey_tlv_entity *c
fbf0: 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72  cc_tlv, *ccc_cur
fc00: 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70  r, *app_tlv, *ap
fc10: 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65  p_curr;..unsigne
fc20: 64 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d  d char ccc_aid[]
fc30: 20 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43   = {GSCIS_AID_CC
fc40: 43 7d 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20  C}, piv_aid[] = 
fc50: 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f  {NISTSP800_73_3_
fc60: 50 49 56 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67  PIV_AID};..unsig
fc70: 6e 65 64 20 63 68 61 72 20 2a 70 69 76 5f 6f 69  ned char *piv_oi
fc80: 64 2c 20 70 69 76 5f 6f 69 64 5f 70 69 76 61 75  d, piv_oid_pivau
fc90: 74 68 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30  th[] = {NISTSP80
fca0: 30 5f 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55  0_73_3_OID_PIVAU
fcb0: 54 48 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67  TH}, piv_oid_sig
fcc0: 6e 61 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54  nature[] = {NIST
fcd0: 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53  SP800_73_3_OID_S
fce0: 49 47 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f  IGNATURE}, piv_o
fcf0: 69 64 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e  id_keymgt[] = {N
fd00: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49  ISTSP800_73_3_OI
fd10: 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69  D_KEYMGT};..unsi
fd20: 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 5f 61  gned char curr_a
fd30: 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64  id[7];..unsigned
fd40: 20 63 68 61 72 20 62 75 66 66 65 72 5b 38 31 39   char buffer[819
fd50: 32 5d 2c 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09  2], *buffer_p;..
fd60: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 75  unsigned long ou
fd70: 74 69 64 78 20 3d 20 30 3b 0a 09 63 68 61 72 20  tidx = 0;..char 
fd80: 2a 70 69 76 5f 6c 61 62 65 6c 3b 0a 09 63 61 63  *piv_label;..cac
fd90: 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63 74  key_ret transact
fda0: 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65 5f  ion_ret;..ssize_
fdb0: 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 73 69 7a  t read_ret;..siz
fdc0: 65 5f 74 20 62 75 66 66 65 72 5f 6c 65 6e 3b 0a  e_t buffer_len;.
fdd0: 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a  .int certs_resiz
fde0: 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  able;..int send_
fdf0: 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b  ret, select_ret;
fe00: 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70  ..int piv_key, p
fe10: 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78  iv = 0;..int idx
fe20: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
fe30: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
fe40: 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20  ");...if (count 
fe50: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
fe60: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
fe70: 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c  ("count is NULL,
fe80: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
fe90: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
fea0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
feb0: 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c  f (certs != NULL
fec0: 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74  ) {...if (*count
fed0: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   == 0) {....CACK
fee0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
fef0: 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72 65  "Requested we re
ff00: 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20  turn 0 objects, 
ff10: 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b  short-circuit");
ff20: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74  .....return(cert
ff30: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  s);...}..}...if 
ff40: 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73  (!slot->slot_res
ff50: 65 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74  et) {...if (slot
ff60: 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ->cached_certs) 
ff70: 7b 0a 09 09 09 69 66 20 28 63 65 72 74 73 20 3d  {....if (certs =
ff80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65  = NULL) {.....ce
ff90: 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  rts = malloc(siz
ffa0: 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c  eof(*certs) * sl
ffb0: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
ffc0: 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f  _count);.....*co
ffd0: 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68  unt = slot->cach
ffe0: 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a  ed_certs_count;.
fff0: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
10000 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c  .if (*count > sl
10010 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
10020 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a  _count) {......*
10030 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61  count = slot->ca
10040 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
10050 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
10060 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72  .cackey_copy_cer
10070 74 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e  ts(certs, slot->
10080 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63  cached_certs, *c
10090 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65 74 75 72  ount);.....retur
100a0 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
100b0 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63  ...if (slot->cac
100c0 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63  hed_certs) {...c
100d0 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
100e0 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
100f0 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65  rts, slot->cache
10100 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31  d_certs_count, 1
10110 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68  );....slot->cach
10120 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ed_certs = NULL;
10130 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61  ..}.../* Begin a
10140 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73   SmartCard trans
10150 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73  action */..trans
10160 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63  action_ret = cac
10170 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
10180 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66  ction(slot);..if
10190 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65   (transaction_re
101a0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
101b0 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
101c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
101d0 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61  Unable begin tra
101e0 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
101f0 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
10200 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
10210 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
10220 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
10230 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
10240 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35  zeof(*certs) * 5
10250 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b  );...*count = 5;
10260 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
10270 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  le = 1;..} else 
10280 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  {...certs_resiza
10290 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  ble = 0;..}.../*
102a0 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20   Select the CCC 
102b0 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f  Applet */..send_
102c0 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
102d0 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
102e0 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66   ccc_aid, sizeof
102f0 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20  (ccc_aid));..if 
10300 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
10310 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
10320 0a 09 09 2f 2a 20 54 72 79 20 50 49 56 20 61 70  .../* Try PIV ap
10330 70 6c 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73  plication */...s
10340 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
10350 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
10360 6c 6f 74 2c 20 70 69 76 5f 61 69 64 2c 20 73 69  lot, piv_aid, si
10370 7a 65 6f 66 28 70 69 76 5f 61 69 64 29 29 3b 0a  zeof(piv_aid));.
10380 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
10390 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
103a0 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
103b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65  DEBUG_PRINTF("We
103c0 20 68 61 76 65 20 61 20 50 49 56 20 63 61 72 64   have a PIV card
103d0 20 2d 2d 20 6e 6f 74 20 75 73 69 6e 67 20 74 68   -- not using th
103e0 65 20 43 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70  e CCC, pulling p
103f0 72 65 2d 73 65 6c 65 63 74 65 64 20 6b 65 79 73  re-selected keys
10400 22 29 3b 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b  ");.....piv = 1;
10410 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
10420 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10430 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65  TF("Unable to se
10440 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c  lect CCC Applet,
10450 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
10460 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20  ilure");...../* 
10470 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
10480 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
10490 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
104a0 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
104b0 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e  t);.....return(N
104c0 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ULL);...}..}...i
104d0 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20  f (piv) {...for 
104e0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
104f0 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73  3; idx++) {....s
10500 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09  witch (idx) {...
10510 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70  ..case 0:......p
10520 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64  iv_oid = piv_oid
10530 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70  _pivauth;......p
10540 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38  iv_key = NISTSP8
10550 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
10560 55 54 48 3b 0a 09 09 09 09 09 70 69 76 5f 6c 61  UTH;......piv_la
10570 62 65 6c 20 3d 20 22 41 75 74 68 65 6e 74 69 63  bel = "Authentic
10580 61 74 69 6f 6e 22 3b 0a 09 09 09 09 09 62 72 65  ation";......bre
10590 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 31 3a 0a  ak;.....case 1:.
105a0 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d 20 70  .....piv_oid = p
105b0 69 76 5f 6f 69 64 5f 73 69 67 6e 61 74 75 72 65  iv_oid_signature
105c0 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d  ;......piv_key =
105d0 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
105e0 4b 45 59 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09  KEY_SIGNATURE;..
105f0 09 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20  ....piv_label = 
10600 22 53 69 67 6e 61 74 75 72 65 22 3b 0a 09 09 09  "Signature";....
10610 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73  ..break;.....cas
10620 65 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69  e 2:......piv_oi
10630 64 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d  d = piv_oid_keym
10640 67 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79  gt;......piv_key
10650 20 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f   = NISTSP800_78_
10660 33 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09  3_KEY_KEYMGT;...
10670 09 09 09 70 69 76 5f 6c 61 62 65 6c 20 3d 20 22  ...piv_label = "
10680 4b 65 79 20 4d 61 6e 61 67 65 6d 65 6e 74 22 3b  Key Management";
10690 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
106a0 7d 0a 0a 09 09 09 72 65 61 64 5f 72 65 74 20 3d  }.....read_ret =
106b0 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61   cackey_get_data
106c0 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20 73  (slot, buffer, s
106d0 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2c 20 70  izeof(buffer), p
106e0 69 76 5f 6f 69 64 29 3b 0a 0a 09 09 09 69 66 20  iv_oid);.....if 
106f0 28 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  (read_ret <= 0) 
10700 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
10710 09 09 09 7d 0a 0a 09 09 09 63 75 72 72 5f 69 64  ...}.....curr_id
10720 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78   = &certs[outidx
10730 5d 3b 0a 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ];....outidx++;.
10740 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65 79  ....curr_id->key
10750 73 69 7a 65 20 3d 20 2d 31 3b 0a 09 09 09 63 75  size = -1;....cu
10760 72 72 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d  rr_id->id_type =
10770 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
10780 50 49 56 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d  PIV;....curr_id-
10790 3e 63 61 72 64 2e 70 69 76 2e 6b 65 79 5f 69 64  >card.piv.key_id
107a0 20 3d 20 70 69 76 5f 6b 65 79 3b 0a 09 09 09 6d   = piv_key;....m
107b0 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63  emcpy(curr_id->c
107c0 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 2c 20 70  ard.piv.label, p
107d0 69 76 5f 6c 61 62 65 6c 2c 20 73 74 72 6c 65 6e  iv_label, strlen
107e0 28 70 69 76 5f 6c 61 62 65 6c 29 20 2b 20 31 29  (piv_label) + 1)
107f0 3b 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63  ;.....curr_id->c
10800 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
10810 20 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75   read_ret;....cu
10820 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61  rr_id->certifica
10830 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72  te = malloc(curr
10840 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
10850 5f 6c 65 6e 29 3b 0a 0a 09 09 09 62 75 66 66 65  _len);.....buffe
10860 72 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 62  r_len = sizeof(b
10870 75 66 66 65 72 29 3b 0a 09 09 09 62 75 66 66 65  uffer);....buffe
10880 72 5f 70 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  r_p = cackey_rea
10890 64 5f 62 65 72 74 6c 76 5f 74 61 67 28 62 75 66  d_bertlv_tag(buf
108a0 66 65 72 2c 20 26 62 75 66 66 65 72 5f 6c 65 6e  fer, &buffer_len
108b0 2c 20 30 78 37 30 2c 20 63 75 72 72 5f 69 64 2d  , 0x70, curr_id-
108c0 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 26 63  >certificate, &c
108d0 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
108e0 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 69 66  ate_len);.....if
108f0 20 28 62 75 66 66 65 72 5f 70 20 3d 3d 20 4e 55   (buffer_p == NU
10900 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  LL) {.....CACKEY
10910 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
10920 65 61 64 69 6e 67 20 63 65 72 74 69 66 69 63 61  eading certifica
10930 74 65 20 66 72 6f 6d 20 42 45 52 2d 54 4c 56 20  te from BER-TLV 
10940 72 65 73 70 6f 6e 73 65 20 66 61 69 6c 65 64 2c  response failed,
10950 20 73 6b 69 70 70 69 6e 67 20 6b 65 79 20 25 69   skipping key %i
10960 22 2c 20 69 64 78 29 3b 0a 09 09 09 09 66 72 65  ", idx);.....fre
10970 65 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  e(curr_id->certi
10980 66 69 63 61 74 65 29 3b 0a 0a 09 09 09 09 6f 75  ficate);......ou
10990 74 69 64 78 2d 2d 3b 0a 0a 09 09 09 09 63 6f 6e  tidx--;......con
109a0 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 09 09 7d 0a  tinue;....}...}.
109b0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52  .} else {.../* R
109c0 65 61 64 20 61 6c 6c 20 74 68 65 20 61 70 70 6c  ead all the appl
109d0 65 74 73 20 66 72 6f 6d 20 74 68 65 20 43 43 43  ets from the CCC
109e0 27 73 20 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f  's TLV */...ccc_
109f0 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
10a00 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09  d_tlv(slot);....
10a10 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44  /* Look for CARD
10a20 55 52 4c 73 20 74 68 61 74 20 63 6f 6f 72 65 73  URLs that coores
10a30 70 6f 6e 64 20 74 6f 20 50 4b 49 20 61 70 70 6c  pond to PKI appl
10a40 65 74 73 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63  ets */...for (cc
10a50 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 74 6c 76  c_curr = ccc_tlv
10a60 3b 20 63 63 63 5f 63 75 72 72 3b 20 63 63 63 5f  ; ccc_curr; ccc_
10a70 63 75 72 72 20 3d 20 63 63 63 5f 63 75 72 72 2d  curr = ccc_curr-
10a80 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 43 41 43  >_next) {....CAC
10a90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10aa0 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73 20  ("Found tag: %s 
10ab0 2e 2e 2e 20 22 2c 20 43 41 43 4b 45 59 5f 44 45  ... ", CACKEY_DE
10ac0 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f  BUG_FUNC_TAG_TO_
10ad0 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 74 61  STR(ccc_curr->ta
10ae0 67 29 29 3b 0a 0a 09 09 09 69 66 20 28 63 63 63  g));.....if (ccc
10af0 5f 63 75 72 72 2d 3e 74 61 67 20 21 3d 20 47 53  _curr->tag != GS
10b00 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 29  CIS_TAG_CARDURL)
10b10 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10b20 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e  BUG_PRINTF("  ..
10b30 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28 77  . skipping it (w
10b40 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
10b50 74 20 43 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a  t CARDURLs)");..
10b60 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10b70 09 7d 0a 0a 09 09 09 69 66 20 28 28 63 63 63 5f  .}.....if ((ccc_
10b80 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10b90 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 26 20 43  url->apptype & C
10ba0 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b  ACKEY_TLV_APP_PK
10bb0 49 29 20 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56  I) != CACKEY_TLV
10bc0 5f 41 50 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09  _APP_PKI) {.....
10bd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
10be0 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70  NTF("  ... skipp
10bf0 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79 20  ing it (we only 
10c00 63 61 72 65 20 61 62 6f 75 74 20 50 4b 49 20 61  care about PKI a
10c10 70 70 6c 65 74 73 2c 20 74 68 69 73 20 61 70 70  pplets, this app
10c20 6c 65 74 20 73 75 70 70 6f 72 74 73 3a 20 25 73  let supports: %s
10c30 2f 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  /%02x)", CACKEY_
10c40 44 45 42 55 47 5f 46 55 4e 43 5f 41 50 50 54 59  DEBUG_FUNC_APPTY
10c50 50 45 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75  PE_TO_STR(ccc_cu
10c60 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10c70 6c 2d 3e 61 70 70 74 79 70 65 29 2c 20 28 75 6e  l->apptype), (un
10c80 73 69 67 6e 65 64 20 69 6e 74 29 20 63 63 63 5f  signed int) ccc_
10c90 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64  curr->value_card
10ca0 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a  url->apptype);..
10cb0 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
10cc0 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  .}.....CACKEY_DE
10cd0 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 52 49  BUG_PRINTBUF("RI
10ce0 44 3a 22 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76  D:", ccc_curr->v
10cf0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
10d00 64 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75  d, sizeof(ccc_cu
10d10 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10d20 6c 2d 3e 72 69 64 29 29 3b 0a 09 09 09 43 41 43  l->rid));....CAC
10d30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10d40 28 22 41 70 70 49 44 20 3d 20 25 73 2f 25 30 34  ("AppID = %s/%04
10d50 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  lx", CACKEY_DEBU
10d60 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
10d70 53 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61  STR(ccc_curr->va
10d80 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70  lue_cardurl->app
10d90 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  id), (unsigned l
10da0 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76  ong) ccc_curr->v
10db0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70  alue_cardurl->ap
10dc0 70 69 64 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f  pid);....CACKEY_
10dd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 62  DEBUG_PRINTF("Ob
10de0 6a 65 63 74 49 44 20 3d 20 25 73 2f 25 30 34 6c  jectID = %s/%04l
10df0 78 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  x", CACKEY_DEBUG
10e00 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53  _FUNC_OBJID_TO_S
10e10 54 52 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c  TR(ccc_curr->val
10e20 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65  ue_cardurl->obje
10e30 63 74 69 64 29 2c 20 28 75 6e 73 69 67 6e 65 64  ctid), (unsigned
10e40 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72 72 2d   long) ccc_curr-
10e50 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10e60 6f 62 6a 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d  objectid);.....m
10e70 65 6d 63 70 79 28 63 75 72 72 5f 61 69 64 2c 20  emcpy(curr_aid, 
10e80 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10e90 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69  cardurl->rid, si
10ea0 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d 3e 76  zeof(ccc_curr->v
10eb0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69  alue_cardurl->ri
10ec0 64 29 29 3b 0a 09 09 09 63 75 72 72 5f 61 69 64  d));....curr_aid
10ed0 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64  [sizeof(curr_aid
10ee0 29 20 2d 20 32 5d 20 3d 20 28 63 63 63 5f 63 75  ) - 2] = (ccc_cu
10ef0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
10f00 6c 2d 3e 61 70 70 69 64 20 3e 3e 20 38 29 20 26  l->appid >> 8) &
10f10 20 30 78 66 66 3b 0a 09 09 09 63 75 72 72 5f 61   0xff;....curr_a
10f20 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72 5f 61  id[sizeof(curr_a
10f30 69 64 29 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63  id) - 1] = ccc_c
10f40 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10f50 72 6c 2d 3e 61 70 70 69 64 20 26 20 30 78 66 66  rl->appid & 0xff
10f60 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
10f70 66 6f 75 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e  found applet ...
10f80 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72 65   */....select_re
10f90 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63  t = cackey_selec
10fa0 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63  t_applet(slot, c
10fb0 75 72 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28  urr_aid, sizeof(
10fc0 63 75 72 72 5f 61 69 64 29 29 3b 0a 09 09 09 69  curr_aid));....i
10fd0 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d  f (select_ret !=
10fe0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
10ff0 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  K) {.....CACKEY_
11000 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
11010 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61  iled to select a
11020 70 70 6c 65 74 2c 20 73 6b 69 70 70 69 6e 67 20  pplet, skipping 
11030 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
11040 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
11050 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11060 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20  ...../* ... and 
11070 6f 62 6a 65 63 74 20 28 66 69 6c 65 29 20 2a 2f  object (file) */
11080 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
11090 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66   cackey_select_f
110a0 69 6c 65 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75  ile(slot, ccc_cu
110b0 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72  rr->value_cardur
110c0 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09  l->objectid);...
110d0 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65 74 20  .if (select_ret 
110e0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
110f0 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  _OK) {.....CACKE
11100 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
11110 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65 63 74  Failed to select
11120 20 66 69 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20   file, skipping 
11130 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68  processing of th
11140 69 73 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  is object");....
11150 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
11160 0a 0a 09 09 09 2f 2a 20 50 72 6f 63 65 73 73 20  ...../* Process 
11170 74 68 69 73 20 66 69 6c 65 27 73 20 54 4c 56 20  this file's TLV 
11180 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 63 65 72 74  looking for cert
11190 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 09 09 61  ificates */....a
111a0 70 70 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f  pp_tlv = cackey_
111b0 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a  read_tlv(slot);.
111c0 09 0a 09 09 09 66 6f 72 20 28 61 70 70 5f 63 75  .....for (app_cu
111d0 72 72 20 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70  rr = app_tlv; ap
111e0 70 5f 63 75 72 72 3b 20 61 70 70 5f 63 75 72 72  p_curr; app_curr
111f0 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65   = app_curr->_ne
11200 78 74 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  xt) {.....CACKEY
11210 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
11220 6f 75 6e 64 20 74 61 67 3a 20 25 73 22 2c 20 43  ound tag: %s", C
11230 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
11240 5f 54 41 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f  _TAG_TO_STR(app_
11250 63 75 72 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09  curr->tag));....
11260 09 69 66 20 28 61 70 70 5f 63 75 72 72 2d 3e 74  .if (app_curr->t
11270 61 67 20 21 3d 20 47 53 43 49 53 5f 54 41 47 5f  ag != GSCIS_TAG_
11280 43 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09  CERTIFICATE) {..
11290 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
112a0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
112b0 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
112c0 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
112d0 45 52 54 49 46 49 43 41 54 45 73 29 22 29 3b 0a  ERTIFICATEs)");.
112e0 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
112f0 09 09 09 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f  ....}......curr_
11300 69 64 20 3d 20 26 63 65 72 74 73 5b 6f 75 74 69  id = &certs[outi
11310 64 78 5d 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b  dx];.....outidx+
11320 2b 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 2d  +;......curr_id-
11330 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43 4b 45  >id_type = CACKE
11340 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3b 0a 09  Y_ID_TYPE_CAC;..
11350 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69  ...memcpy(curr_i
11360 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c  d->card.cac.appl
11370 65 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69  et, curr_aid, si
11380 7a 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61  zeof(curr_id->ca
11390 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b  rd.cac.applet));
113a0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61  .....curr_id->ca
113b0 72 64 2e 63 61 63 2e 66 69 6c 65 20 3d 20 63 63  rd.cac.file = cc
113c0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
113d0 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 3b  rdurl->objectid;
113e0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 6b 65  .....curr_id->ke
113f0 79 73 69 7a 65 20 3d 20 2d 31 3b 0a 0a 09 09 09  ysize = -1;.....
11400 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11410 49 4e 54 46 28 22 46 69 6c 6c 69 6e 67 20 63 75  INTF("Filling cu
11420 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11430 61 70 70 6c 65 74 20 28 25 70 29 20 77 69 74 68  applet (%p) with
11440 20 25 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75   %lu bytes:", cu
11450 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
11460 61 70 70 6c 65 74 2c 20 28 75 6e 73 69 67 6e 65  applet, (unsigne
11470 64 20 6c 6f 6e 67 29 20 73 69 7a 65 6f 66 28 63  d long) sizeof(c
11480 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63  urr_id->card.cac
11490 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09 09 09 43  .applet));.....C
114a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
114b0 54 42 55 46 28 22 56 41 4c 3a 22 2c 20 63 75 72  TBUF("VAL:", cur
114c0 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e 61  r_id->card.cac.a
114d0 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66 28 63 75  pplet, sizeof(cu
114e0 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
114f0 61 70 70 6c 65 74 29 29 3b 0a 0a 09 09 09 09 63  applet));......c
11500 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11510 61 74 65 5f 6c 65 6e 20 3d 20 61 70 70 5f 63 75  ate_len = app_cu
11520 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a 0a 09 09 09  rr->length;.....
11530 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
11540 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f 63 28 63  icate = malloc(c
11550 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
11560 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 6d 65  ate_len);.....me
11570 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e 63 65  mcpy(curr_id->ce
11580 72 74 69 66 69 63 61 74 65 2c 20 61 70 70 5f 63  rtificate, app_c
11590 75 72 72 2d 3e 76 61 6c 75 65 2c 20 63 75 72 72  urr->value, curr
115a0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
115b0 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09 69 66 20 28  _len);......if (
115c0 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74  outidx >= *count
115d0 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63 65 72  ) {......if (cer
115e0 74 73 5f 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a  ts_resizable) {.
115f0 09 09 09 09 09 09 2a 63 6f 75 6e 74 20 2a 3d 20  ......*count *= 
11600 32 3b 0a 09 09 09 09 09 09 63 65 72 74 73 20 3d  2;.......certs =
11610 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
11620 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
11630 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 09 09 09   (*count));.....
11640 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
11650 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09  break;......}...
11660 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  ..}....}.....cac
11670 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 61 70 70  key_free_tlv(app
11680 5f 74 6c 76 29 3b 0a 0a 09 09 09 69 66 20 28 6f  _tlv);.....if (o
11690 75 74 69 64 78 20 3e 3d 20 2a 63 6f 75 6e 74 29  utidx >= *count)
116a0 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
116b0 09 7d 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  .}...}....cackey
116c0 5f 66 72 65 65 5f 74 6c 76 28 63 63 63 5f 74 6c  _free_tlv(ccc_tl
116d0 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f 75 6e 74 20  v);..}...*count 
116e0 3d 20 6f 75 74 69 64 78 3b 0a 0a 09 69 66 20 28  = outidx;...if (
116f0 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 29  certs_resizable)
11700 20 7b 0a 09 09 63 65 72 74 73 20 3d 20 72 65 61   {...certs = rea
11710 6c 6c 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65  lloc(certs, size
11720 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63  of(*certs) * (*c
11730 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  ount));..}...slo
11740 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 20  t->cached_certs 
11750 3d 20 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65  = cackey_copy_ce
11760 72 74 73 28 4e 55 4c 4c 2c 20 63 65 72 74 73 2c  rts(NULL, certs,
11770 20 2a 63 6f 75 6e 74 29 3b 0a 09 73 6c 6f 74 2d   *count);..slot-
11780 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
11790 75 6e 74 20 3d 20 2a 63 6f 75 6e 74 3b 0a 0a 09  unt = *count;...
117a0 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 53 6d 61  /* Terminate Sma
117b0 72 74 43 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtCard Transacti
117c0 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e  on */..cackey_en
117d0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  d_transaction(sl
117e0 6f 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 63 65  ot);...return(ce
117f0 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  rts);.}../*. * S
11800 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
11810 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
11820 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
11830 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
11840 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
11850 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
11860 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
11870 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
11880 73 69 67 6e 64 65 63 72 79 70 74 28 73 74 72 75  signdecrypt(stru
11890 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
118a0 73 6c 6f 74 2c 20 73 74 72 75 63 74 20 63 61 63  slot, struct cac
118b0 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 69 64  key_identity *id
118c0 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e 65 64  entity, unsigned
118d0 20 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65   char *buf, size
118e0 5f 74 20 62 75 66 6c 65 6e 2c 20 75 6e 73 69 67  _t buflen, unsig
118f0 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 62 75 66  ned char *outbuf
11900 2c 20 73 69 7a 65 5f 74 20 6f 75 74 62 75 66 6c  , size_t outbufl
11910 65 6e 2c 20 69 6e 74 20 70 61 64 49 6e 70 75 74  en, int padInput
11920 2c 20 69 6e 74 20 75 6e 70 61 64 4f 75 74 70 75  , int unpadOutpu
11930 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 70 63 73  t) {..cackey_pcs
11940 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74 79 70  c_id_type id_typ
11950 65 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  e;..unsigned cha
11960 72 20 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  r dyn_auth_templ
11970 61 74 65 5b 31 30 5d 3b 0a 09 75 6e 73 69 67 6e  ate[10];..unsign
11980 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66 2c  ed char *tmpbuf,
11990 20 2a 74 6d 70 62 75 66 5f 73 2c 20 2a 6f 75 74   *tmpbuf_s, *out
119a0 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f 70  buf_s, *outbuf_p
119b0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
119c0 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20   bytes_to_send, 
119d0 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73 69  p1, class;..unsi
119e0 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b 74  gned char blockt
119f0 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65 74  ype;..cackey_ret
11a00 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e 74   send_ret;..uint
11a10 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a 09  16_t respcode;..
11a20 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20 3d  ssize_t retval =
11a30 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74 3b   0, unpadoffset;
11a40 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66 6c  ..size_t tmpbufl
11a50 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70 6f  en, padlen, tmpo
11a60 75 74 62 75 66 6c 65 6e 2c 20 6f 75 74 62 75 66  utbuflen, outbuf
11a70 5f 6c 65 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f  _len;..int free_
11a80 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74  tmpbuf = 0;..int
11a90 20 6c 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45   le;...CACKEY_DE
11aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
11ab0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f  ed.");...if (slo
11ac0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  t == NULL) {...C
11ad0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
11ae0 54 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74  TF("Error.  slot
11af0 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
11b00 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
11b10 69 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29  if (buf == NULL)
11b20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11b30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11b40 20 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b    buf is NULL");
11b50 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
11b60 09 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20  .}...if (outbuf 
11b70 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
11b80 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11b90 28 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66  ("Error.  outbuf
11ba0 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
11bb0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09  eturn(-1);..}...
11bc0 69 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20  if (identity == 
11bd0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
11be0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11bf0 72 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20  rror.  identity 
11c00 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
11c10 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
11c20 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  f (identity->pcs
11c30 63 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55  c_identity == NU
11c40 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
11c50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
11c60 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70  or.  identity->p
11c70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20  csc_identity is 
11c80 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
11c90 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74  n(-1);..}...id_t
11ca0 79 70 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ype = identity->
11cb0 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69  pcsc_identity->i
11cc0 64 5f 74 79 70 65 3b 0a 09 69 66 20 28 69 64 5f  d_type;..if (id_
11cd0 74 79 70 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49  type == CACKEY_I
11ce0 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
11cf0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
11d00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11d10 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
11d20 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 43 41  c_identity is CA
11d30 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52  CKEY_ID_TYPE_CER
11d40 54 5f 4f 4e 4c 59 2c 20 77 68 69 63 68 20 63 61  T_ONLY, which ca
11d50 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 66 6f 72  nnot be used for
11d60 20 73 69 67 6e 2f 64 65 63 72 79 70 74 22 29 3b   sign/decrypt");
11d70 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
11d80 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 69 64 5f  .}...switch (id_
11d90 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
11da0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49  ACKEY_ID_TYPE_PI
11db0 56 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59  V:...case CACKEY
11dc0 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
11dd0 09 62 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c  .break;...defaul
11de0 74 3a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  t:....CACKEY_DEB
11df0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
11e00 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  .  identity->pcs
11e10 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f  c_identity is no
11e20 74 20 61 20 73 75 70 70 6f 72 74 65 64 20 76 61  t a supported va
11e30 6c 75 65 2e 20 54 79 70 65 20 69 73 3a 20 30 78  lue. Type is: 0x
11e40 25 6c 78 20 28 50 49 56 20 3d 20 30 78 25 6c 78  %lx (PIV = 0x%lx
11e50 2c 20 43 41 43 20 3d 20 30 78 25 6c 78 29 22 2c  , CAC = 0x%lx)",
11e60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
11e70 20 69 64 5f 74 79 70 65 2c 20 28 75 6e 73 69 67   id_type, (unsig
11e80 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59  ned long) CACKEY
11e90 5f 49 44 5f 54 59 50 45 5f 50 49 56 2c 20 28 75  _ID_TYPE_PIV, (u
11ea0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41  nsigned long) CA
11eb0 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
11ec0 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
11ed0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  );..}.../* Deter
11ee0 6d 69 6e 65 20 69 64 65 6e 74 69 74 79 20 4b 65  mine identity Ke
11ef0 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69  y size */..if (i
11f00 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
11f10 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20  entity->keysize 
11f20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e 74 69 74  < 0) {...identit
11f30 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11f40 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78 35 30 39  ->keysize = x509
11f50 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e  _to_keysize(iden
11f60 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11f70 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65  ity->certificate
11f80 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
11f90 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
11fa0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a  ficate_len);..}.
11fb0 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73 61 67 65  ../* Pad message
11fc0 20 74 6f 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a   to key size */.
11fd0 09 69 66 20 28 70 61 64 49 6e 70 75 74 29 20 7b  .if (padInput) {
11fe0 0a 09 09 69 66 20 28 69 64 65 6e 74 69 74 79 2d  ...if (identity-
11ff0 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
12000 6b 65 79 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09  keysize > 0) {..
12010 09 09 69 66 20 28 62 75 66 6c 65 6e 20 21 3d 20  ..if (buflen != 
12020 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12030 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65  dentity->keysize
12040 29 20 7b 0a 09 09 09 09 69 66 20 28 62 75 66 6c  ) {.....if (bufl
12050 65 6e 20 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e  en > (identity->
12060 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
12070 65 79 73 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09  eysize + 3)) {..
12080 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
12090 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
120a0 20 4d 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20   Message is too 
120b0 6c 61 72 67 65 20 74 6f 20 73 69 67 6e 2f 64 65  large to sign/de
120c0 63 72 79 70 74 22 29 3b 0a 0a 09 09 09 09 09 72  crypt");.......r
120d0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d  eturn(-1);.....}
120e0 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  ......tmpbuflen 
120f0 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  = identity->pcsc
12100 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
12110 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d  ze;.....tmpbuf =
12120 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65   malloc(tmpbufle
12130 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70  n);.....free_tmp
12140 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61  buf = 1;......pa
12150 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e  dlen = tmpbuflen
12160 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a   - buflen - 3;..
12170 09 09 09 09 2f 2a 20 52 53 41 20 50 4b 43 53 23  ..../* RSA PKCS#
12180 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f  1 EMSA-PKCS1-v1_
12190 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09  5 Padding */....
121a0 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20 30 78 30  .tmpbuf[0] = 0x0
121b0 30 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 31 5d  0;.....tmpbuf[1]
121c0 20 3d 20 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d   = 0x01;.....mem
121d0 73 65 74 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20  set(&tmpbuf[2], 
121e0 30 78 46 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09  0xFF, padlen);..
121f0 09 09 09 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e  ...tmpbuf[padlen
12200 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09   + 2]= 0x00;....
12210 09 6d 65 6d 63 70 79 28 26 74 6d 70 62 75 66 5b  .memcpy(&tmpbuf[
12220 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66  padlen + 3], buf
12230 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09  , buflen);......
12240 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
12250 4e 54 42 55 46 28 22 55 6e 70 61 64 64 65 64 3a  NTBUF("Unpadded:
12260 22 2c 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b  ", buf, buflen);
12270 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12280 47 5f 50 52 49 4e 54 42 55 46 28 22 50 61 64 64  G_PRINTBUF("Padd
12290 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d  ed:", tmpbuf, tm
122a0 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65  pbuflen);....} e
122b0 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70 62 75 66  lse {.....tmpbuf
122c0 20 3d 20 62 75 66 3b 0a 09 09 09 09 74 6d 70 62   = buf;.....tmpb
122d0 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  uflen = buflen;.
122e0 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
122f0 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20  = 0;.....padlen 
12300 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  = 0;....}...} el
12310 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  se {....CACKEY_D
12320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
12330 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ble to determine
12340 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e   key size, hopin
12350 67 20 74 68 65 20 6d 65 73 73 61 67 65 20 69 73  g the message is
12360 20 70 72 6f 70 65 72 6c 79 20 70 61 64 64 65 64   properly padded
12370 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20  !");.....tmpbuf 
12380 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70 62 75 66  = buf;....tmpbuf
12390 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09  len = buflen;...
123a0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
123b0 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b  ;....padlen = 0;
123c0 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
123d0 09 74 6d 70 62 75 66 20 3d 20 62 75 66 3b 0a 09  .tmpbuf = buf;..
123e0 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66  .tmpbuflen = buf
123f0 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62  len;...free_tmpb
12400 75 66 20 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e  uf = 0;...padlen
12410 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65   = 0;..}.../* Be
12420 67 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  gin transaction 
12430 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e  */..cackey_begin
12440 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
12450 74 29 3b 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20  t);.../* Select 
12460 63 6f 72 72 65 63 74 20 61 70 70 6c 65 74 20 2a  correct applet *
12470 2f 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79  /..switch (id_ty
12480 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43  pe) {...case CAC
12490 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a  KEY_ID_TYPE_CAC:
124a0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
124b0 5f 50 52 49 4e 54 46 28 22 53 65 6c 65 63 74 69  _PRINTF("Selecti
124c0 6e 67 20 61 70 70 6c 65 74 20 66 6f 75 6e 64 20  ng applet found 
124d0 61 74 20 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e  at %p ...", iden
124e0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
124f0 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70  ity->card.cac.ap
12500 70 6c 65 74 29 3b 0a 09 09 09 63 61 63 6b 65 79  plet);....cackey
12510 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
12520 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  lot, identity->p
12530 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61  csc_identity->ca
12540 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73  rd.cac.applet, s
12550 69 7a 65 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e  izeof(identity->
12560 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
12570 61 72 64 2e 63 61 63 2e 61 70 70 6c 65 74 29 29  ard.cac.applet))
12580 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c 65 63 74 20  ;...../* Select 
12590 63 6f 72 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a  correct file */.
125a0 09 09 09 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  ...cackey_select
125b0 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e  _file(slot, iden
125c0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
125d0 69 74 79 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69  ity->card.cac.fi
125e0 6c 65 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09  le);....break;..
125f0 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f  .case CACKEY_ID_
12600 54 59 50 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e  TYPE_PIV:....dyn
12610 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30  _auth_template[0
12620 5d 20 3d 20 30 78 37 43 3b 0a 09 09 09 64 79 6e  ] = 0x7C;....dyn
12630 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31  _auth_template[1
12640 5d 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e  ] = 0x82;....dyn
12650 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32  _auth_template[2
12660 5d 20 3d 20 28 28 74 6d 70 62 75 66 6c 65 6e 20  ] = ((tmpbuflen 
12670 2b 20 36 29 20 26 20 30 78 66 66 30 30 29 20 3e  + 6) & 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 33 5d 20 3d 20 28  _template[3] = (
126a0 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36 29 20 26  tmpbuflen + 6) &
126b0 20 30 78 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f   0x00ff;....dyn_
126c0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d  auth_template[4]
126d0 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
126e0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d  auth_template[5]
126f0 20 3d 20 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f   = 0x00;....dyn_
12700 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d  auth_template[6]
12710 20 3d 20 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f   = 0x81;....dyn_
12720 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d  auth_template[7]
12730 20 3d 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f   = 0x82;....dyn_
12740 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d  auth_template[8]
12750 20 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20   = (tmpbuflen & 
12760 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09  0xff00) >> 8;...
12770 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
12780 74 65 5b 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65  te[9] = tmpbufle
12790 6e 20 26 20 30 78 30 30 66 66 3b 0a 0a 09 09 09  n & 0x00ff;.....
127a0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
127b0 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
127c0 2c 20 30 78 31 30 2c 20 4e 49 53 54 53 50 38 30  , 0x10, NISTSP80
127d0 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e  0_73_3_INSTR_GEN
127e0 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30 30 5f  AUTH, NISTSP800_
127f0 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34  78_3_ALGO_RSA204
12800 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  8, identity->pcs
12810 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
12820 2e 70 69 76 2e 6b 65 79 5f 69 64 2c 20 73 69 7a  .piv.key_id, siz
12830 65 6f 66 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d  eof(dyn_auth_tem
12840 70 6c 61 74 65 29 2c 20 64 79 6e 5f 61 75 74 68  plate), dyn_auth
12850 5f 74 65 6d 70 6c 61 74 65 2c 20 30 78 30 30 2c  _template, 0x00,
12860 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
12870 4c 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  L);....break;...
12880 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
12890 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09  YPE_CERT_ONLY:..
128a0 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d  ..break;..}...tm
128b0 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b  pbuf_s = tmpbuf;
128c0 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75 74  ..outbuf_s = out
128d0 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70  buf;..while (tmp
128e0 62 75 66 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f  buflen) {...tmpo
128f0 75 74 62 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75  utbuflen = outbu
12900 66 6c 65 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70  flen;....if (tmp
12910 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f  buflen > CACKEY_
12920 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62  APDU_MTU) {....b
12930 79 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43  ytes_to_send = C
12940 41 43 4b 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a  ACKEY_APDU_MTU;.
12950 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 62 79  ..} else {....by
12960 74 65 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d  tes_to_send = tm
12970 70 62 75 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09  pbuflen;...}....
12980 73 65 6e 64 5f 72 65 74 20 3d 20 43 41 43 4b 45  send_ret = CACKE
12990 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
129a0 3b 0a 09 09 73 77 69 74 63 68 20 28 69 64 5f 74  ;...switch (id_t
129b0 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
129c0 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
129d0 43 3a 0a 09 09 09 09 69 66 20 28 74 6d 70 62 75  C:.....if (tmpbu
129e0 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50  flen > CACKEY_AP
129f0 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09 09 09 70  DU_MTU) {......p
12a00 31 20 3d 20 30 78 38 30 3b 0a 09 09 09 09 09 6c  1 = 0x80;......l
12a10 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 7d 20  e = 0x00;.....} 
12a20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 31 20 3d  else {......p1 =
12a30 20 30 78 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x00;......le =
12a40 20 30 78 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09   0x00;.....}....
12a50 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
12a60 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
12a70 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
12a80 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c  GLOBAL_PLATFORM,
12a90 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 49 47   GSCIS_INSTR_SIG
12aa0 4e 44 45 43 52 59 50 54 2c 20 70 31 2c 20 30 78  NDECRYPT, p1, 0x
12ab0 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e  00, bytes_to_sen
12ac0 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26  d, tmpbuf, le, &
12ad0 72 65 73 70 63 6f 64 65 2c 20 6f 75 74 62 75 66  respcode, outbuf
12ae0 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29  , &tmpoutbuflen)
12af0 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ;.....break;....
12b00 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54  case CACKEY_ID_T
12b10 59 50 45 5f 50 49 56 3a 0a 09 09 09 09 69 66 20  YPE_PIV:.....if 
12b20 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 43 41 43  (tmpbuflen > CAC
12b30 4b 45 59 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a  KEY_APDU_MTU) {.
12b40 09 09 09 09 09 63 6c 61 73 73 20 3d 20 30 78 31  .....class = 0x1
12b50 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78 30  0;......le = 0x0
12b60 30 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  0;.....} else {.
12b70 09 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43  .....class = GSC
12b80 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
12b90 3b 0a 09 09 09 09 09 6c 65 20 3d 20 32 35 36 3b  ;......le = 256;
12ba0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64  .....}......send
12bb0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
12bc0 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c  nd_apdu(slot, cl
12bd0 61 73 73 2c 20 4e 49 53 54 53 50 38 30 30 5f 37  ass, NISTSP800_7
12be0 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54  3_3_INSTR_GENAUT
12bf0 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  H, NISTSP800_78_
12c00 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20  3_ALGO_RSA2048, 
12c10 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12c20 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69  dentity->card.pi
12c30 76 2e 6b 65 79 5f 69 64 2c 20 62 79 74 65 73 5f  v.key_id, bytes_
12c40 74 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c  to_send, tmpbuf,
12c50 20 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20   le, &respcode, 
12c60 6f 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62  outbuf, &tmpoutb
12c70 75 66 6c 65 6e 29 3b 0a 09 09 09 09 62 72 65 61  uflen);.....brea
12c80 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45  k;....case CACKE
12c90 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
12ca0 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  NLY:.....break;.
12cb0 09 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  ..}....if (send_
12cc0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
12cd0 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41  SC_S_OK) {....CA
12ce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
12cf0 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
12d00 46 61 69 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e  Failed -- return
12d10 69 6e 67 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b  ing in error.");
12d20 0a 0a 09 09 09 69 66 20 28 66 72 65 65 5f 74 6d  .....if (free_tm
12d30 70 62 75 66 29 20 7b 0a 09 09 09 09 69 66 20 28  pbuf) {.....if (
12d40 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 09  tmpbuf_s) {.....
12d50 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b  .free(tmpbuf_s);
12d60 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09  .....}....}.....
12d70 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74 69  /* End transacti
12d80 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
12d90 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
12da0 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 72  slot);.....if (r
12db0 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 39 38  espcode == 0x698
12dc0 32 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  2) {.....CACKEY_
12dd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
12de0 63 75 72 69 74 79 20 73 74 61 74 75 73 20 6e 6f  curity status no
12df0 74 20 73 61 74 69 73 69 66 69 65 64 2e 20 20 52  t satisified.  R
12e00 65 74 75 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47  eturning NEEDLOG
12e10 49 4e 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  IN");......cacke
12e20 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
12e30 74 28 73 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f  t(slot);.....slo
12e40 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
12e50 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
12e60 52 45 44 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  RED;......return
12e70 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  (CACKEY_PCSC_E_N
12e80 45 45 44 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a  EEDLOGIN);....}.
12e90 0a 09 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
12ea0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
12eb0 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
12ec0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12ed0 47 5f 50 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20  G_PRINTF("Token 
12ee0 61 62 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  absent.  Returni
12ef0 6e 67 20 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29  ng TOKENABSENT")
12f00 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  ;......cackey_ma
12f10 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c  rk_slot_reset(sl
12f20 6f 74 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  ot);......return
12f30 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54  (CACKEY_PCSC_E_T
12f40 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09  OKENABSENT);....
12f50 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  }.....return(-1)
12f60 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20  ;...}....tmpbuf 
12f70 2b 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64  += bytes_to_send
12f80 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d  ;...tmpbuflen -=
12f90 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a   bytes_to_send;.
12fa0 0a 09 09 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70  ...outbuf += tmp
12fb0 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74  outbuflen;...out
12fc0 62 75 66 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74  buflen -= tmpout
12fd0 62 75 66 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c  buflen;...retval
12fe0 20 2b 3d 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e   += tmpoutbuflen
12ff0 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f  ;..}...if (free_
13000 74 6d 70 62 75 66 29 20 7b 0a 09 09 69 66 20 28  tmpbuf) {...if (
13010 74 6d 70 62 75 66 5f 73 29 20 7b 0a 09 09 09 66  tmpbuf_s) {....f
13020 72 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09  ree(tmpbuf_s);..
13030 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d  .}..}...outbuf =
13040 20 6f 75 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20   outbuf_s;.../* 
13050 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  End transaction 
13060 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  */..cackey_end_t
13070 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
13080 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  ;..#ifdef CACKEY
13090 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
130a0 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
130b0 4d 41 58 0a 09 69 66 20 28 6f 75 74 62 75 66 6c  MAX..if (outbufl
130c0 65 6e 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  en > _POSIX_SSIZ
130d0 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
130e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
130f0 4f 75 74 62 75 66 6c 65 6e 20 65 78 63 65 65 64  Outbuflen exceed
13100 73 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c  s maximum value,
13110 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
13120 69 6c 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c  ilure. (max = %l
13130 69 2c 20 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25  i, outbuflen = %
13140 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
13150 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
13160 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
13170 75 74 62 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65  utbuflen);....re
13180 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20  turn(-1);..}.#  
13190 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f  endif.#endif.../
131a0 2a 20 57 65 20 6d 75 73 74 20 72 65 6d 6f 76 65  * We must remove
131b0 20 74 68 65 20 22 37 43 22 20 74 61 67 20 74 6f   the "7C" tag to
131c0 20 67 65 74 20 74 6f 20 74 68 65 20 73 69 67 6e   get to the sign
131d0 61 74 75 72 65 20 2a 2f 0a 09 73 77 69 74 63 68  ature */..switch
131e0 20 28 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 63   (id_type) {...c
131f0 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
13200 50 45 5f 50 49 56 3a 0a 09 09 09 6f 75 74 62 75  PE_PIV:....outbu
13210 66 5f 6c 65 6e 20 3d 20 72 65 74 76 61 6c 3b 0a  f_len = retval;.
13220 09 09 09 6f 75 74 62 75 66 5f 70 20 3d 20 63 61  ...outbuf_p = ca
13230 63 6b 65 79 5f 72 65 61 64 5f 62 65 72 74 6c 76  ckey_read_bertlv
13240 5f 74 61 67 28 6f 75 74 62 75 66 2c 20 26 6f 75  _tag(outbuf, &ou
13250 74 62 75 66 5f 6c 65 6e 2c 20 30 78 37 43 2c 20  tbuf_len, 0x7C, 
13260 4e 55 4c 4c 2c 20 20 26 6f 75 74 62 75 66 5f 6c  NULL,  &outbuf_l
13270 65 6e 29 3b 0a 09 09 09 69 66 20 28 6f 75 74 62  en);....if (outb
13280 75 66 5f 70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  uf_p == NULL) {.
13290 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
132a0 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e 73  _PRINTF("Respons
132b0 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20 47  e from PIV for G
132c0 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54 49  ENERATE AUTHENTI
132d0 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20 61  CATION was not a
132e0 20 30 78 37 43 20 74 61 67 2c 20 72 65 74 75 72   0x7C tag, retur
132f0 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
13300 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d  );......return(-
13310 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74  1);....}.....ret
13320 76 61 6c 20 3d 20 6f 75 74 62 75 66 5f 6c 65 6e  val = outbuf_len
13330 3b 0a 0a 09 09 09 6f 75 74 62 75 66 5f 6c 65 6e  ;.....outbuf_len
13340 20 3d 20 72 65 74 76 61 6c 3b 0a 09 09 09 6f 75   = retval;....ou
13350 74 62 75 66 5f 70 20 3d 20 63 61 63 6b 65 79 5f  tbuf_p = cackey_
13360 72 65 61 64 5f 62 65 72 74 6c 76 5f 74 61 67 28  read_bertlv_tag(
13370 6f 75 74 62 75 66 2c 20 26 6f 75 74 62 75 66 5f  outbuf, &outbuf_
13380 6c 65 6e 2c 20 30 78 38 32 2c 20 4e 55 4c 4c 2c  len, 0x82, NULL,
13390 20 20 26 6f 75 74 62 75 66 5f 6c 65 6e 29 3b 0a    &outbuf_len);.
133a0 09 09 09 69 66 20 28 6f 75 74 62 75 66 5f 70 20  ...if (outbuf_p 
133b0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43  == NULL) {.....C
133c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
133d0 54 46 28 22 52 65 73 70 6f 6e 73 65 20 66 72 6f  TF("Response fro
133e0 6d 20 50 49 56 20 66 6f 72 20 47 45 4e 45 52 41  m PIV for GENERA
133f0 54 45 20 41 55 54 48 45 4e 54 49 43 41 54 49 4f  TE AUTHENTICATIO
13400 4e 20 77 61 73 20 6e 6f 74 20 61 20 30 78 38 32  N was not a 0x82
13410 20 77 69 74 68 20 74 68 65 6e 20 30 78 37 43 20   with then 0x7C 
13420 74 61 67 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  tag, returning i
13430 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
13440 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
13450 09 7d 0a 0a 09 09 09 72 65 74 76 61 6c 20 3d 20  .}.....retval = 
13460 6f 75 74 62 75 66 5f 6c 65 6e 3b 0a 0a 09 09 09  outbuf_len;.....
13470 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41  break;...case CA
13480 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
13490 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  :...case CACKEY_
134a0 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
134b0 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  Y:....break;..}.
134c0 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c 79  ../* Unpad reply
134d0 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f 75   */..if (unpadOu
134e0 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72 65  tput) {...if (re
134f0 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43  tval < 3) {....C
13500 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13510 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f 6f  TF("Reply is too
13520 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e   small, we are n
13530 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 64  ot able to unpad
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 69 66 20  val);...}....if 
135e0 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78  (outbuf[0] != 0x
135f0 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  00) {....CACKEY_
13600 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
13610 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 69  recognized paddi
13620 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 73  ng scheme -- pas
13630 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f  sing back and ho
13640 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  ping for the bes
13650 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  t!");.....CACKEY
13660 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
13670 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
13680 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  ess, retval = %l
13690 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e  i (bytes)", (lon
136a0 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72  g) retval);....r
136b0 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
136c0 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20  .}....blocktype 
136d0 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75  = outbuf[1];...u
136e0 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a  npadoffset = 0;.
136f0 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63 6b  ...switch (block
13700 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
13710 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x00:...../* Pad
13720 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 74  ding Scheme 1, t
13730 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72  he first non-zer
13740 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73 74  o byte is the st
13750 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09  art of data */..
13760 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
13770 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
13780 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
13790 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
137a0 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
137b0 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20  unpadoffset] != 
137c0 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62 72  0x00) {.......br
137d0 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  eak;......}.....
137e0 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
137f0 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09 2f  case 0x01:...../
13800 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
13810 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61 72   2, pad bytes ar
13820 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20  e 0xFF followed 
13830 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 66  by 0x00 */.....f
13840 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  or (unpadoffset 
13850 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  = 2; unpadoffset
13860 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64   < retval; unpad
13870 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09  offset++) {.....
13880 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61  .if (outbuf[unpa
13890 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46 46  doffset] != 0xFF
138a0 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f 75  ) {.......if (ou
138b0 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
138c0 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] == 0x00) {....
138d0 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b  ....unpadoffset+
138e0 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61 6b  +;.........break
138f0 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  ;.......} else {
13900 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  ........CACKEY_D
13910 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
13920 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74  alid padding dat
13930 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69  a found, returni
13940 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73  ng in failure, s
13950 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
13960 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30 32  0x00 found 0x%02
13970 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  x", (unsigned in
13980 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  t) outbuf[unpado
13990 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09  ffset]);........
139a0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
139b0 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65  ...}......} else
139c0 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
139d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
139e0 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61  valid padding da
139f0 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ta found, return
13a00 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ing in failure, 
13a10 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
13a20 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25 30   0xFF found 0x%0
13a30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  2x", (unsigned i
13a40 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  nt) outbuf[unpad
13a50 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09  offset]);.......
13a60 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
13a70 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  ..}.....}.....br
13a80 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30  eak;....case 0x0
13a90 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e  2:...../* Paddin
13aa0 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64 20  g Scheme 3, pad 
13ab0 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65  bytes are non-ze
13ac0 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62 79  ro first zero by
13ad0 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20  te found is the 
13ae0 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20 2a  seperator byte *
13af0 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
13b00 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
13b10 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
13b20 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
13b30 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
13b40 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
13b50 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  == 0x00) {......
13b60 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a  .unpadoffset++;.
13b70 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
13b80 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
13b90 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
13ba0 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 72  (unpadoffset > r
13bb0 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b  etval) {....CACK
13bc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13bd0 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72 20  "Offset greater 
13be0 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c  than reply size,
13bf0 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70   aborting.  (unp
13c00 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c 20  adoffset = %lu, 
13c10 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20  retval = %lu)", 
13c20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
13c30 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75 6e  unpadoffset, (un
13c40 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74  signed long) ret
13c50 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
13c60 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  (-1);...}....CAC
13c70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
13c80 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f 75  UF("Padded:", ou
13c90 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  tbuf, retval);..
13ca0 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61  ..retval -= unpa
13cb0 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f  doffset;...memmo
13cc0 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 75  ve(outbuf, outbu
13cd0 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c  f + unpadoffset,
13ce0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43   retval);....CAC
13cf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
13d00 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20  UF("Unpadded:", 
13d10 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b  outbuf, retval);
13d20 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
13d30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
13d40 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
13d50 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28  , retval = %li (
13d60 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20  bytes)", (long) 
13d70 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
13d80 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a  n(retval);.}../*
13d90 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
13da0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
13db0 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
13dc0 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
13dd0 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
13de0 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
13df0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
13e00 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
13e10 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74   cackey_login(st
13e20 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
13e30 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
13e40 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69   char *pin, unsi
13e50 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65  gned long pin_le
13e60 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65  n, int *tries_re
13e70 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 73 74  maining_p) {..st
13e80 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
13e90 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f  _identity *pcsc_
13ea0 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
13eb0 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70  igned char cac_p
13ec0 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30  in[8] = {0xFF, 0
13ed0 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c  xFF, 0xFF, 0xFF,
13ee0 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46   0xFF, 0xFF, 0xF
13ef0 46 2c 20 30 78 46 46 7d 3b 0a 09 75 6e 73 69 67  F, 0xFF};..unsig
13f00 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
13f10 74 73 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  ts;..uint16_t re
13f20 73 70 6f 6e 73 65 5f 63 6f 64 65 3b 0a 09 69 6e  sponse_code;..in
13f30 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  t tries_remainin
13f40 67 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  g;..int send_ret
13f50 3b 0a 09 69 6e 74 20 6b 65 79 5f 72 65 66 65 72  ;..int key_refer
13f60 65 6e 63 65 20 3d 20 30 78 30 30 3b 0a 0a 09 2f  ence = 0x00;.../
13f70 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
13f80 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 61  we do not know a
13f90 62 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 74 72  bout how many tr
13fa0 69 65 73 20 61 72 65 20 72 65 6d 61 69 6e 69 6e  ies are remainin
13fb0 67 20 2a 2f 0a 09 69 66 20 28 74 72 69 65 73 5f  g */..if (tries_
13fc0 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09  remaining_p) {..
13fd0 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e  .*tries_remainin
13fe0 67 5f 70 20 3d 20 2d 31 3b 0a 09 7d 0a 0a 09 2f  g_p = -1;..}.../
13ff0 2a 20 41 70 70 61 72 65 6e 74 6c 79 2c 20 43 41  * Apparently, CA
14000 43 20 50 49 4e 73 20 61 72 65 20 2a 45 58 41 43  C PINs are *EXAC
14010 54 4c 59 2a 20 38 20 62 79 74 65 73 20 6c 6f 6e  TLY* 8 bytes lon
14020 67 20 2d 2d 20 70 61 64 20 77 69 74 68 20 30 78  g -- pad with 0x
14030 46 46 20 69 66 20 74 6f 6f 20 73 68 6f 72 74 20  FF if too short 
14040 2a 2f 0a 09 69 66 20 28 70 69 6e 5f 6c 65 6e 20  */..if (pin_len 
14050 3e 3d 20 38 29 20 7b 0a 09 09 6d 65 6d 63 70 79  >= 8) {...memcpy
14060 28 63 61 63 5f 70 69 6e 2c 20 70 69 6e 2c 20 38  (cac_pin, pin, 8
14070 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6d  );..} else {...m
14080 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
14090 69 6e 2c 20 70 69 6e 5f 6c 65 6e 29 3b 0a 09 7d  in, pin_len);..}
140a0 0a 0a 09 2f 2a 20 50 49 56 20 61 75 74 68 65 6e  .../* PIV authen
140b0 74 69 63 61 74 69 6f 6e 20 75 73 65 73 20 61 20  tication uses a 
140c0 22 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 22 20  "key_reference" 
140d0 6f 66 20 30 78 38 30 20 2a 2f 0a 09 70 63 73 63  of 0x80 */..pcsc
140e0 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
140f0 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
14100 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  slot, NULL, &num
14110 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 6e 75  _certs);..if (nu
14120 6d 5f 63 65 72 74 73 20 3e 20 30 20 26 26 20 70  m_certs > 0 && p
14130 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21  csc_identities !
14140 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 77 69 74  = NULL) {...swit
14150 63 68 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  ch (pcsc_identit
14160 69 65 73 5b 30 5d 2e 69 64 5f 74 79 70 65 29 20  ies[0].id_type) 
14170 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59  {....case CACKEY
14180 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09  _ID_TYPE_PIV:...
14190 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
141a0 52 49 4e 54 46 28 22 57 65 20 72 65 63 65 6e 74  RINTF("We recent
141b0 6c 79 20 68 61 64 20 61 20 50 49 56 20 63 61 72  ly had a PIV car
141c0 64 2c 20 73 6f 20 77 65 20 77 69 6c 6c 20 61 74  d, so we will at
141d0 74 65 6d 70 74 20 74 6f 20 61 75 74 68 65 6e 74  tempt to authent
141e0 69 63 61 74 65 20 75 73 69 6e 67 20 74 68 65 20  icate using the 
141f0 50 49 56 20 41 70 70 6c 69 63 61 74 69 6f 6e 20  PIV Application 
14200 6b 65 79 20 72 65 66 65 72 65 6e 63 65 22 29 3b  key reference");
14210 0a 0a 09 09 09 09 6b 65 79 5f 72 65 66 65 72 65  ......key_refere
14220 6e 63 65 20 3d 20 30 78 38 30 3b 0a 09 09 09 09  nce = 0x80;.....
14230 62 72 65 61 6b 3b 0a 09 09 09 64 65 66 61 75 6c  break;....defaul
14240 74 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  t:.....break;...
14250 7d 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65 20  }..}.../* Issue 
14260 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09 73  PIN Verify */..s
14270 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
14280 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
14290 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
142a0 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
142b0 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c 20  R_VERIFY, 0x00, 
142c0 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20 73  key_reference, s
142d0 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c 20  izeof(cac_pin), 
142e0 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20 26  cac_pin, 0x00, &
142f0 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20 4e  response_code, N
14300 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66  ULL, NULL);...if
14310 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
14320 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
14330 7b 0a 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73  {...if ((respons
14340 65 5f 63 6f 64 65 20 26 20 30 78 36 33 43 30 29  e_code & 0x63C0)
14350 20 3d 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09   == 0x63C0) {...
14360 09 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  .tries_remaining
14370 20 3d 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64   = (response_cod
14380 65 20 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41  e & 0xF);.....CA
14390 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
143a0 46 28 22 50 49 4e 20 56 65 72 69 66 69 63 61 74  F("PIN Verificat
143b0 69 6f 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74  ion failed, %i t
143c0 72 69 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c  ries remaining",
143d0 20 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67   tries_remaining
143e0 29 3b 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73  );.....if (tries
143f0 5f 72 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a  _remaining_p) {.
14400 09 09 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69  ....*tries_remai
14410 6e 69 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72  ning_p = tries_r
14420 65 6d 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a  emaining;....}..
14430 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
14440 5f 50 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b  _PCSC_E_BADPIN);
14450 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70  ...}....if (resp
14460 6f 6e 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36  onse_code == 0x6
14470 39 38 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  983) {....CACKEY
14480 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
14490 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
144a0 66 61 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69  failed, device i
144b0 73 20 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09  s locked");.....
144c0 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
144d0 53 43 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09  SC_E_LOCKED);...
144e0 7d 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  }....return(CACK
144f0 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
14500 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
14510 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49  DEBUG_PRINTF("PI
14520 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73  N Verification s
14530 75 63 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65  ucceeded");...re
14540 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
14550 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
14560 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
14570 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d   .... *. * ARGUM
14580 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ENTS. *     ....
14590 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
145a0 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  UE. *     .... *
145b0 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20  . * NOTES. *    
145c0 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74   .... *. */.stat
145d0 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61  ic cackey_ret ca
145e0 63 6b 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65  ckey_token_prese
145f0 6e 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  nt(struct cackey
14600 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09  _slot *slot) {..
14610 63 61 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f  cackey_ret pcsc_
14620 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57  connect_ret;..DW
14630 4f 52 44 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d  ORD reader_len =
14640 20 30 2c 20 73 74 61 74 65 20 3d 20 30 2c 20 70   0, state = 0, p
14650 72 6f 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72  rotocol = 0, atr
14660 5f 6c 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b  _len;..BYTE atr[
14670 4d 41 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09  MAX_ATR_SIZE];..
14680 4c 4f 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c  LONG status_ret,
14690 20 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65   scard_reconn_re
146a0 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
146b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
146c0 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d  .");...if (slot-
146d0 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43  >internal) {...C
146e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
146f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f  TF("Returning to
14700 6b 65 6e 20 70 72 65 73 65 6e 74 20 28 69 6e 74  ken present (int
14710 65 72 6e 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a  ernal token)");.
14720 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
14730 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
14740 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  SENT);..}...pcsc
14750 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63  _connect_ret = c
14760 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61  ackey_connect_ca
14770 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70  rd(slot);..if (p
14780 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
14790 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
147a0 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
147b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
147c0 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20  able to connect 
147d0 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69  to card, returni
147e0 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22  ng token absent"
147f0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43  );....return(CAC
14800 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
14810 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41  ABSENT);..}...CA
14820 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
14830 46 28 22 43 61 6c 6c 69 6e 67 20 53 43 61 72 64  F("Calling SCard
14840 53 74 61 74 75 73 28 29 20 74 6f 20 64 65 74 65  Status() to dete
14850 72 6d 69 6e 65 20 63 61 72 64 20 73 74 61 74 75  rmine card statu
14860 73 22 29 3b 0a 0a 09 61 74 72 5f 6c 65 6e 20 3d  s");...atr_len =
14870 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 73   sizeof(atr);..s
14880 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72  tatus_ret = SCar
14890 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63  dStatus(slot->pc
148a0 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26  sc_card, NULL, &
148b0 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61  reader_len, &sta
148c0 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61  te, &protocol, a
148d0 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 0a  tr, &atr_len);..
148e0 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20  .if (status_ret 
148f0 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  == SCARD_E_INVAL
14900 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a 09 09 43  ID_HANDLE) {...C
14910 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14920 54 46 28 22 53 43 61 72 64 53 74 61 74 75 73 28  TF("SCardStatus(
14930 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
14940 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  _E_INVALID_HANDL
14950 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73 20 6e 6f  E, marking is no
14960 74 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e 65 63  t already connec
14970 74 65 64 20 61 6e 64 20 74 72 79 69 6e 67 20 61  ted and trying a
14980 67 61 69 6e 22 29 3b 0a 09 09 63 61 63 6b 65 79  gain");...cackey
14990 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
149a0 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63 73 63 5f  (slot);....pcsc_
149b0 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
149c0 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72  ckey_connect_car
149d0 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66 20 28 70  d(slot);...if (p
149e0 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20  csc_connect_ret 
149f0 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
14a00 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  _OK) {....CACKEY
14a10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
14a20 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
14a30 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
14a40 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
14a50 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43  ");.....return(C
14a60 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
14a70 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 0a  ENABSENT);...}..
14a80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14a90 52 49 4e 54 46 28 22 43 61 6c 6c 69 6e 67 20 53  RINTF("Calling S
14aa0 43 61 72 64 53 74 61 74 75 73 28 29 20 61 67 61  CardStatus() aga
14ab0 69 6e 22 29 3b 0a 0a 09 09 61 74 72 5f 6c 65 6e  in");....atr_len
14ac0 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a   = sizeof(atr);.
14ad0 09 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53  ..status_ret = S
14ae0 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d  CardStatus(slot-
14af0 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c  >pcsc_card, NULL
14b00 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26  , &reader_len, &
14b10 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c  state, &protocol
14b20 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29  , atr, &atr_len)
14b30 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75  ;..}...if (statu
14b40 73 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53  s_ret != SCARD_S
14b50 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 63 61  _SUCCESS) {...ca
14b60 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72  ckey_mark_slot_r
14b70 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69  eset(slot);....i
14b80 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d  f (status_ret ==
14b90 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43   SCARD_W_RESET_C
14ba0 41 52 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ARD) {....CACKEY
14bb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
14bc0 65 73 65 74 20 72 65 71 75 69 72 65 64 2c 20 70  eset required, p
14bd0 6c 65 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b  lease hold...");
14be0 0a 0a 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e  .....scard_recon
14bf0 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  n_ret = cackey_r
14c00 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c  econnect_card(sl
14c10 6f 74 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ot, SCARD_PROTOC
14c20 4f 4c 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52  OL_T0 | SCARD_PR
14c30 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74  OTOCOL_T1, &prot
14c40 6f 63 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63  ocol);....if (sc
14c50 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
14c60 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
14c70 53 29 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61  S) {...../* Upda
14c80 74 65 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09  te protocol */..
14c90 09 09 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f  ...slot->protoco
14ca0 6c 20 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09  l = protocol;...
14cb0 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69  .../* Re-establi
14cc0 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  sh transaction, 
14cd0 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e  if it was presen
14ce0 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f  t */.....if (slo
14cf0 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
14d00 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
14d10 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
14d20 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09  on_depth--;.....
14d30 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
14d40 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
14d50 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
14d60 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
14d70 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a  on(slot);.....}.
14d80 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
14d90 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
14da0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75  successful, requ
14db0 65 72 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74  erying");.....st
14dc0 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64  atus_ret = SCard
14dd0 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73  Status(slot->pcs
14de0 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72  c_card, NULL, &r
14df0 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74  eader_len, &stat
14e00 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74  e, &protocol, at
14e10 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09  r, &atr_len);...
14e20 09 09 69 66 20 28 73 74 61 74 75 73 5f 72 65 74  ..if (status_ret
14e30 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
14e40 45 53 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ESS) {......CACK
14e50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14e60 22 53 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f  "Still unable to
14e70 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74   query card stat
14e80 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f  us, returning to
14e90 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61  ken absent.  SCa
14ea0 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22  rdStatus() = %s"
14eb0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
14ec0 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
14ed0 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29  STR(status_ret))
14ee0 3b 0a 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43  ;.......return(C
14ef0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
14f00 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d  ENABSENT);.....}
14f10 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
14f20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14f30 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
14f40 72 65 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72  reconnect to car
14f50 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  d, returning tok
14f60 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
14f70 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25  dReconnect() = %
14f80 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  s", CACKEY_DEBUG
14f90 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54  _FUNC_SCARDERR_T
14fa0 4f 5f 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f  O_STR(scard_reco
14fb0 6e 6e 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72  nn_ret));......r
14fc0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
14fd0 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29  C_E_TOKENABSENT)
14fe0 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  ;....}...} else 
14ff0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
15000 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
15010 20 74 6f 20 71 75 65 72 79 20 63 61 72 64 20 73   to query card s
15020 74 61 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67  tatus, returning
15030 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20   token absent.  
15040 53 43 61 72 64 53 74 61 74 75 73 28 29 20 3d 20  SCardStatus() = 
15050 25 73 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  %s", CACKEY_DEBU
15060 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f  G_FUNC_SCARDERR_
15070 54 4f 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65  TO_STR(status_re
15080 74 29 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  t));.....return(
15090 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f  CACKEY_PCSC_E_TO
150a0 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a  KENABSENT);...}.
150b0 09 7d 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20  .}...if ((state 
150c0 26 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20  & SCARD_ABSENT) 
150d0 3d 3d 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29  == SCARD_ABSENT)
150e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
150f0 47 5f 50 52 49 4e 54 46 28 22 43 61 72 64 20 69  G_PRINTF("Card i
15100 73 20 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e  s absent, return
15110 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74  ing token absent
15120 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
15130 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
15140 4e 41 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43  NABSENT);..}...C
15150 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15160 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f  TF("Returning to
15170 6b 65 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a  ken present.");.
15180 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
15190 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
151a0 45 4e 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  ENT);.}../*. * S
151b0 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
151c0 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
151d0 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
151e0 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
151f0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
15200 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
15210 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
15220 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
15230 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f  pcsc_identity_to
15240 5f 6c 61 62 65 6c 28 73 74 72 75 63 74 20 63 61  _label(struct ca
15250 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
15260 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e  ty *identity, un
15270 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62  signed char *lab
15280 65 6c 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64  el_buf, unsigned
15290 20 6c 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f   long label_buf_
152a0 6c 65 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  len) {..unsigned
152b0 20 6c 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74   long certificat
152c0 65 5f 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61  e_len;..void *la
152d0 62 65 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20  bel_asn1;..void 
152e0 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69  *certificate;..i
152f0 6e 74 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  nt x509_read_ret
15300 3b 0a 0a 09 63 65 72 74 69 66 69 63 61 74 65 20  ;...certificate 
15310 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
15320 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66  ificate;..certif
15330 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e  icate_len = iden
15340 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74  tity->certificat
15350 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72  e_len;...if (cer
15360 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30  tificate_len < 0
15370 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  ) {...return(-1)
15380 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64  ;..}...x509_read
15390 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73  _ret = x509_to_s
153a0 75 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61  ubject(certifica
153b0 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
153c0 6c 65 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26  len, (void **) &
153d0 6c 61 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66  label_asn1);..if
153e0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
153f0 3c 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28  < 0) {...return(
15400 2d 31 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72  -1);..}...x509_r
15410 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64  ead_ret = x509_d
15420 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65  n_to_string(labe
15430 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61  l_asn1, x509_rea
15440 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20  d_ret, (char *) 
15450 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c  label_buf, label
15460 5f 62 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b  _buf_len, "CN");
15470 0a 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f  ..if (x509_read_
15480 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35  ret <= 0) {...x5
15490 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
154a0 30 39 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28  09_dn_to_string(
154b0 6c 61 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39  label_asn1, x509
154c0 5f 72 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72  _read_ret, (char
154d0 20 2a 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c   *) label_buf, l
154e0 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55  abel_buf_len, NU
154f0 4c 4c 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39  LL);....if (x509
15500 5f 72 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20  _read_ret <= 0) 
15510 7b 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  {....return(-1);
15520 0a 09 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20  ...}..}..#ifdef 
15530 43 41 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a  CACKEY_PARANOID.
15540 23 20 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f  #  ifdef _POSIX_
15550 53 53 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78  SSIZE_MAX..if (x
15560 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f  509_read_ret > _
15570 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
15580 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15590 47 5f 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72  G_PRINTF("x509_r
155a0 65 61 64 5f 72 65 74 20 65 78 63 65 65 64 73 20  ead_ret exceeds 
155b0 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72  maximum value, r
155c0 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
155d0 75 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c  ure. (max = %li,
155e0 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d   x509_read_ret =
155f0 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f   %lu)", (long) _
15600 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c  POSIX_SSIZE_MAX,
15610 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15620 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b   x509_read_ret);
15630 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
15640 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .}.#  endif.#end
15650 69 66 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39  if...return(x509
15660 5f 72 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f  _read_ret);.}../
15670 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73  * Returns 0 on s
15680 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63  uccess */.static
15690 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65   int cackey_mute
156a0 78 5f 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a  x_create(void **
156b0 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
156c0 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
156d0 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
156e0 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
156f0 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
15700 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
15710 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
15720 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
15730 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
15740 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
15750 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
15760 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
15770 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
15780 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74  alloc(sizeof(*pt
15790 68 72 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09  hread_mutex));..
157a0 09 69 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75  .if (!pthread_mu
157b0 74 65 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  tex) {....CACKEY
157c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
157d0 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74  ailed to allocat
157e0 65 20 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09  e memory.");....
157f0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
15800 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65 74 76  ....pthread_retv
15810 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74  al = pthread_mut
15820 65 78 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f  ex_init(pthread_
15830 6d 75 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09  mutex, NULL);...
15840 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76  if (pthread_retv
15850 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
15860 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15870 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78  F("pthread_mutex
15880 5f 69 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64  _init() returned
15890 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70   error (%i).", p
158a0 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a  thread_retval);.
158b0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
158c0 09 09 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20  ..}....*mutex = 
158d0 70 74 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09  pthread_mutex;..
158e0 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63  } else {...if (c
158f0 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74  ackey_args.Creat
15900 65 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73  eMutex) {....cus
15910 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tom_retval = cac
15920 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
15930 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09  utex(mutex);....
15940 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76  .if (custom_retv
15950 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a  al != CKR_OK) {.
15960 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15970 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f  _PRINTF("cackey_
15980 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
15990 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f  () returned erro
159a0 72 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67  r (%li).", (long
159b0 29 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29  ) custom_retval)
159c0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31  ;......return(-1
159d0 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a  );....}...}..}..
159e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
159f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
15a00 73 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22  sucessfully (0)"
15a10 29 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  );...return(0);.
15a20 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20  }../* Returns 0 
15a30 6f 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74  on success */.st
15a40 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f  atic int cackey_
15a50 6d 75 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20  mutex_lock(void 
15a60 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65  *mutex) {..pthre
15a70 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72  ad_mutex_t *pthr
15a80 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20  ead_mutex;..int 
15a90 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a  pthread_retval;.
15aa0 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65  .CK_RV custom_re
15ab0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
15ac0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
15ad0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63  led.");...if ((c
15ae0 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73  ackey_args.flags
15af0 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e   & CKF_OS_LOCKIN
15b00 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f  G_OK) == CKF_OS_
15b10 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09  LOCKING_OK) {...
15b20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20  pthread_mutex = 
15b30 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61  mutex;....pthrea
15b40 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65  d_retval = pthre
15b50 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74  ad_mutex_lock(pt
15b60 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09  hread_mutex);...
15b70 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76  if (pthread_retv
15b80 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41  al != 0) {....CA
15b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15ba0 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78  F("pthread_mutex
15bb0 5f 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64  _lock() returned
15bc0 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70   error (%i).", p
15bd0 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a  thread_retval);.
15be0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
15bf0 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
15c00 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e  if (cackey_args.
15c10 4c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09  LockMutex) {....
15c20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20  custom_retval = 
15c30 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
15c40 4d 75 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09  Mutex(mutex);...
15c50 09 09 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74  ..if (custom_ret
15c60 76 61 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val != CKR_OK) {
15c70 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15c80 47 5f 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79  G_PRINTF("cackey
15c90 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28  _args.LockMutex(
15ca0 29 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72  ) returned error
15cb0 20 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29   (%li).", (long)
15cc0 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b   custom_retval);
15cd0 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ......return(-1)
15ce0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09  ;....}...}..}...
15cf0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15d00 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73  NTF("Returning s
15d10 75 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29  ucessfully (0)")
15d20 3b 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d  ;...return(0);.}
15d30 0a 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f  ../* Returns 0 o
15d40 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61  n success */.sta
15d50 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d  tic int cackey_m
15d60 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64  utex_unlock(void
15d70 20 2a 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72   *mutex) {..pthr
15d80 65 61 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68  ead_mutex_t *pth
15d90 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74  read_mutex;..int
15da0 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b   pthread_retval;
15db0 0a 09 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72  ..CK_RV custom_r
15dc0 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
15dd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
15de0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28  lled.");...if ((
15df0 63 61 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67  cackey_args.flag
15e00 73 20 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49  s & CKF_OS_LOCKI
15e10 4e 47 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53  NG_OK) == CKF_OS
15e20 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09  _LOCKING_OK) {..
15e30 09 70 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d  .pthread_mutex =
15e40 20 6d 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65   mutex;....pthre
15e50 61 64 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72  ad_retval = pthr
15e60 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  ead_mutex_unlock
15e70 28 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b  (pthread_mutex);
15e80 0a 09 09 69 66 20 28 70 74 68 72 65 61 64 5f 72  ...if (pthread_r
15e90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
15ea0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
15eb0 49 4e 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75  INTF("pthread_mu
15ec0 74 65 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74  tex_unlock() ret
15ed0 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29  urned error (%i)
15ee0 2e 22 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76  .", pthread_retv
15ef0 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  al);.....return(
15f00 2d 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  -1);...}..} else
15f10 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f   {...if (cackey_
15f20 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
15f30 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65  ) {....custom_re
15f40 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72  tval = cackey_ar
15f50 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d  gs.UnlockMutex(m
15f60 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63  utex);.....if (c
15f70 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20  ustom_retval != 
15f80 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41  CKR_OK) {.....CA
15f90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15fa0 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55  F("cackey_args.U
15fb0 6e 6c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74  nlockMutex() ret
15fc0 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69  urned error (%li
15fd0 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74  ).", (long) cust
15fe0 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  om_retval);.....
15ff0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
16000 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45  }...}..}...CACKE
16010 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16020 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73  Returning sucess
16030 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72  fully (0)");...r
16040 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61  eturn(0);.}..sta
16050 74 69 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45  tic CK_ATTRIBUTE
16060 5f 50 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f  _PTR cackey_get_
16070 61 74 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42  attributes(CK_OB
16080 4a 45 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63  JECT_CLASS objec
16090 74 63 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63  tclass, struct c
160a0 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
160b0 69 74 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75  ity *identity, u
160c0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65  nsigned long ide
160d0 6e 74 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c  ntity_num, CK_UL
160e0 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74  ONG_PTR pulCount
160f0 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42  ) {..static CK_B
16100 42 4f 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31  BOOL ck_true = 1
16110 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f  ;..static CK_BBO
16120 4f 4c 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b  OL ck_false = 0;
16130 0a 09 73 74 61 74 69 63 20 43 4b 5f 54 52 55 53  ..static CK_TRUS
16140 54 20 63 6b 5f 74 72 75 73 74 65 64 20 3d 20 43  T ck_trusted = C
16150 4b 5f 54 52 55 53 54 45 44 5f 44 45 4c 45 47 41  K_TRUSTED_DELEGA
16160 54 4f 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e  TOR;..CK_ULONG n
16170 75 6d 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74  umattrs = 0, ret
16180 76 61 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41  val_count;..CK_A
16190 54 54 52 49 42 55 54 45 5f 54 59 50 45 20 63 75  TTRIBUTE_TYPE cu
161a0 72 72 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43  rr_attr_type;..C
161b0 4b 5f 41 54 54 52 49 42 55 54 45 20 63 75 72 72  K_ATTRIBUTE curr
161c0 5f 61 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a  _attr, *retval;.
161d0 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61  .CK_VOID_PTR pVa
161e0 6c 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  lue;..CK_ULONG u
161f0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f  lValueLen;..CK_O
16200 42 4a 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f  BJECT_CLASS ck_o
16210 62 6a 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b  bject_class;..CK
16220 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
16230 45 20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  E ck_certificate
16240 5f 74 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54  _type;..CK_KEY_T
16250 59 50 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b  YPE ck_key_type;
16260 0a 09 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63  ..CK_UTF8CHAR uc
16270 54 6d 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 53  TmpBuf[1024];..S
16280 48 41 31 43 6f 6e 74 65 78 74 20 73 68 61 31 5f  HA1Context sha1_
16290 63 74 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d 64  ctx;..MD5_CTX md
162a0 35 5f 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74 20  5_ctx;..uint8_t 
162b0 73 68 61 31 5f 68 61 73 68 5b 53 48 41 31 48 61  sha1_hash[SHA1Ha
162c0 73 68 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f  shSize];..uint8_
162d0 74 20 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48 61  t md5_hash[MD5Ha
162e0 73 68 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e  shSize];..unsign
162f0 65 64 20 63 68 61 72 20 2a 63 65 72 74 69 66 69  ed char *certifi
16300 63 61 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63  cate;..ssize_t c
16310 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
16320 20 2d 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72   -1, x509_read_r
16330 65 74 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f  et;..int pValue_
16340 66 72 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  free;...CACKEY_D
16350 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
16360 6c 65 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73  led (objectClass
16370 20 3d 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79   = %lu, identity
16380 5f 6e 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28  _num = %lu).", (
16390 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
163a0 62 6a 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e  bjectclass, iden
163b0 74 69 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75  tity_num);...*pu
163c0 6c 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69 66  lCount = 0;...if
163d0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
163e0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
163f0 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
16400 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  != CKO_PUBLIC_KE
16410 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
16420 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   != CKO_PRIVATE_
16430 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61  KEY && objectcla
16440 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
16450 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 43 41  PE_TRUST) {...CA
16460 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16470 46 28 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f  F("Returning 0 o
16480 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69  bjects (NULL), i
16490 6e 76 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c  nvalid object cl
164a0 61 73 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ass");....return
164b0 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  (NULL);..}.../* 
164c0 47 65 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20  Get Cert */..if 
164d0 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  (identity == NUL
164e0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
164f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16500 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
16510 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20  (NULL), invalid 
16520 69 64 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64  identiy provided
16530 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55  ");....return(NU
16540 4c 4c 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66  LL);..}...certif
16550 69 63 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79  icate = identity
16560 2d 3e 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  ->certificate;..
16570 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
16580 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74  = identity->cert
16590 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69  ificate_len;...i
165a0 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
165b0 65 6e 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74  en == -1 || cert
165c0 69 66 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29  ificate == NULL)
165d0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
165e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
165f0 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
16600 55 4c 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74  ULL), this ident
16610 69 74 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ity does not hav
16620 65 20 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69  e an X.509 certi
16630 66 69 63 61 74 65 20 61 73 73 6f 63 69 61 74 65  ficate associate
16640 64 20 77 69 74 68 20 69 74 20 61 6e 64 20 77 69  d with it and wi
16650 6c 6c 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a  ll not work");..
16660 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
16670 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74  .}.../* Verify t
16680 68 61 74 20 63 65 72 74 69 66 69 63 61 74 65 20  hat certificate 
16690 69 73 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64  is ASN.1 encoded
166a0 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
166b0 74 65 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f  te */..if (x509_
166c0 74 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66  to_serial(certif
166d0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
166e0 74 65 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20  te_len, NULL) < 
166f0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
16700 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
16710 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20  rning 0 objects 
16720 28 4e 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30  (NULL), the X.50
16730 39 20 63 65 72 74 69 66 69 63 61 74 65 20 61 73  9 certificate as
16740 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
16750 69 73 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e  is identity is n
16760 6f 74 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72  ot valid");....r
16770 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
16780 0a 09 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d  ..retval_count =
16790 20 36 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d   64;..retval = m
167a0 61 6c 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75  alloc(retval_cou
167b0 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74  nt * sizeof(*ret
167c0 76 61 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75  val));...for (cu
167d0 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30  rr_attr_type = 0
167e0 3b 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ; curr_attr_type
167f0 20 3c 20 30 78 63 65 35 33 36 33 62 66 3b 20 63   < 0xce5363bf; c
16800 75 72 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29  urr_attr_type++)
16810 20 7b 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74   {...if (curr_at
16820 74 72 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30  tr_type == 0x800
16830 29 20 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72  ) {....curr_attr
16840 5f 74 79 70 65 20 3d 20 30 78 63 65 35 33 36 33  _type = 0xce5363
16850 30 30 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75  00;...}....pValu
16860 65 5f 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56  e_free = 0;...pV
16870 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75  alue = NULL;...u
16880 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f  lValueLen = (CK_
16890 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69  LONG) -1;....swi
168a0 74 63 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74  tch (curr_attr_t
168b0 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43  ype) {....case C
168c0 4b 41 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41  KA_CLASS:.....CA
168d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
168e0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
168f0 74 72 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53  tribute CKA_CLAS
16900 53 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  S (0x%08lx) ..."
16910 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16920 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
16930 29 3b 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63  );......ck_objec
16940 74 5f 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74  t_class = object
16950 63 6c 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c  class;......pVal
16960 75 65 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f  ue = &ck_object_
16970 63 6c 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c  class;.....ulVal
16980 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
16990 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b  k_object_class);
169a0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
169b0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
169c0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
169d0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
169e0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f  ed long) *((CK_O
169f0 42 4a 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70  BJECT_CLASS *) p
16a00 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
16a10 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
16a20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
16a30 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
16a40 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09   CKA_TOKEN:.....
16a50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16a60 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
16a70 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f  attribute CKA_TO
16a80 4b 45 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  KEN (0x%08lx) ..
16a90 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
16aa0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
16ab0 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
16ac0 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09   = &ck_true;....
16ad0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
16ae0 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a  zeof(ck_true);..
16af0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16b00 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
16b10 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
16b20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
16b30 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
16b40 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
16b50 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
16b60 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
16b70 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
16b80 09 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56  ...case CKA_PRIV
16b90 41 54 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  ATE:.....CACKEY_
16ba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
16bb0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
16bc0 74 65 20 43 4b 41 5f 50 52 49 56 41 54 45 20 28  te CKA_PRIVATE (
16bd0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
16be0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
16bf0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
16c00 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
16c10 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
16c20 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
16c30 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16c40 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
16c50 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
16c60 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
16c70 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  ot a Netscape tr
16c80 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
16c90 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
16ca0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
16cb0 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c  ck_false;.....ul
16cc0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
16cd0 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09  f(ck_false);....
16ce0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16cf0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
16d00 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
16d10 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
16d20 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
16d30 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
16d40 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
16d50 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
16d60 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
16d70 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45  .case CKA_TRUSTE
16d80 44 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  D:.....CACKEY_DE
16d90 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
16da0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
16db0 20 43 4b 41 5f 54 52 55 53 54 45 44 20 28 30 78   CKA_TRUSTED (0x
16dc0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
16dd0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
16de0 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
16df0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
16e00 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
16e10 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
16e20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16e30 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
16e40 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
16e50 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
16e60 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
16e70 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
16e80 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
16e90 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
16ea0 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
16eb0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
16ec0 75 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ue);......CACKEY
16ed0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
16ee0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
16ef0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
16f00 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
16f10 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
16f20 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
16f30 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
16f40 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
16f50 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
16f60 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09  A_MODIFIABLE:...
16f70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16f80 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
16f90 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
16fa0 4d 4f 44 49 46 49 41 42 4c 45 20 28 30 78 25 30  MODIFIABLE (0x%0
16fb0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
16fc0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
16fd0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
16fe0 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
16ff0 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  lse;.....ulValue
17000 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
17010 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43  false);......CAC
17020 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17030 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
17040 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20   %lu (%p/%lu)", 
17050 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17060 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70  *((CK_BBOOL *) p
17070 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20  Value), pValue, 
17080 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17090 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09  ulValueLen);....
170a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
170b0 20 43 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09   CKA_LABEL:.....
170c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
170d0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
170e0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41  attribute CKA_LA
170f0 42 45 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  BEL (0x%08lx) ..
17100 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
17110 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
17120 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 69 64  pe);......if (id
17130 65 6e 74 69 74 79 2d 3e 69 64 5f 74 79 70 65 20  entity->id_type 
17140 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  == CACKEY_ID_TYP
17150 45 5f 50 49 56 29 20 7b 0a 09 09 09 09 09 70 56  E_PIV) {......pV
17160 61 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d  alue = identity-
17170 3e 63 61 72 64 2e 70 69 76 2e 6c 61 62 65 6c 3b  >card.piv.label;
17180 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
17190 20 3d 20 73 74 72 6c 65 6e 28 70 56 61 6c 75 65   = strlen(pValue
171a0 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
171b0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
171c0 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61 72  = snprintf((char
171d0 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73 69   *) ucTmpBuf, si
171e0 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20  zeof(ucTmpBuf), 
171f0 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c  "Identity #%lu",
17200 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17210 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a   identity_num);.
17220 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63  .....pValue = uc
17230 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 09 69 66  TmpBuf;.......if
17240 20 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20   (ulValueLen >= 
17250 73 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29  sizeof(ucTmpBuf)
17260 29 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  ) {.......ulValu
17270 65 4c 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 09  eLen = 0;.......
17280 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
17290 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
172a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
172b0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
172c0 6e 69 6e 67 20 28 25 70 2f 25 6c 75 29 22 2c 20  ning (%p/%lu)", 
172d0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
172e0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
172f0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
17300 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c  ....case CKA_VAL
17310 55 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  UE:.....CACKEY_D
17320 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
17330 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
17340 65 20 43 4b 41 5f 56 41 4c 55 45 20 28 30 78 25  e CKA_VALUE (0x%
17350 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
17360 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
17370 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
17380 09 09 73 77 69 74 63 68 20 28 6f 62 6a 65 63 74  ..switch (object
17390 63 6c 61 73 73 29 20 7b 0a 09 09 09 09 09 63 61  class) {......ca
173a0 73 65 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b  se CKO_PRIVATE_K
173b0 45 59 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  EY:.......CACKEY
173c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
173d0 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
173e0 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
173f0 65 20 61 72 65 20 61 20 70 72 69 76 61 74 65 20  e are a private 
17400 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 09 62  key.");........b
17410 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20  reak;......case 
17420 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
17430 53 54 3a 0a 09 09 09 09 09 09 43 41 43 4b 45 59  ST:.......CACKEY
17440 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17450 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
17460 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
17470 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
17480 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
17490 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
174a0 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 55 42  ....case CKO_PUB
174b0 4c 49 43 5f 4b 45 59 3a 0a 09 09 09 09 09 09 69  LIC_KEY:.......i
174c0 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
174d0 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
174e0 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
174f0 3d 20 78 35 30 39 5f 74 6f 5f 70 75 62 6b 65 79  = x509_to_pubkey
17500 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
17510 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
17520 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 09 09  pValue);........
17530 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
17540 74 20 3c 20 30 29 20 7b 20 0a 09 09 09 09 09 09  t < 0) { .......
17550 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
17560 0a 09 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  ........} else {
17570 0a 09 09 09 09 09 09 09 09 75 6c 56 61 6c 75 65  .........ulValue
17580 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
17590 72 65 74 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09  ret;........}...
175a0 09 09 09 09 7d 0a 0a 09 09 09 09 09 09 62 72 65  ....}........bre
175b0 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b  ak;......case CK
175c0 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a 09  O_CERTIFICATE:..
175d0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 63 65  .....pValue = ce
175e0 72 74 69 66 69 63 61 74 65 3b 0a 09 09 09 09 09  rtificate;......
175f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 63 65  .ulValueLen = ce
17600 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a  rtificate_len;..
17610 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17620 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
17630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17640 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
17650 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
17660 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17670 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17680 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17690 41 5f 49 53 53 55 45 52 3a 0a 09 09 09 09 43 41  A_ISSUER:.....CA
176a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
176b0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
176c0 74 72 69 62 75 74 65 20 43 4b 41 5f 49 53 53 55  tribute CKA_ISSU
176d0 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  ER (0x%08lx) ...
176e0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
176f0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
17700 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
17710 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
17720 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20 6f  CERTIFICATE && o
17730 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
17740 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
17750 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
17760 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17770 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
17780 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
17790 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
177a0 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61  ficate or Netsca
177b0 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22  pe trust object"
177c0 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a  );.......break;.
177d0 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63  ....}......if (c
177e0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e  ertificate_len >
177f0 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39  = 0) {......x509
17800 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
17810 5f 74 6f 5f 69 73 73 75 65 72 28 63 65 72 74 69  _to_issuer(certi
17820 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
17830 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65  ate_len, &pValue
17840 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39  );......if (x509
17850 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b  _read_ret < 0) {
17860 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
17870 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73  NULL;......} els
17880 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75  e {.......ulValu
17890 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64  eLen = x509_read
178a0 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09  _ret;......}....
178b0 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
178c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
178d0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25  . returning %p/%
178e0 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  lu", pValue, (un
178f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17900 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17910 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17920 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52 3a  A_SERIAL_NUMBER:
17930 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17940 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
17950 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
17960 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42 45 52  KA_SERIAL_NUMBER
17970 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
17980 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17990 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
179a0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
179b0 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43 45  tclass != CKO_CE
179c0 52 54 49 46 49 43 41 54 45 20 26 26 20 6f 62 6a  RTIFICATE && obj
179d0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
179e0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
179f0 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
17a00 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17a10 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
17a20 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
17a30 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
17a40 63 61 74 65 20 6f 72 20 4e 65 74 73 63 61 70 65  cate or Netscape
17a50 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
17a60 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
17a70 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72  ..}......if (cer
17a80 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20  tificate_len >= 
17a90 30 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72  0) {......x509_r
17aa0 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74  ead_ret = x509_t
17ab0 6f 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69  o_serial(certifi
17ac0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
17ad0 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
17ae0 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
17af0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
17b00 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
17b10 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
17b20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
17b30 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
17b40 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
17b50 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17b60 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17b70 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
17b80 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
17b90 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17ba0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17bb0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17bc0 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 09 43  A_SUBJECT:.....C
17bd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17be0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17bf0 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53 55 42  ttribute CKA_SUB
17c00 4a 45 43 54 20 28 30 78 25 30 38 6c 78 29 20 2e  JECT (0x%08lx) .
17c10 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
17c20 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
17c30 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
17c40 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
17c50 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20 7b  O_CERTIFICATE) {
17c60 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17c70 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17c80 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
17c90 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
17ca0 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69 63  e not a certific
17cb0 61 74 65 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ate");.......bre
17cc0 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
17cd0 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
17ce0 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
17cf0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
17d00 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65 63 74 28  x509_to_subject(
17d10 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
17d20 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
17d30 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
17d40 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
17d50 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
17d60 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
17d70 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
17d80 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
17d90 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
17da0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
17db0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17dc0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
17dd0 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65   %p/%lu", pValue
17de0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17df0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
17e00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
17e10 73 65 20 43 4b 41 5f 49 44 3a 0a 09 09 09 09 43  se CKA_ID:.....C
17e20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
17e30 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
17e40 74 74 72 69 62 75 74 65 20 43 4b 41 5f 49 44 20  ttribute CKA_ID 
17e50 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
17e60 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17e70 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
17e80 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
17e90 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
17ea0 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
17eb0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17ec0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
17ed0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
17ee0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
17ef0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
17f00 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
17f10 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
17f20 09 09 09 75 63 54 6d 70 42 75 66 5b 30 5d 20 3d  ...ucTmpBuf[0] =
17f30 20 28 28 69 64 65 6e 74 69 74 79 5f 6e 75 6d 20   ((identity_num 
17f40 2b 20 31 29 20 3e 3e 20 38 29 20 26 20 30 78 66  + 1) >> 8) & 0xf
17f50 66 3b 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  f;.....ucTmpBuf[
17f60 31 5d 20 3d 20 20 28 69 64 65 6e 74 69 74 79 5f  1] =  (identity_
17f70 6e 75 6d 20 2b 20 31 29 20 26 20 30 78 66 66 3b  num + 1) & 0xff;
17f80 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
17f90 75 63 54 6d 70 42 75 66 3b 0a 09 09 09 09 75 6c  ucTmpBuf;.....ul
17fa0 56 61 6c 75 65 4c 65 6e 20 3d 20 32 3b 0a 0a 09  ValueLen = 2;...
17fb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17fc0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
17fd0 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
17fe0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17ff0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
18000 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
18010 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52  ....case CKA_CER
18020 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09  TIFICATE_TYPE:..
18030 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18040 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18050 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18060 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
18070 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
18080 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18090 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
180a0 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
180b0 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 43  ctclass != CKO_C
180c0 45 52 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09  ERTIFICATE) {...
180d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
180e0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
180f0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
18100 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
18110 6f 74 20 61 20 63 65 72 74 69 66 69 63 61 74 65  ot a certificate
18120 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  .");.......break
18130 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20  ;.....}....../* 
18140 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20  We only support 
18150 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20  one certificate 
18160 74 79 70 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 63  type */.....ck_c
18170 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 20  ertificate_type 
18180 3d 20 43 4b 43 5f 58 5f 35 30 39 3b 0a 0a 09 09  = CKC_X_509;....
18190 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 63  ..pValue = &ck_c
181a0 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65 3b  ertificate_type;
181b0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
181c0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 63 65 72 74  = sizeof(ck_cert
181d0 69 66 69 63 61 74 65 5f 74 79 70 65 29 3b 0a 0a  ificate_type);..
181e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
181f0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
18200 74 75 72 6e 69 6e 67 20 43 4b 43 5f 58 5f 35 30  turning CKC_X_50
18210 39 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29  9 (%lu) (%p/%lu)
18220 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18230 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49  g) *((CK_CERTIFI
18240 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61  CATE_TYPE *) pVa
18250 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
18260 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
18270 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
18280 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
18290 4b 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09  KA_KEY_TYPE:....
182a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
182b0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
182c0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4b   attribute CKA_K
182d0 45 59 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78  EY_TYPE (0x%08lx
182e0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
182f0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
18300 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
18310 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
18320 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
18330 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20   && objectclass 
18340 21 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45  != CKO_PUBLIC_KE
18350 59 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  Y) {......CACKEY
18360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
18370 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
18380 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
18390 65 20 61 72 65 20 6e 6f 74 20 61 20 6b 65 79 2e  e are not a key.
183a0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
183b0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
183c0 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 6f  e only support o
183d0 6e 65 20 6b 65 79 20 74 79 70 65 20 2a 2f 0a 09  ne key type */..
183e0 09 09 09 63 6b 5f 6b 65 79 5f 74 79 70 65 20 3d  ...ck_key_type =
183f0 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09 09 09 09 70   CKK_RSA;......p
18400 56 61 6c 75 65 20 3d 20 26 63 6b 5f 6b 65 79 5f  Value = &ck_key_
18410 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  type;.....ulValu
18420 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18430 5f 6b 65 79 5f 74 79 70 65 29 3b 0a 0a 09 09 09  _key_type);.....
18440 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18450 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
18460 6e 69 6e 67 20 43 4b 4b 5f 52 53 41 20 28 25 6c  ning CKK_RSA (%l
18470 75 29 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  u) (%p/%lu)", (u
18480 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
18490 28 43 4b 5f 43 45 52 54 49 46 49 43 41 54 45 5f  (CK_CERTIFICATE_
184a0 54 59 50 45 20 2a 29 20 70 56 61 6c 75 65 29 2c  TYPE *) pValue),
184b0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
184c0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
184d0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
184e0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49  ;....case CKA_SI
184f0 47 4e 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  GN:.....CACKEY_D
18500 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71  EBUG_PRINTF("Req
18510 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74  uesting attribut
18520 65 20 43 4b 41 5f 53 49 47 4e 20 28 30 78 25 30  e CKA_SIGN (0x%0
18530 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
18540 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18550 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18560 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18570 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
18580 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
18590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
185a0 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
185b0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
185c0 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
185d0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
185e0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
185f0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
18600 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
18610 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
18620 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
18630 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
18640 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
18650 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
18660 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
18670 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
18680 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
18690 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
186a0 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
186b0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
186c0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
186d0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
186e0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
186f0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
18700 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
18710 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
18720 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
18730 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
18740 09 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e  ...case CKA_SIGN
18750 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 09 43 41  _RECOVER:.....CA
18760 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18770 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
18780 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e  tribute CKA_SIGN
18790 5f 52 45 43 4f 56 45 52 20 28 30 78 25 30 38 6c  _RECOVER (0x%08l
187a0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
187b0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
187c0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
187d0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
187e0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
187f0 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
18800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18810 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18820 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
18830 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
18840 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
18850 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
18860 0a 09 09 09 09 7d 0a 0a 09 09 09 09 2f 2a 20 57  .....}....../* W
18870 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79  e currently only
18880 20 73 75 70 70 6f 72 74 20 22 53 69 67 6e 20 77   support "Sign w
18890 69 74 68 20 41 70 70 65 6e 64 69 78 22 20 2a 2f  ith Appendix" */
188a0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
188b0 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56  k_false;.....ulV
188c0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
188d0 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09  (ck_false);.....
188e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
188f0 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
18900 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75  ning %lu (%p/%lu
18910 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
18920 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20  ng) *((CK_BBOOL 
18930 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
18940 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18950 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18960 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18970 63 61 73 65 20 43 4b 41 5f 44 45 43 52 59 50 54  case CKA_DECRYPT
18980 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
18990 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
189a0 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
189b0 43 4b 41 5f 44 45 43 52 59 50 54 20 28 30 78 25  CKA_DECRYPT (0x%
189c0 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
189d0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
189e0 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
189f0 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
18a00 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50  s == CKO_NETSCAP
18a10 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09  E_TRUST) {......
18a20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18a30 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
18a40 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
18a50 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
18a60 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
18a70 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
18a80 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
18a90 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
18aa0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
18ab0 59 20 7c 7c 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y || objectclass
18ac0 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b   == CKO_PUBLIC_K
18ad0 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  EY) {......pValu
18ae0 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09  e = &ck_true;...
18af0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
18b00 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
18b10 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
18b20 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
18b30 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
18b40 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
18b50 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d  ck_false);.....}
18b60 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18b70 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18b80 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
18b90 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
18ba0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
18bb0 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
18bc0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
18bd0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
18be0 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
18bf0 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 53 45  ;....case CKA_SE
18c00 4e 53 49 54 49 56 45 3a 0a 09 09 09 09 43 41 43  NSITIVE:.....CAC
18c10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18c20 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
18c30 72 69 62 75 74 65 20 43 4b 41 5f 53 45 4e 53 49  ribute CKA_SENSI
18c40 54 49 56 45 20 28 30 78 25 30 38 6c 78 29 20 2e  TIVE (0x%08lx) .
18c50 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
18c60 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
18c70 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
18c80 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
18c90 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
18ca0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
18cb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
18cc0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
18cd0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
18ce0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
18cf0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
18d00 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18d10 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
18d20 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
18d30 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
18d40 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
18d50 74 72 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c  true;......ulVal
18d60 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
18d70 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65  k_true);.....} e
18d80 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75  lse {......pValu
18d90 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
18da0 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
18db0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
18dc0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
18dd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18de0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18df0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
18e00 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18e10 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
18e20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
18e30 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18e40 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
18e50 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
18e60 65 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c  e CKA_EXTRACTABL
18e70 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
18e80 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
18e90 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
18ea0 20 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45   CKA_EXTRACTABLE
18eb0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
18ec0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18ed0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
18ee0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
18ef0 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
18f00 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
18f10 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18f20 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
18f30 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
18f40 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
18f50 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
18f60 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
18f70 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
18f80 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
18f90 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
18fa0 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
18fb0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
18fc0 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
18fd0 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
18fe0 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65  rue);.....} else
18ff0 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d   {......pValue =
19000 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09   &ck_true;......
19010 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
19020 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
19030 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
19040 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
19050 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
19060 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
19070 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
19080 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
19090 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
190a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
190b0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
190c0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
190d0 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 09 43  A_MODULUS:.....C
190e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
190f0 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61  TF("Requesting a
19100 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44  ttribute CKA_MOD
19110 55 4c 55 53 20 28 30 78 25 30 38 6c 78 29 20 2e  ULUS (0x%08lx) .
19120 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
19130 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
19140 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
19150 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
19160 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
19170 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
19180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19190 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
191a0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
191b0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
191c0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
191d0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
191e0 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
191f0 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
19200 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
19210 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
19220 5f 6d 6f 64 75 6c 75 73 28 63 65 72 74 69 66 69  _modulus(certifi
19230 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
19240 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b  e_len, &pValue);
19250 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
19260 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09  ead_ret < 0) {..
19270 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  .....pValue = NU
19280 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65 20  LL;......} else 
19290 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  {.......ulValueL
192a0 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f 72  en = x509_read_r
192b0 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d  et;......}.....}
192c0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
192d0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
192e0 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c  returning (%p/%l
192f0 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  u)", pValue, (un
19300 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
19310 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
19320 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
19330 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e  A_PUBLIC_EXPONEN
19340 54 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  T:.....CACKEY_DE
19350 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
19360 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
19370 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f   CKA_PUBLIC_EXPO
19380 4e 45 4e 54 20 28 30 78 25 30 38 6c 78 29 20 2e  NENT (0x%08lx) .
19390 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
193a0 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
193b0 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
193c0 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
193d0 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
193e0 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
193f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
19400 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
19410 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
19420 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
19430 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
19440 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
19450 09 7d 0a 0a 09 09 09 09 69 66 20 28 63 65 72 74  .}......if (cert
19460 69 66 69 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30  ificate_len >= 0
19470 29 20 7b 0a 09 09 09 09 09 78 35 30 39 5f 72 65  ) {......x509_re
19480 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f  ad_ret = x509_to
19490 5f 65 78 70 6f 6e 65 6e 74 28 63 65 72 74 69 66  _exponent(certif
194a0 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61  icate, certifica
194b0 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29  te_len, &pValue)
194c0 3b 0a 09 09 09 09 09 69 66 20 28 78 35 30 39 5f  ;......if (x509_
194d0 72 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 0a  read_ret < 0) {.
194e0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
194f0 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65 6c 73 65  ULL;......} else
19500 20 7b 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65   {.......ulValue
19510 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65 61 64 5f  Len = x509_read_
19520 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  ret;......}.....
19530 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
19540 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19550 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
19560 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
19570 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
19580 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
19590 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
195a0 4b 41 5f 54 52 55 53 54 5f 44 49 47 49 54 41 4c  KA_TRUST_DIGITAL
195b0 5f 53 49 47 4e 41 54 55 52 45 3a 0a 09 09 09 63  _SIGNATURE:....c
195c0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4e 4f  ase CKA_TRUST_NO
195d0 4e 5f 52 45 50 55 44 49 41 54 49 4f 4e 3a 0a 09  N_REPUDIATION:..
195e0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
195f0 5f 4b 45 59 5f 45 4e 43 49 50 48 45 52 4d 45 4e  _KEY_ENCIPHERMEN
19600 54 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  T:....case CKA_T
19610 52 55 53 54 5f 44 41 54 41 5f 45 4e 43 49 50 48  RUST_DATA_ENCIPH
19620 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20  ERMENT:....case 
19630 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 41 47  CKA_TRUST_KEY_AG
19640 52 45 45 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65  REEMENT:....case
19650 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45 59 5f 43   CKA_TRUST_KEY_C
19660 45 52 54 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73  ERT_SIGN:....cas
19670 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 52 4c 5f  e CKA_TRUST_CRL_
19680 53 49 47 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b  SIGN:....case CK
19690 41 5f 54 52 55 53 54 5f 53 45 52 56 45 52 5f 41  A_TRUST_SERVER_A
196a0 55 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  UTH:....case CKA
196b0 5f 54 52 55 53 54 5f 43 4c 49 45 4e 54 5f 41 55  _TRUST_CLIENT_AU
196c0 54 48 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  TH:....case CKA_
196d0 54 52 55 53 54 5f 43 4f 44 45 5f 53 49 47 4e 49  TRUST_CODE_SIGNI
196e0 4e 47 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  NG:....case CKA_
196f0 54 52 55 53 54 5f 45 4d 41 49 4c 5f 50 52 4f 54  TRUST_EMAIL_PROT
19700 45 43 54 49 4f 4e 3a 0a 09 09 09 09 43 41 43 4b  ECTION:.....CACK
19710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19720 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
19730 69 62 75 74 65 20 43 4b 41 5f 54 52 55 53 54 5f  ibute CKA_TRUST_
19740 2e 2e 2e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  ... (0x%08lx) ..
19750 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
19760 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
19770 70 65 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  pe);......pValue
19780 20 3d 20 26 63 6b 5f 74 72 75 73 74 65 64 3b 0a   = &ck_trusted;.
19790 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
197a0 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 73 74   sizeof(ck_trust
197b0 65 64 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  ed);......CACKEY
197c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
197d0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
197e0 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
197f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
19800 43 4b 5f 54 52 55 53 54 20 2a 29 20 70 56 61 6c  CK_TRUST *) pVal
19810 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
19820 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
19830 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
19840 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
19850 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41 53 48  A_CERT_SHA1_HASH
19860 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  :.....CACKEY_DEB
19870 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65  UG_PRINTF("Reque
19880 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20  sting attribute 
19890 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f 48 41  CKA_CERT_SHA1_HA
198a0 53 48 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e  SH (0x%08lx) ...
198b0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
198c0 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70  g) curr_attr_typ
198d0 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a  e);......if (obj
198e0 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f  ectclass != CKO_
198f0 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20  NETSCAPE_TRUST) 
19900 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
19910 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
19920 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
19930 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
19940 72 65 20 6e 6f 74 20 61 20 4e 65 74 73 63 61 70  re not a Netscap
19950 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
19960 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
19970 09 09 09 7d 0a 0a 09 09 09 09 53 48 41 31 52 65  ...}......SHA1Re
19980 73 65 74 28 26 73 68 61 31 5f 63 74 78 29 3b 0a  set(&sha1_ctx);.
19990 09 09 09 09 53 48 41 31 49 6e 70 75 74 28 26 73  ....SHA1Input(&s
199a0 68 61 31 5f 63 74 78 2c 20 63 65 72 74 69 66 69  ha1_ctx, certifi
199b0 63 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74  cate, certificat
199c0 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 53 48 41 31  e_len);.....SHA1
199d0 52 65 73 75 6c 74 28 26 73 68 61 31 5f 63 74 78  Result(&sha1_ctx
199e0 2c 20 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09  , sha1_hash);...
199f0 09 09 09 70 56 61 6c 75 65 20 3d 20 73 68 61 31  ...pValue = sha1
19a00 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c  _hash;.....ulVal
19a10 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 73  ueLen = sizeof(s
19a20 68 61 31 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09  ha1_hash);......
19a30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19a40 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
19a50 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
19a60 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
19a70 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
19a80 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
19a90 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 4d  .case CKA_CERT_M
19aa0 44 35 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43  D5_HASH:.....CAC
19ab0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19ac0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
19ad0 72 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f  ribute CKA_CERT_
19ae0 4d 44 35 5f 48 41 53 48 20 28 30 78 25 30 38 6c  MD5_HASH (0x%08l
19af0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
19b00 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
19b10 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
19b20 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
19b30 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
19b40 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
19b50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
19b60 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
19b70 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
19b80 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
19b90 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
19ba0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
19bb0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
19bc0 4d 44 35 49 6e 69 74 28 26 6d 64 35 5f 63 74 78  MD5Init(&md5_ctx
19bd0 29 3b 0a 09 09 09 09 4d 44 35 55 70 64 61 74 65  );.....MD5Update
19be0 28 26 6d 64 35 5f 63 74 78 2c 20 63 65 72 74 69  (&md5_ctx, certi
19bf0 66 69 63 61 74 65 2c 20 63 65 72 74 69 66 69 63  ficate, certific
19c00 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09 4d 44  ate_len);.....MD
19c10 35 46 69 6e 61 6c 28 6d 64 35 5f 68 61 73 68 2c  5Final(md5_hash,
19c20 20 26 6d 64 35 5f 63 74 78 29 3b 0a 0a 09 09 09   &md5_ctx);.....
19c30 09 70 56 61 6c 75 65 20 3d 20 6d 64 35 5f 68 61  .pValue = md5_ha
19c40 73 68 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  sh;.....ulValueL
19c50 65 6e 20 3d 20 73 69 7a 65 6f 66 28 6d 64 35 5f  en = sizeof(md5_
19c60 68 61 73 68 29 3b 0a 0a 09 09 09 09 43 41 43 4b  hash);......CACK
19c70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
19c80 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
19c90 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
19ca0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
19cb0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
19cc0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 64 65 66  ...break;....def
19cd0 61 75 6c 74 3a 0a 09 09 09 09 70 56 61 6c 75 65  ault:.....pValue
19ce0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 75 6c 56   = NULL;.....ulV
19cf0 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
19d00 4e 47 29 20 2d 31 3b 0a 09 09 09 09 62 72 65 61  NG) -1;.....brea
19d10 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 28  k;...}....if (((
19d20 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56 61 6c 75 65  CK_LONG) ulValue
19d30 4c 65 6e 29 20 21 3d 20 28 28 43 4b 5f 4c 4f 4e  Len) != ((CK_LON
19d40 47 29 20 2d 31 29 29 20 7b 0a 09 09 09 2f 2a 20  G) -1)) {..../* 
19d50 50 75 73 68 20 63 75 72 72 5f 61 74 74 72 20 6f  Push curr_attr o
19d60 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20 2a 2f  nto the stack */
19d70 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 74 79  ....curr_attr.ty
19d80 70 65 20 3d 20 63 75 72 72 5f 61 74 74 72 5f 74  pe = curr_attr_t
19d90 79 70 65 3b 0a 09 09 09 63 75 72 72 5f 61 74 74  ype;....curr_att
19da0 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 75  r.ulValueLen = u
19db0 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 63  lValueLen;.....c
19dc0 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 20  urr_attr.pValue 
19dd0 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 61 74  = malloc(curr_at
19de0 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  tr.ulValueLen);.
19df0 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
19e00 74 74 72 2e 70 56 61 6c 75 65 2c 20 70 56 61 6c  ttr.pValue, pVal
19e10 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2e 75 6c  ue, curr_attr.ul
19e20 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 69  ValueLen);.....i
19e30 66 20 28 70 56 61 6c 75 65 5f 66 72 65 65 20 26  f (pValue_free &
19e40 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  & pValue) {.....
19e50 66 72 65 65 28 70 56 61 6c 75 65 29 3b 0a 09 09  free(pValue);...
19e60 09 7d 0a 0a 09 09 09 69 66 20 28 6e 75 6d 61 74  .}.....if (numat
19e70 74 72 73 20 3e 3d 20 72 65 74 76 61 6c 5f 63 6f  trs >= retval_co
19e80 75 6e 74 29 20 7b 0a 09 09 09 09 72 65 74 76 61  unt) {.....retva
19e90 6c 20 3d 20 72 65 61 6c 6c 6f 63 28 72 65 74 76  l = realloc(retv
19ea0 61 6c 2c 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74  al, retval_count
19eb0 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
19ec0 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d 65  l));....}.....me
19ed0 6d 63 70 79 28 26 72 65 74 76 61 6c 5b 6e 75 6d  mcpy(&retval[num
19ee0 61 74 74 72 73 5d 2c 20 26 63 75 72 72 5f 61 74  attrs], &curr_at
19ef0 74 72 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f  tr, sizeof(curr_
19f00 61 74 74 72 29 29 3b 0a 09 09 09 6e 75 6d 61 74  attr));....numat
19f10 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  trs++;...}..}...
19f20 69 66 20 28 6e 75 6d 61 74 74 72 73 20 21 3d 20  if (numattrs != 
19f30 30 29 20 7b 0a 09 09 72 65 74 76 61 6c 5f 63 6f  0) {...retval_co
19f40 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72 73 3b 0a  unt = numattrs;.
19f50 09 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c  ..retval = reall
19f60 6f 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61  oc(retval, retva
19f70 6c 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  l_count * sizeof
19f80 28 2a 72 65 74 76 61 6c 29 29 3b 0a 09 7d 20 65  (*retval));..} e
19f90 6c 73 65 20 7b 0a 09 09 66 72 65 65 28 72 65 74  lse {...free(ret
19fa0 76 61 6c 29 3b 0a 0a 09 09 72 65 74 76 61 6c 20  val);....retval 
19fb0 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 2a 70 75  = NULL;..}...*pu
19fc0 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74 72  lCount = numattr
19fd0 73 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  s;...CACKEY_DEBU
19fe0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
19ff0 69 6e 67 20 25 6c 75 20 6f 62 6a 65 63 74 73 20  ing %lu objects 
1a000 28 25 70 29 2e 22 2c 20 6e 75 6d 61 74 74 72 73  (%p).", numattrs
1a010 2c 20 28 76 6f 69 64 20 2a 29 20 72 65 74 76 61  , (void *) retva
1a020 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  l);...return(ret
1a030 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
1a040 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65  void cackey_free
1a050 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72 75  _identities(stru
1a060 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
1a070 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c 20  ty *identities, 
1a080 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
1a090 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
1a0a0 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  {..CK_ATTRIBUTE 
1a0b0 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 75 6e 73  *curr_attr;..uns
1a0c0 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 5f 69 64  igned long id_id
1a0d0 78 2c 20 61 74 74 72 5f 69 64 78 3b 0a 0a 09 69  x, attr_idx;...i
1a0e0 66 20 28 69 64 65 6e 74 69 74 69 65 73 20 3d 3d  f (identities ==
1a0f0 20 4e 55 4c 4c 20 7c 7c 20 69 64 65 6e 74 69 74   NULL || identit
1a100 69 65 73 5f 63 6f 75 6e 74 20 3d 3d 20 30 29 20  ies_count == 0) 
1a110 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d 0a 0a  {...return;..}..
1a120 09 66 6f 72 20 28 69 64 5f 69 64 78 20 3d 20 30  .for (id_idx = 0
1a130 3b 20 69 64 5f 69 64 78 20 3c 20 69 64 65 6e 74  ; id_idx < ident
1a140 69 74 69 65 73 5f 63 6f 75 6e 74 3b 20 69 64 5f  ities_count; id_
1a150 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69  idx++) {...if (i
1a160 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1a170 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a  ].attributes) {.
1a180 09 09 09 66 6f 72 20 28 61 74 74 72 5f 69 64 78  ...for (attr_idx
1a190 20 3d 20 30 3b 20 61 74 74 72 5f 69 64 78 20 3c   = 0; attr_idx <
1a1a0 20 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69   identities[id_i
1a1b0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63  dx].attributes_c
1a1c0 6f 75 6e 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b  ount; attr_idx++
1a1d0 29 20 7b 0a 09 09 09 09 63 75 72 72 5f 61 74 74  ) {.....curr_att
1a1e0 72 20 3d 20 26 69 64 65 6e 74 69 74 69 65 73 5b  r = &identities[
1a1f0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1a200 65 73 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  es[attr_idx];...
1a210 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
1a220 2d 3e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09  ->pValue) {.....
1a230 09 66 72 65 65 28 63 75 72 72 5f 61 74 74 72 2d  .free(curr_attr-
1a240 3e 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 7d 0a  >pValue);.....}.
1a250 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 69 64 65  ...}.....if (ide
1a260 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1a270 61 74 74 72 69 62 75 74 65 73 29 20 7b 0a 09 09  attributes) {...
1a280 09 09 66 72 65 65 28 69 64 65 6e 74 69 74 69 65  ..free(identitie
1a290 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a2a0 75 74 65 73 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  utes);....}.....
1a2b0 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
1a2c0 73 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  s(identities[id_
1a2d0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1a2e0 74 79 2c 20 31 2c 20 31 29 3b 0a 09 09 7d 0a 09  ty, 1, 1);...}..
1a2f0 7d 0a 0a 09 66 72 65 65 28 69 64 65 6e 74 69 74  }...free(identit
1a300 69 65 73 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ies);.}..static 
1a310 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61  unsigned long ca
1a320 63 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64  ckey_read_dod_id
1a330 65 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20  entities(struct 
1a340 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
1a350 2a 69 64 65 6e 74 69 74 69 65 73 2c 20 75 6e 73  *identities, uns
1a360 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 64  igned long num_d
1a370 6f 64 5f 63 65 72 74 73 29 20 7b 0a 09 75 6e 73  od_certs) {..uns
1a380 69 67 6e 65 64 20 6c 6f 6e 67 20 63 65 72 74 5f  igned long cert_
1a390 69 64 78 2c 20 69 64 5f 69 64 78 20 3d 20 30 3b  idx, id_idx = 0;
1a3a0 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
1a3b0 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72  s == NULL) {...r
1a3c0 65 74 75 72 6e 28 6e 75 6d 5f 64 6f 64 5f 63 65  eturn(num_dod_ce
1a3d0 72 74 73 20 2a 20 33 29 3b 0a 09 7d 0a 0a 09 66  rts * 3);..}...f
1a3e0 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30  or (cert_idx = 0
1a3f0 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d  ; cert_idx < num
1a400 5f 64 6f 64 5f 63 65 72 74 73 3b 20 63 65 72 74  _dod_certs; cert
1a410 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69 64 65 6e  _idx++) {...iden
1a420 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1a430 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 4e  csc_identity = N
1a440 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69 74 69 65  ULL;...identitie
1a450 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
1a460 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65  utes = cackey_ge
1a470 74 5f 61 74 74 72 69 62 75 74 65 73 28 43 4b 4f  t_attributes(CKO
1a480 5f 43 45 52 54 49 46 49 43 41 54 45 2c 20 26 65  _CERTIFICATE, &e
1a490 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f  xtra_certs[cert_
1a4a0 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63  idx], 0xf000 | c
1a4b0 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69  ert_idx, &identi
1a4c0 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1a4d0 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a  ributes_count);.
1a4e0 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09 09 69  ..id_idx++;....i
1a4f0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1a500 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
1a510 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74 69  = NULL;...identi
1a520 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74  ties[id_idx].att
1a530 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79  ributes = cackey
1a540 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28  _get_attributes(
1a550 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 2c 20  CKO_PUBLIC_KEY, 
1a560 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63 65 72  &extra_certs[cer
1a570 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30 20 7c  t_idx], 0xf000 |
1a580 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64 65 6e   cert_idx, &iden
1a590 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1a5a0 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 29  ttributes_count)
1a5b0 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 0a 09  ;...id_idx++;...
1a5c0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1a5d0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1a5e0 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e  y = NULL;...iden
1a5f0 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61  tities[id_idx].a
1a600 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b  ttributes = cack
1a610 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65  ey_get_attribute
1a620 73 28 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  s(CKO_NETSCAPE_T
1a630 52 55 53 54 2c 20 26 65 78 74 72 61 5f 63 65 72  RUST, &extra_cer
1a640 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
1a650 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
1a660 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
1a670 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
1a680 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78  count);...id_idx
1a690 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ++;..}...return(
1a6a0 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74  id_idx);.}..stat
1a6b0 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
1a6c0 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  _identity *cacke
1a6d0 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69 65  y_read_identitie
1a6e0 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
1a6f0 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
1a700 67 6e 65 64 20 6c 6f 6e 67 20 2a 69 64 73 5f 66  gned long *ids_f
1a710 6f 75 6e 64 29 20 7b 0a 09 73 74 72 75 63 74 20  ound) {..struct 
1a720 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
1a730 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
1a740 69 74 69 65 73 3b 0a 09 73 74 72 75 63 74 20 63  ities;..struct c
1a750 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a  ackey_identity *
1a760 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73  identities;..uns
1a770 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 69  igned long num_i
1a780 64 73 2c 20 69 64 5f 69 64 78 2c 20 63 75 72 72  ds, id_idx, curr
1a790 5f 69 64 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67  _id_type;..unsig
1a7a0 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
1a7b0 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  ts, num_dod_cert
1a7c0 73 2c 20 63 65 72 74 5f 69 64 78 3b 0a 09 69 6e  s, cert_idx;..in
1a7d0 74 20 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  t include_extra_
1a7e0 63 65 72 74 73 20 3d 20 30 3b 0a 0a 09 43 41 43  certs = 0;...CAC
1a7f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a800 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1a810 66 20 28 69 64 73 5f 66 6f 75 6e 64 20 3d 3d 20  f (ids_found == 
1a820 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1a830 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1a840 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f 75 6e 64  rror.  ids_found
1a850 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72   is NULL");....r
1a860 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
1a870 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 43  .#ifdef CACKEY_C
1a880 41 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c 55 44 45  ARD_SLOT_INCLUDE
1a890 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69 6e  _EXTRA_CERTS..in
1a8a0 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
1a8b0 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 09  s = 1;.#endif...
1a8c0 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b  if (getenv("CACK
1a8d0 45 59 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f  EY_DOD_CERTS_ON_
1a8e0 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55  HW_SLOTS") != NU
1a8f0 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f  LL) {...include_
1a900 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 31 3b  extra_certs = 1;
1a910 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  ..}...if (getenv
1a920 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 44 4f 44 5f  ("CACKEY_NO_DOD_
1a930 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54  CERTS_ON_HW_SLOT
1a940 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  S") != NULL) {..
1a950 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  .include_extra_c
1a960 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  erts = 0;..}...i
1a970 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1a980 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53  Y_NO_EXTRA_CERTS
1a990 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ") != NULL) {...
1a9a0 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20  num_dod_certs = 
1a9b0 30 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e  0;..} else {...n
1a9c0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 73  um_dod_certs = s
1a9d0 69 7a 65 6f 66 28 65 78 74 72 61 5f 63 65 72 74  izeof(extra_cert
1a9e0 73 29 20 2f 20 73 69 7a 65 6f 66 28 65 78 74 72  s) / sizeof(extr
1a9f0 61 5f 63 65 72 74 73 5b 30 5d 29 3b 0a 09 7d 0a  a_certs[0]);..}.
1aa00 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74 65  ..if (slot->inte
1aa10 72 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d 5f 69 64  rnal) {...num_id
1aa20 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
1aa30 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 4e  dod_identities(N
1aa40 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72  ULL, num_dod_cer
1aa50 74 73 29 3b 0a 0a 09 09 69 66 20 28 6e 75 6d 5f  ts);....if (num_
1aa60 69 64 73 20 21 3d 20 30 29 20 7b 0a 09 09 09 69  ids != 0) {....i
1aa70 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c  dentities = mall
1aa80 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a  oc(num_ids * siz
1aa90 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29  eof(*identities)
1aaa0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65  );.....cackey_re
1aab0 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
1aac0 73 28 69 64 65 6e 74 69 74 69 65 73 2c 20 6e 75  s(identities, nu
1aad0 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09  m_dod_certs);...
1aae0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69 64 65 6e  } else {....iden
1aaf0 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09  tities = NULL;..
1ab00 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64  .}....*ids_found
1ab10 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72   = num_ids;....r
1ab20 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73  eturn(identities
1ab30 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 69 64 65  );..}...pcsc_ide
1ab40 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79  ntities = cackey
1ab50 5f 72 65 61 64 5f 63 65 72 74 73 28 73 6c 6f 74  _read_certs(slot
1ab60 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72  , NULL, &num_cer
1ab70 74 73 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 69  ts);..if (pcsc_i
1ab80 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c  dentities != NUL
1ab90 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e 76 65 72  L) {.../* Conver
1aba0 74 20 6e 75 6d 62 65 72 20 6f 66 20 43 65 72 74  t number of Cert
1abb0 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f 66 20 6f  s to number of o
1abc0 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e 75 6d 5f  bjects */...num_
1abd0 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52 49 56 41  ids = (CKO_PRIVA
1abe0 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f 43 45 52  TE_KEY - CKO_CER
1abf0 54 49 46 49 43 41 54 45 20 2b 20 31 29 20 2a 20  TIFICATE + 1) * 
1ac00 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09 09 69 66  num_certs;....if
1ac10 20 28 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f   (include_extra_
1ac20 63 65 72 74 73 29 20 7b 0a 09 09 09 6e 75 6d 5f  certs) {....num_
1ac30 69 64 73 20 2b 3d 20 63 61 63 6b 65 79 5f 72 65  ids += cackey_re
1ac40 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
1ac50 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f  s(NULL, num_dod_
1ac60 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 69  certs);...}....i
1ac70 64 65 6e 74 69 74 69 65 73 20 3d 20 6d 61 6c 6c  dentities = mall
1ac80 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20 73 69 7a  oc(num_ids * siz
1ac90 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 29  eof(*identities)
1aca0 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20 63 65 72  );..../* Add cer
1acb0 74 69 66 69 63 61 74 65 73 2c 20 70 75 62 6c 69  tificates, publi
1acc0 63 20 6b 65 79 73 2c 20 61 6e 64 20 70 72 69 76  c keys, and priv
1acd0 61 74 65 20 6b 65 79 73 20 66 72 6f 6d 20 74 68  ate keys from th
1ace0 65 20 73 6d 61 72 74 63 61 72 64 20 2a 2f 0a 09  e smartcard */..
1acf0 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 09 66  .id_idx = 0;...f
1ad00 6f 72 20 28 63 65 72 74 5f 69 64 78 20 3d 20 30  or (cert_idx = 0
1ad10 3b 20 63 65 72 74 5f 69 64 78 20 3c 20 6e 75 6d  ; cert_idx < num
1ad20 5f 63 65 72 74 73 3b 20 63 65 72 74 5f 69 64 78  _certs; cert_idx
1ad30 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20 28 63 75  ++) {....for (cu
1ad40 72 72 5f 69 64 5f 74 79 70 65 20 3d 20 43 4b 4f  rr_id_type = CKO
1ad50 5f 43 45 52 54 49 46 49 43 41 54 45 3b 20 63 75  _CERTIFICATE; cu
1ad60 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d 20 43 4b  rr_id_type <= CK
1ad70 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 3b 20 63  O_PRIVATE_KEY; c
1ad80 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b 29 20 7b  urr_id_type++) {
1ad90 0a 09 09 09 09 69 64 65 6e 74 69 74 69 65 73 5b  .....identities[
1ada0 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
1adb0 65 73 20 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f  es = cackey_get_
1adc0 61 74 74 72 69 62 75 74 65 73 28 63 75 72 72 5f  attributes(curr_
1add0 69 64 5f 74 79 70 65 2c 20 26 70 63 73 63 5f 69  id_type, &pcsc_i
1ade0 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69  dentities[cert_i
1adf0 64 78 5d 2c 20 63 65 72 74 5f 69 64 78 2c 20 26  dx], cert_idx, &
1ae00 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1ae10 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
1ae20 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74  unt);......ident
1ae30 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1ae40 73 63 5f 69 64 65 6e 74 69 74 79 20 3d 20 6d 61  sc_identity = ma
1ae50 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 69 64 65  lloc(sizeof(*ide
1ae60 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
1ae70 70 63 73 63 5f 69 64 65 6e 74 69 74 79 29 29 3b  pcsc_identity));
1ae80 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e  .....memcpy(iden
1ae90 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1aea0 63 73 63 5f 69 64 65 6e 74 69 74 79 2c 20 26 70  csc_identity, &p
1aeb0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
1aec0 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a 65 6f 66  ert_idx], sizeof
1aed0 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  (*identities[id_
1aee0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1aef0 74 79 29 29 3b 0a 0a 09 09 09 09 69 64 65 6e 74  ty));......ident
1af00 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63  ities[id_idx].pc
1af10 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72  sc_identity->cer
1af20 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
1af30 63 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  c(pcsc_identitie
1af40 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
1af50 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
1af60 09 09 6d 65 6d 63 70 79 28 69 64 65 6e 74 69 74  ..memcpy(identit
1af70 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63  ies[id_idx].pcsc
1af80 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69  _identity->certi
1af90 66 69 63 61 74 65 2c 20 70 63 73 63 5f 69 64 65  ficate, pcsc_ide
1afa0 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1afb0 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70  ].certificate, p
1afc0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63  csc_identities[c
1afd0 65 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69  ert_idx].certifi
1afe0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
1aff0 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09 7d 0a 09  id_idx++;....}..
1b000 09 7d 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64  .}....if (includ
1b010 65 5f 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b  e_extra_certs) {
1b020 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b030 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c 75 64 69  _PRINTF("Includi
1b040 6e 67 20 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74  ng US Government
1b050 20 43 65 72 74 69 66 69 63 61 74 65 73 20 6f 6e   Certificates on
1b060 20 68 61 72 64 77 61 72 65 20 73 6c 6f 74 22 29   hardware slot")
1b070 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 72 65 61  ;.....cackey_rea
1b080 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73  d_dod_identities
1b090 28 69 64 65 6e 74 69 74 69 65 73 20 2b 20 69 64  (identities + id
1b0a0 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65  _idx, num_dod_ce
1b0b0 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  rts);...}....cac
1b0c0 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 70  key_free_certs(p
1b0d0 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c 20  csc_identities, 
1b0e0 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a 0a  num_certs, 1);..
1b0f0 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20 3d 20 6e  ..*ids_found = n
1b100 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65 74 75 72  um_ids;....retur
1b110 6e 28 69 64 65 6e 74 69 74 69 65 73 29 3b 0a 09  n(identities);..
1b120 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f 75 6e 64 20  }....*ids_found 
1b130 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  = 0;..return(NUL
1b140 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  L);.}..CK_DEFINE
1b150 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
1b160 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 29 28 43   C_Initialize)(C
1b170 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49 6e 69 74  K_VOID_PTR pInit
1b180 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43 5f 49 4e  Args) {..CK_C_IN
1b190 49 54 49 41 4c 49 5a 45 5f 41 52 47 53 20 43 4b  ITIALIZE_ARGS CK
1b1a0 5f 50 54 52 20 61 72 67 73 3b 0a 09 75 69 6e 74  _PTR args;..uint
1b1b0 33 32 5f 74 20 69 64 78 2c 20 68 69 67 68 65 73  32_t idx, highes
1b1c0 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20 6d 75 74  t_slot;..int mut
1b1d0 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a 0a 09 43  ex_init_ret;...C
1b1e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b1f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1b200 09 69 66 20 28 63 61 63 6b 65 79 5f 69 6e 69 74  .if (cackey_init
1b210 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1b220 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b230 28 22 45 72 72 6f 72 2e 20 20 41 6c 72 65 61 64  ("Error.  Alread
1b240 79 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  y initialized.")
1b250 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1b260 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45 41 44 59  CRYPTOKI_ALREADY
1b270 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b280 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74 41 72 67  }...if (pInitArg
1b290 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 61  s != NULL) {...a
1b2a0 72 67 73 20 3d 20 70 49 6e 69 74 41 72 67 73 3b  rgs = pInitArgs;
1b2b0 0a 09 09 6d 65 6d 63 70 79 28 26 63 61 63 6b 65  ...memcpy(&cacke
1b2c0 79 5f 61 72 67 73 2c 20 61 72 67 73 2c 20 73 69  y_args, args, si
1b2d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61 72 67 73  zeof(cackey_args
1b2e0 29 29 3b 0a 0a 09 09 69 66 20 28 61 72 67 73 2d  ));....if (args-
1b2f0 3e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 3d 20  >CreateMutex == 
1b300 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65  NULL || args->De
1b310 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d 20 4e 55  stroyMutex == NU
1b320 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b  LL || args->Lock
1b330 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  Mutex == NULL ||
1b340 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74   args->UnlockMut
1b350 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ex == NULL) {...
1b360 09 69 66 20 28 61 72 67 73 2d 3e 43 72 65 61 74  .if (args->Creat
1b370 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c  eMutex != NULL |
1b380 7c 20 61 72 67 73 2d 3e 44 65 73 74 72 6f 79 4d  | args->DestroyM
1b390 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  utex != NULL || 
1b3a0 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20  args->LockMutex 
1b3b0 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  != NULL || args-
1b3c0 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 21 3d 20  >UnlockMutex != 
1b3d0 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b  NULL) {.....CACK
1b3e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1b3f0 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c 20 62 75  "Error. Some, bu
1b400 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72 65 61 64  t not All thread
1b410 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20 70  ing primitives p
1b420 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a 09 09 09  rovided.");.....
1b430 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1b440 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 09 7d  MENTS_BAD);....}
1b450 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
1b460 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 43 72 65  .cackey_args.Cre
1b470 61 74 65 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ateMutex = NULL;
1b480 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e 44  ...cackey_args.D
1b490 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 20 4e 55  estroyMutex = NU
1b4a0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1b4b0 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d 20 4e 55  s.LockMutex = NU
1b4c0 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1b4d0 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20 3d 20  s.UnlockMutex = 
1b4e0 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61  NULL;...cackey_a
1b4f0 72 67 73 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 09  rgs.flags = 0;..
1b500 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
1b510 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
1b520 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
1b530 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1b540 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20  _sessions[0])); 
1b550 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65  idx++) {...cacke
1b560 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1b570 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a  active = 0;..}..
1b580 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
1b590 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63  dx < (sizeof(cac
1b5a0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1b5b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1b5c0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
1b5d0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1b5e0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
1b5f0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1b600 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  dx].pcsc_reader 
1b610 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1b620 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
1b630 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
1b640 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1b650 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
1b660 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
1b670 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 0;...cackey_sl
1b680 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65  ots[idx].slot_re
1b690 73 65 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  set = 0;...cacke
1b6a0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 6f 6b  y_slots[idx].tok
1b6b0 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 09  en_flags = 0;...
1b6c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1b6d0 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
1b6e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1b6f0 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20 30  dx].internal = 0
1b700 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e  ;..}...if (geten
1b710 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54  v("CACKEY_NO_EXT
1b720 52 41 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55  RA_CERTS") != NU
1b730 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1b740 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b  EBUG_PRINTF("Ask
1b750 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63 6c 75 64  ed not to includ
1b760 65 20 44 6f 44 20 63 65 72 74 69 66 69 63 61 74  e DoD certificat
1b770 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  es");..} else {.
1b780 09 09 68 69 67 68 65 73 74 5f 73 6c 6f 74 20 3d  ..highest_slot =
1b790 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1b7a0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1b7b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1b7c0 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43 4b 45 59  ) - 1;....CACKEY
1b7d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
1b7e0 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20 63 65 72  ncluding DoD cer
1b7f0 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c 75 22 2c  ts in slot %lu",
1b800 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1b810 20 68 69 67 68 65 73 74 5f 73 6c 6f 74 29 3b 0a   highest_slot);.
1b820 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1b830 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 61 63  highest_slot].ac
1b840 74 69 76 65 20 3d 20 31 3b 0a 09 09 63 61 63 6b  tive = 1;...cack
1b850 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1b860 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20  _slot].internal 
1b870 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  = 1;...cackey_sl
1b880 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
1b890 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e 73 69 67  ].label = (unsig
1b8a0 6e 65 64 20 63 68 61 72 20 2a 29 20 22 55 53 20  ned char *) "US 
1b8b0 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65 72 74 69  Government Certi
1b8c0 66 69 63 61 74 65 73 22 3b 0a 09 09 63 61 63 6b  ficates";...cack
1b8d0 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74  ey_slots[highest
1b8e0 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  _slot].pcsc_read
1b8f0 65 72 20 3d 20 22 43 41 43 4b 65 79 22 3b 0a 09  er = "CACKey";..
1b900 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69  .cackey_slots[hi
1b910 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74 6f 6b 65  ghest_slot].toke
1b920 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a 09 7d 0a  n_flags = 0;..}.
1b930 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  ..cackey_initial
1b940 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69 66 20 28  ized = 1;...if (
1b950 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f  !cackey_biglock_
1b960 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74 65 78 5f  init) {...mutex_
1b970 69 6e 69 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  init_ret = cacke
1b980 79 5f 6d 75 74 65 78 5f 63 72 65 61 74 65 28 26  y_mutex_create(&
1b990 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1b9a0 0a 0a 09 09 69 66 20 28 6d 75 74 65 78 5f 69 6e  ....if (mutex_in
1b9b0 69 74 5f 72 65 74 20 21 3d 20 30 29 20 7b 0a 09  it_ret != 0) {..
1b9c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b9d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d  RINTF("Error.  M
1b9e0 75 74 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  utex initializat
1b9f0 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ion failed.");..
1ba00 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 41  ...return(CKR_CA
1ba10 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d 0a 0a 09  NT_LOCK);...}...
1ba20 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 5f  .cackey_biglock_
1ba30 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43  init = 1;..}...C
1ba40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ba50 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1ba60 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1ba70 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1ba80 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
1ba90 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1baa0 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a 65 29 28  RV, C_Finalize)(
1bab0 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 52 65 73  CK_VOID_PTR pRes
1bac0 65 72 76 65 64 29 20 7b 0a 09 75 69 6e 74 33 32  erved) {..uint32
1bad0 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  _t idx;...CACKEY
1bae0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1baf0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1bb00 70 52 65 73 65 72 76 65 64 20 21 3d 20 4e 55 4c  pReserved != NUL
1bb10 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1bb20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1bb30 72 2e 20 70 52 65 73 65 72 76 65 64 20 69 73 20  r. pReserved is 
1bb40 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
1bb50 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1bb60 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1bb70 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1bb80 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1bb90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bba0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1bbb0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1bbc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1bbd0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1bbe0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20  IZED);..}...for 
1bbf0 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1bc00 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1bc10 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
1bc20 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
1bc30 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b  s[0])); idx++) {
1bc40 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
1bc50 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69  ssions[idx].acti
1bc60 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c 6f 73 65  ve) {....C_Close
1bc70 53 65 73 73 69 6f 6e 28 69 64 78 29 3b 0a 09 09  Session(idx);...
1bc80 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c  }..}...cackey_sl
1bc90 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
1bca0 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  ll();...for (idx
1bcb0 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
1bcc0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1bcd0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1bce0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
1bcf0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
1bd00 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
1bd10 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 63 6f  nternal) {....co
1bd20 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69  ntinue;...}....i
1bd30 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1bd40 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  idx].pcsc_reader
1bd50 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
1bd60 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
1bd70 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 7d 0a  sc_reader);...}.
1bd80 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1bd90 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f  ots[idx].cached_
1bda0 63 65 72 74 73 29 20 7b 0a 09 09 09 63 61 63 6b  certs) {....cack
1bdb0 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 63 61  ey_free_certs(ca
1bdc0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1bdd0 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 63 61  cached_certs, ca
1bde0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1bdf0 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75  cached_certs_cou
1be00 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63 61 63 6b  nt, 1);.....cack
1be10 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61  ey_slots[idx].ca
1be20 63 68 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c  ched_certs = NUL
1be30 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b  L;...}..}...cack
1be40 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
1be50 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 69  ct();...cackey_i
1be60 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
1be70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1be80 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1be90 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1bea0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1beb0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1bec0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1bed0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49 6e 66 6f  CK_RV, C_GetInfo
1bee0 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52 20 70 49  )(CK_INFO_PTR pI
1bef0 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43  nfo) {..static C
1bf00 4b 5f 55 54 46 38 43 48 41 52 20 6d 61 6e 75 66  K_UTF8CHAR manuf
1bf10 61 63 74 75 72 65 72 49 44 5b 5d 20 3d 20 22 55  acturerID[] = "U
1bf20 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e 74 22 3b  .S. Government";
1bf30 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38  ..static CK_UTF8
1bf40 43 48 41 52 20 6c 69 62 72 61 72 79 44 65 73 63  CHAR libraryDesc
1bf50 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43  ription[] = "CAC
1bf60 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  Key";...CACKEY_D
1bf70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1bf80 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49  led.");...if (pI
1bf90 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  nfo == NULL) {..
1bfa0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1bfb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e  INTF("Error. pIn
1bfc0 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  fo is NULL.");..
1bfd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
1bfe0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
1bff0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1c000 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1c010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c020 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1c030 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1c040 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1c050 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1c060 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 70 49  ALIZED);..}...pI
1c070 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72  nfo->cryptokiVer
1c080 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 28 43  sion.major = ((C
1c090 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
1c0a0 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20  ERSION_CODE) >> 
1c0b0 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e  16) & 0xff;..pIn
1c0c0 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56 65 72 73  fo->cryptokiVers
1c0d0 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28 43 41  ion.minor = ((CA
1c0e0 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56 45  CKEY_CRYPTOKI_VE
1c0f0 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e 20 38  RSION_CODE) >> 8
1c100 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d 65 6d 73  ) & 0xff;...mems
1c110 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  et(pInfo->manufa
1c120 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73  cturerID, ' ', s
1c130 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e  izeof(pInfo->man
1c140 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09  ufacturerID));..
1c150 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
1c160 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61  nufacturerID, ma
1c170 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69  nufacturerID, si
1c180 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65  zeof(manufacture
1c190 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e  rID) - 1);...pIn
1c1a0 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30 78 30 30  fo->flags = 0x00
1c1b0 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f  ;...memset(pInfo
1c1c0 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1c1d0 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f  tion, ' ', sizeo
1c1e0 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  f(pInfo->library
1c1f0 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09  Description));..
1c200 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 69  memcpy(pInfo->li
1c210 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e  braryDescription
1c220 2c 20 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  , libraryDescrip
1c230 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28 6c 69 62  tion, sizeof(lib
1c240 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29  raryDescription)
1c250 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e   - 1);...pInfo->
1c260 6c 69 62 72 61 72 79 56 65 72 73 69 6f 6e 2e 6d  libraryVersion.m
1c270 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  ajor = (cackey_g
1c280 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31  etversion() >> 1
1c290 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
1c2a0 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f  o->libraryVersio
1c2b0 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65  n.minor = (cacke
1c2c0 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1c2d0 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 43  > 8) & 0xff;...C
1c2e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c2f0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
1c300 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
1c310 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
1c320 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  R_OK);.}../*. * 
1c330 50 72 6f 63 65 73 73 20 6c 69 73 74 20 6f 66 20  Process list of 
1c340 72 65 61 64 65 72 73 2c 20 61 6e 64 20 63 72 65  readers, and cre
1c350 61 74 65 20 6d 61 70 70 69 6e 67 20 62 65 74 77  ate mapping betw
1c360 65 65 6e 20 72 65 61 64 65 72 20 6e 61 6d 65 20  een reader name 
1c370 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20 2a 2f 0a  and slot ID. */.
1c380 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1c390 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53  ON(CK_RV, C_GetS
1c3a0 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42 42 4f 4f  lotList)(CK_BBOO
1c3b0 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 2c 20  L tokenPresent, 
1c3c0 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70  CK_SLOT_ID_PTR p
1c3d0 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f  SlotList, CK_ULO
1c3e0 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
1c3f0 20 7b 0a 09 73 74 61 74 69 63 20 69 6e 74 20 66   {..static int f
1c400 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31 3b 0a 09  irst_call = 1;..
1c410 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
1c420 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63 6f 6e 6e  ;..int pcsc_conn
1c430 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f 55 4c 4f  ect_ret;..CK_ULO
1c440 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  NG count, slot_c
1c450 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72 72 73 6c  ount = 0, currsl
1c460 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b 0a 09 63  ot, slot_idx;..c
1c470 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64 65 72  har *pcsc_reader
1c480 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72 73  s, *pcsc_readers
1c490 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61 64 65 72  _s, *pcsc_reader
1c4a0 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70 63 73 63  s_e;..DWORD pcsc
1c4b0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 09 4c  _readers_len;..L
1c4c0 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73 74 72 65  ONG scard_listre
1c4d0 61 64 65 72 73 5f 72 65 74 3b 0a 09 73 69 7a 65  aders_ret;..size
1c4e0 5f 74 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c  _t curr_reader_l
1c4f0 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65  en;..int slot_re
1c500 73 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  set;...CACKEY_DE
1c510 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1c520 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 75 6c  ed.");...if (pul
1c530 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
1c540 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c550 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1c560 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e  ulCount is NULL.
1c570 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c580 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1c590 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1c5a0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1c5b0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c5c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c5d0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1c5e0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1c5f0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1c600 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1c610 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1c620 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1c630 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1c640 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1c650 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1c660 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c670 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1c680 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1c690 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1c6a0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1c6b0 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20 6c 69 73  }.../* Clear lis
1c6c0 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f 0a 09 73  t of slots */..s
1c6d0 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
1c6e0 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 29 20 7b  if (pSlotList) {
1c6f0 0a 09 09 69 66 20 28 66 69 72 73 74 5f 63 61 6c  ...if (first_cal
1c700 6c 29 20 7b 0a 09 09 09 66 69 72 73 74 5f 63 61  l) {....first_ca
1c710 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73 6c 6f 74  ll = 0;.....slot
1c720 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 09 7d 0a  _reset = 1;...}.
1c730 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20  .../* If any of 
1c740 74 68 65 20 73 6c 6f 74 73 20 68 61 76 65 20 62  the slots have b
1c750 65 65 6e 20 72 65 73 65 74 20 74 68 65 6e 20 70  een reset then p
1c760 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  urge all informa
1c770 74 69 6f 6e 20 61 6e 64 20 63 68 65 63 6b 20 61  tion and check a
1c780 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72 20 28 63  gain */...for (c
1c790 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72  urrslot = 0; cur
1c7a0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
1c7b0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1c7c0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1c7d0 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c  ots[0])); currsl
1c7e0 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 63  ot++) {....if (c
1c7f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1c800 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  slot].internal) 
1c810 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
1c820 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
1c830 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1c840 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
1c850 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
1c860 7d 0a 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79  }.....if (cackey
1c870 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c880 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09  .slot_reset) {..
1c890 09 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  ...slot_reset = 
1c8a0 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  1;......break;..
1c8b0 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73  ..}...}....if (s
1c8c0 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09  lot_reset) {....
1c8d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1c8e0 4e 54 46 28 22 50 75 72 67 69 6e 67 20 61 6c 6c  NTF("Purging all
1c8f0 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
1c900 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20 4f 6e 6c  n.");...../* Onl
1c910 79 20 75 70 64 61 74 65 20 74 68 65 20 6c 69 73  y update the lis
1c920 74 20 6f 66 20 73 6c 6f 74 73 20 69 66 20 77 65  t of slots if we
1c930 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20 62 65   are actually be
1c940 69 6e 67 20 73 75 70 70 6c 79 20 74 68 65 20 73  ing supply the s
1c950 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lot information 
1c960 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  */....cackey_slo
1c970 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
1c980 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20 28 63 75  l();.....for (cu
1c990 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72  rrslot = 0; curr
1c9a0 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1c9b0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1c9c0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1c9d0 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1c9e0 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63  t++) {.....if (c
1c9f0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1ca00 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 29 20  slot].internal) 
1ca10 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b  {......continue;
1ca20 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
1ca30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1ca40 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
1ca50 65 72 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28  er) {......free(
1ca60 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1ca70 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
1ca80 65 72 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65  er);.......cacke
1ca90 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1caa0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20  ].pcsc_reader = 
1cab0 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  NULL;.....}.....
1cac0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1cad0 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1cae0 6c 29 20 7b 0a 09 09 09 09 09 66 72 65 65 28 63  l) {......free(c
1caf0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1cb00 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b 0a 0a 09  slot].label);...
1cb10 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1cb20 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c  [currslot].label
1cb30 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a   = NULL;.....}..
1cb40 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1cb50 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
1cb60 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d 20  e = 0;....}...} 
1cb70 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09 7d 0a 09  else {.......}..
1cb80 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
1cb90 20 6c 69 73 74 20 6f 66 20 72 65 61 64 65 72 73   list of readers
1cba0 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63   */..pcsc_connec
1cbb0 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70  t_ret = cackey_p
1cbc0 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a 09  csc_connect();..
1cbd0 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
1cbe0 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
1cbf0 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41  CSC_S_OK) {...CA
1cc00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1cc10 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  F("Connection to
1cc20 20 50 43 2f 53 43 20 66 61 69 6c 65 64 2c 20 61   PC/SC failed, a
1cc30 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c 6f 74 73  ssuming no slots
1cc40 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63 6f 75 6e  ");....slot_coun
1cc50 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  t = 0;..} else {
1cc60 0a 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f  ...pcsc_readers_
1cc70 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73 63 61 72  len = 0;....scar
1cc80 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1cc90 74 20 3d 20 53 43 61 72 64 4c 69 73 74 52 65 61  t = SCardListRea
1cca0 64 65 72 73 28 2a 63 61 63 6b 65 79 5f 70 63 73  ders(*cackey_pcs
1ccb0 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c 4c 2c 20  c_handle, NULL, 
1ccc0 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72 65 61 64  NULL, &pcsc_read
1ccd0 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09 69 66 20  ers_len);....if 
1cce0 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
1ccf0 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  rs_ret == SCARD_
1cd00 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29 20 7b 0a  F_COMM_ERROR) {.
1cd10 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cd20 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53  PRINTF("Error. S
1cd30 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 28  CardListReaders(
1cd40 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
1cd50 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 2c 20 61  _F_COMM_ERROR, a
1cd60 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65 63 74 69  ssuming Connecti
1cd70 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77 65 6e 74  on to PC/SC went
1cd80 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e 65 63 74   away. Reconnect
1cd90 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b  ing.");.....cack
1cda0 65 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65  ey_pcsc_disconne
1cdb0 63 74 28 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  ct();....cackey_
1cdc0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29 3b 0a  pcsc_connect();.
1cdd0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1cde0 5f 50 52 49 4e 54 46 28 22 54 72 79 69 6e 67 20  _PRINTF("Trying 
1cdf0 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1ce00 28 29 20 61 67 61 69 6e 22 29 3b 0a 09 09 09 73  () again");....s
1ce10 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1ce20 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
1ce30 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
1ce40 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
1ce50 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72  L, NULL, &pcsc_r
1ce60 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 7d  eaders_len);...}
1ce70 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69  ....if (scard_li
1ce80 73 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d  streaders_ret ==
1ce90 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53   SCARD_S_SUCCESS
1cea0 20 26 26 20 70 63 73 63 5f 72 65 61 64 65 72 73   && pcsc_readers
1ceb0 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a 09 09 09  _len != 0) {....
1cec0 70 63 73 63 5f 72 65 61 64 65 72 73 20 3d 20 6d  pcsc_readers = m
1ced0 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65 61 64 65  alloc(pcsc_reade
1cee0 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70 63 73 63  rs_len);....pcsc
1cef0 5f 72 65 61 64 65 72 73 5f 73 20 3d 20 70 63 73  _readers_s = pcs
1cf00 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09 09 09 73  c_readers;.....s
1cf10 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1cf20 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
1cf30 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
1cf40 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
1cf50 4c 2c 20 70 63 73 63 5f 72 65 61 64 65 72 73 2c  L, pcsc_readers,
1cf60 20 26 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c   &pcsc_readers_l
1cf70 65 6e 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72  en);....if (scar
1cf80 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1cf90 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
1cfa0 43 45 53 53 29 20 7b 0a 09 09 09 09 70 63 73 63  CESS) {.....pcsc
1cfb0 5f 72 65 61 64 65 72 73 5f 65 20 3d 20 70 63 73  _readers_e = pcs
1cfc0 63 5f 72 65 61 64 65 72 73 20 2b 20 70 63 73 63  c_readers + pcsc
1cfd0 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b 0a 0a 09  _readers_len;...
1cfe0 09 09 09 2f 2a 20 53 74 61 72 74 20 77 69 74 68  .../* Start with
1cff0 20 53 6c 6f 74 20 49 44 20 31 2c 20 74 6f 20 61   Slot ID 1, to a
1d000 76 6f 69 64 20 61 20 62 75 67 20 69 6e 20 47 44  void a bug in GD
1d010 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a 09 09 09  M on RHEL */....
1d020 09 2f 2a 20 42 75 67 20 35 39 34 39 31 31 3a 20  ./* Bug 594911: 
1d030 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69 6c 6c 61  https://bugzilla
1d040 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73 68 6f 77  .redhat.com/show
1d050 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35 39 34 39  _bug.cgi?id=5949
1d060 31 31 20 2a 2f 0a 09 09 09 09 63 75 72 72 73 6c  11 */.....currsl
1d070 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73 6c 6f 74  ot = 1;.....slot
1d080 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 09  _count = 0;.....
1d090 77 68 69 6c 65 20 28 70 63 73 63 5f 72 65 61 64  while (pcsc_read
1d0a0 65 72 73 20 3c 20 70 63 73 63 5f 72 65 61 64 65  ers < pcsc_reade
1d0b0 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 2f 2a 20  rs_e) {....../* 
1d0c0 46 69 6e 64 20 6e 65 78 74 20 61 76 61 69 6c 61  Find next availa
1d0d0 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09 09 09 09  ble slot */.....
1d0e0 09 66 6f 72 20 28 3b 20 63 75 72 72 73 6c 6f 74  .for (; currslot
1d0f0 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1d100 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1d110 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1d120 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
1d130 20 7b 0a 09 09 09 09 09 09 69 66 20 28 21 63 61   {.......if (!ca
1d140 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1d150 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  lot].active) {..
1d160 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
1d170 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a 09 09 09  ...}......}.....
1d180 09 09 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  ..curr_reader_le
1d190 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63 73 63 5f  n = strlen(pcsc_
1d1a0 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09  readers);.......
1d1b0 69 66 20 28 28 70 63 73 63 5f 72 65 61 64 65 72  if ((pcsc_reader
1d1c0 73 20 2b 20 63 75 72 72 5f 72 65 61 64 65 72 5f  s + curr_reader_
1d1d0 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72 65 61 64  len) > pcsc_read
1d1e0 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09 09 62  ers_e) {.......b
1d1f0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
1d200 09 09 09 69 66 20 28 63 75 72 72 5f 72 65 61 64  ...if (curr_read
1d210 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  er_len == 0) {..
1d220 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1d230 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72  .}.......if (cur
1d240 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a 65 6f 66  rslot >= (sizeof
1d250 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1d260 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1d270 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 09  lots[0]))) {....
1d280 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d290 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 6d 6f  PRINTF("Found mo
1d2a0 72 65 20 72 65 61 64 65 72 73 20 74 68 61 6e 20  re readers than 
1d2b0 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61  slots are availa
1d2c0 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09 09 09 62  ble!");........b
1d2d0 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 0a 09 09  reak;......}....
1d2e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d2f0 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 72 65  PRINTF("Found re
1d300 61 64 65 72 3a 20 25 73 22 2c 20 70 63 73 63 5f  ader: %s", pcsc_
1d310 72 65 61 64 65 72 73 29 3b 0a 0a 09 09 09 09 09  readers);.......
1d320 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74  /* Only update t
1d330 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  he list of slots
1d340 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61   if we are actua
1d350 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b 65 64 20  lly being asked 
1d360 73 75 70 70 6c 79 20 74 68 65 20 73 6c 6f 74 20  supply the slot 
1d370 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 09  information */..
1d380 09 09 09 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  ....if (pSlotLis
1d390 74 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 73  t) {.......if (s
1d3a0 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 09  lot_reset) {....
1d3b0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1d3c0 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
1d3d0 65 20 3d 20 31 3b 0a 09 09 09 09 09 09 09 63 61  e = 1;........ca
1d3e0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1d3f0 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c 20 3d 20  lot].internal = 
1d400 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  0;........cackey
1d410 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1d420 2e 70 63 73 63 5f 72 65 61 64 65 72 20 3d 20 73  .pcsc_reader = s
1d430 74 72 64 75 70 28 70 63 73 63 5f 72 65 61 64 65  trdup(pcsc_reade
1d440 72 73 29 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  rs);........cack
1d450 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1d460 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t].pcsc_card_con
1d470 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 09 09 09  nected = 0;.....
1d480 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1d490 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61 6e 73 61  currslot].transa
1d4a0 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30 3b  ction_depth = 0;
1d4b0 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
1d4c0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
1d4d0 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
1d4e0 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 09  hw_lock = 0;....
1d4f0 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1d500 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f 6b 65 6e  [currslot].token
1d510 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f 4c 4f 47  _flags = CKF_LOG
1d520 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a 09 09 09  IN_REQUIRED;....
1d530 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1d540 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c  [currslot].label
1d550 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 09   = NULL;........
1d560 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f  .cackey_mark_slo
1d570 74 5f 72 65 73 65 74 28 26 63 61 63 6b 65 79 5f  t_reset(&cackey_
1d580 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 29  slots[currslot])
1d590 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d  ;.......}......}
1d5a0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 2f 2a   else {......./*
1d5b0 20 41 72 74 69 66 69 63 69 61 6c 6c 79 20 69 6e   Artificially in
1d5c0 63 72 65 61 73 65 20 74 68 65 20 6e 75 6d 62 65  crease the numbe
1d5d0 72 20 6f 66 20 61 63 74 69 76 65 20 73 6c 6f 74  r of active slot
1d5e0 73 20 62 79 20 77 68 61 74 20 77 69 6c 6c 20 62  s by what will b
1d5f0 65 63 6f 6d 65 20 61 63 74 69 76 65 20 2a 2f 0a  ecome active */.
1d600 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74  ......slot_count
1d610 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 09  ++;......}......
1d620 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a 09 09 09  currslot++;.....
1d630 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b  ..pcsc_readers +
1d640 3d 20 63 75 72 72 5f 72 65 61 64 65 72 5f 6c 65  = curr_reader_le
1d650 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a 0a 09 09  n + 1;.....}....
1d660 09 09 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20  ..for (currslot 
1d670 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20  = 0; currslot < 
1d680 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1d690 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1d6a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1d6b0 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a  ; currslot++) {.
1d6c0 09 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1d6d0 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1d6e0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 09 09  active) {.......
1d6f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d700 4e 54 46 28 22 46 6f 75 6e 64 20 61 63 74 69 76  NTF("Found activ
1d710 65 20 73 6c 6f 74 20 25 6c 75 22 2c 20 28 75 6e  e slot %lu", (un
1d720 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
1d730 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 09 09 73  rslot);........s
1d740 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09  lot_count++;....
1d750 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  ..}.....}....} e
1d760 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  lse {.....CACKEY
1d770 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
1d780 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f 20 53 43  econd call to SC
1d790 61 72 64 4c 69 73 74 52 65 61 64 65 72 73 20 66  ardListReaders f
1d7a0 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20 25 73  ailed, return %s
1d7b0 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f 44 45  /%li", CACKEY_DE
1d7c0 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52  BUG_FUNC_SCARDER
1d7d0 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 6c  R_TO_STR(scard_l
1d7e0 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 2c  istreaders_ret),
1d7f0 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 6c 69   (long) scard_li
1d800 73 74 72 65 61 64 65 72 73 5f 72 65 74 29 3b 0a  streaders_ret);.
1d810 09 09 09 7d 0a 0a 09 09 09 66 72 65 65 28 70 63  ...}.....free(pc
1d820 73 63 5f 72 65 61 64 65 72 73 5f 73 29 3b 0a 09  sc_readers_s);..
1d830 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43  .} else {....CAC
1d840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d850 28 22 46 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  ("First call to 
1d860 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72 73  SCardListReaders
1d870 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 20   failed, return 
1d880 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59 5f  %s/%li", CACKEY_
1d890 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
1d8a0 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
1d8b0 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1d8c0 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
1d8d0 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 29  listreaders_ret)
1d8e0 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78  ;...}..}...mutex
1d8f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1d900 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1d910 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1d920 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1d930 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1d940 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d950 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1d960 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1d970 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1d980 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1d990 69 66 20 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d  if (pSlotList ==
1d9a0 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
1d9b0 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63 6f 75 6e  ount = slot_coun
1d9c0 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  t;....CACKEY_DEB
1d9d0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1d9e0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1d9f0 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72 65 61  .  Found %lu rea
1da00 64 65 72 73 2c 20 62 75 74 20 6e 6f 74 20 73 74  ders, but not st
1da10 6f 72 69 6e 67 20 49 44 73 20 28 70 53 6c 6f 74  oring IDs (pSlot
1da20 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 22 2c 20  List == NULL)", 
1da30 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65  CKR_OK, (unsigne
1da40 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75  d long) slot_cou
1da50 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  nt);....return(C
1da60 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 63 6f 75  KR_OK);..}...cou
1da70 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e 74 3b 0a  nt = *pulCount;.
1da80 09 69 66 20 28 63 6f 75 6e 74 20 3c 20 73 6c 6f  .if (count < slo
1da90 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 43 41 43  t_count) {...CAC
1daa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dab0 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c  ("Error. User al
1dac0 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72  located %lu entr
1dad0 69 65 73 2c 20 62 75 74 20 77 65 20 68 61 76 65  ies, but we have
1dae0 20 25 6c 75 20 65 6e 74 72 69 65 73 2e 22 2c 20   %lu entries.", 
1daf0 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63 6f 75 6e  count, slot_coun
1db00 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
1db10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1db20 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
1db30 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b 0a 0a 09  _TOO_SMALL");...
1db40 09 72 65 74 75 72 6e 28 43 4b 52 5f 42 55 46 46  .return(CKR_BUFF
1db50 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 3b 09 0a  ER_TOO_SMALL);..
1db60 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1db70 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1db80 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1db90 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1dba0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1dbb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1dbc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1dbd0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1dbe0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1dbf0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1dc00 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64 78 20 3d  ..}...slot_idx =
1dc10 20 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 73 6c   0;..for (currsl
1dc20 6f 74 20 3d 20 30 3b 20 28 63 75 72 72 73 6c 6f  ot = 0; (currslo
1dc30 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
1dc40 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1dc50 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1dc60 30 5d 29 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b  0]))); currslot+
1dc70 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b  +) {...if (!cack
1dc80 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1dc90 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
1dca0 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09  continue;...}...
1dcb0 09 69 66 20 28 73 6c 6f 74 5f 69 64 78 20 3e 3d  .if (slot_idx >=
1dcc0 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09 43 41 43   count) {....CAC
1dcd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dce0 28 22 45 72 72 6f 72 2e 20 55 73 65 72 20 61 6c  ("Error. User al
1dcf0 6c 6f 63 61 74 65 64 20 25 6c 75 20 65 6e 74 72  located %lu entr
1dd00 69 65 73 2c 20 62 75 74 20 77 65 20 6a 75 73 74  ies, but we just
1dd10 20 74 72 69 65 64 20 74 6f 20 77 72 69 74 65 20   tried to write 
1dd20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e 64 65 78  to the %lu index
1dd30 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22 2c 20 63   -- ignoring", c
1dd40 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64 78 29 3b  ount, slot_idx);
1dd50 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
1dd60 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69 73 74 5b  .}....pSlotList[
1dd70 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63 75 72 72  slot_idx] = curr
1dd80 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f 69 64 78  slot;...slot_idx
1dd90 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ++;..}...mutex_r
1dda0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1ddb0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1ddc0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1ddd0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1dde0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1ddf0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1de00 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1de10 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1de20 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1de30 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2a 70  _ERROR);..}...*p
1de40 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
1de50 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ount;...CACKEY_D
1de60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1de70 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1de80 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20 72  i).  Found %lu r
1de90 65 61 64 65 72 73 2e 22 2c 20 43 4b 52 5f 4f 4b  eaders.", CKR_OK
1dea0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1deb0 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a  ) slot_count);..
1dec0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1ded0 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65 6e 74 20  ...tokenPresent 
1dee0 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e 74 3b 20  = tokenPresent; 
1def0 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
1df00 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
1df10 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49  ng */.}..CK_DEFI
1df20 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1df30 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49 6e 66 6f  V, C_GetSlotInfo
1df40 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
1df50 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f 49 4e 46  tID, CK_SLOT_INF
1df60 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09  O_PTR pInfo) {..
1df70 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48  static CK_UTF8CH
1df80 41 52 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69  AR slotDescripti
1df90 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65 79 20 53  on[] = "CACKey S
1dfa0 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75 74 65 78  lot";..int mutex
1dfb0 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 62 79  _retval;..int by
1dfc0 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 43  tes_to_copy;...C
1dfd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1dfe0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1dff0 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
1e000 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1e010 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e020 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
1e030 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1e040 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1e050 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1e060 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e070 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e080 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e090 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e0a0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e0b0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1e0c0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1e0d0 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
1e0e0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1e0f0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1e100 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1e110 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1e120 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1e130 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e140 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1e150 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1e160 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1e170 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1e180 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1e190 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1e1a0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1e1b0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1e1c0 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1e1d0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1e1e0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1e1f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e200 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e210 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1e220 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1e230 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1e240 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
1e250 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1e260 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
1e270 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e280 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1e290 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1e2a0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
1e2b0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
1e2c0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
1e2d0 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1e2e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1e2f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1e300 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1e310 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70  INVALID);..}...p
1e320 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b  Info->flags = CK
1e330 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09 69 66 20  F_HW_SLOT;...if 
1e340 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (!cackey_slots[s
1e350 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e 61 6c 29  lotID].internal)
1e360 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67   {...pInfo->flag
1e370 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f 56 41 42  s |= CKF_REMOVAB
1e380 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d 0a 0a 09  LE_DEVICE;..}...
1e390 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
1e3a0 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
1e3b0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
1e3c0 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  == CACKEY_PCSC_S
1e3d0 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
1e3e0 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1e3f0 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f 50 52 45  |= CKF_TOKEN_PRE
1e400 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79 74 65 73  SENT;..}...bytes
1e410 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74 72 6c 65  _to_copy = strle
1e420 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  n(cackey_slots[s
1e430 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
1e440 65 72 29 3b 0a 09 69 66 20 28 73 69 7a 65 6f 66  er);..if (sizeof
1e450 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74  (pInfo->manufact
1e460 75 72 65 72 49 44 29 20 3c 20 62 79 74 65 73 5f  urerID) < bytes_
1e470 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09 62 79 74  to_copy) {...byt
1e480 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 69 7a  es_to_copy = siz
1e490 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
1e4a0 61 63 74 75 72 65 72 49 44 29 3b 0a 09 7d 0a 09  acturerID);..}..
1e4b0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61  memcpy(pInfo->ma
1e4c0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 63 61  nufacturerID, ca
1e4d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1e4e0 44 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  D].pcsc_reader, 
1e4f0 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a  bytes_to_copy);.
1e500 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1e510 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
1e520 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1e530 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1e540 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1e550 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e560 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
1e570 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
1e580 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1e590 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1e5a0 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49  ;..}...memset(pI
1e5b0 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63 72 69 70  nfo->slotDescrip
1e5c0 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69 7a 65 6f  tion, ' ', sizeo
1e5d0 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  f(pInfo->slotDes
1e5e0 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09 6d 65 6d  cription));..mem
1e5f0 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  cpy(pInfo->slotD
1e600 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 6c 6f 74  escription, slot
1e610 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a  Description, siz
1e620 65 6f 66 28 73 6c 6f 74 44 65 73 63 72 69 70 74  eof(slotDescript
1e630 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  ion) - 1);...mem
1e640 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  set(pInfo->manuf
1e650 61 63 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20  acturerID, ' ', 
1e660 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
1e670 6e 75 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a  nufacturerID));.
1e680 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
1e690 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
1e6a0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1e6b0 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
1e6c0 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
1e6d0 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
1e6e0 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1e6f0 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
1e700 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
1e710 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
1e720 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
1e730 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1e740 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
1e750 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  x00;...CACKEY_DE
1e760 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1e770 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
1e780 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
1e790 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
1e7a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
1e7b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
1e7c0 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43 4b 5f 53  tTokenInfo)(CK_S
1e7d0 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43  LOT_ID slotID, C
1e7e0 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f 50 54 52  K_TOKEN_INFO_PTR
1e7f0 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
1e800 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
1e810 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
1e820 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
1e830 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
1e840 54 46 38 43 48 41 52 20 64 65 66 61 75 6c 74 4c  TF8CHAR defaultL
1e850 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b 6e 6f 77  abel[] = "Unknow
1e860 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 61 74 69  n Token";..stati
1e870 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 6f  c CK_UTF8CHAR mo
1e880 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20 54 6f 6b  del[] = "CAC Tok
1e890 65 6e 22 3b 0a 09 73 74 72 75 63 74 20 63 61 63  en";..struct cac
1e8a0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
1e8b0 79 20 2a 70 63 73 63 5f 69 64 65 6e 74 69 74 69  y *pcsc_identiti
1e8c0 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  es;..unsigned lo
1e8d0 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 09 73  ng num_certs;..s
1e8e0 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f 72 65 74  size_t label_ret
1e8f0 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1e900 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65 5f 64 65  val;..int use_de
1e910 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a 0a 09 43  fault_label;...C
1e920 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1e930 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
1e940 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
1e950 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
1e960 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1e970 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
1e980 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1e990 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1e9a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1e9b0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1e9c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e9d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e9e0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1e9f0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1ea00 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1ea10 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1ea20 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  .}...if (slotID 
1ea30 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
1ea40 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1ea50 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
1ea60 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
1ea70 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
1ea80 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1ea90 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1eaa0 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1eab0 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
1eac0 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
1ead0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1eae0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
1eaf0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1eb00 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1eb10 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1eb20 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1eb30 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1eb40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1eb50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1eb60 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1eb70 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1eb80 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1eb90 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
1eba0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1ebb0 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
1ebc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ebd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1ebe0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1ebf0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
1ec00 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
1ec10 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
1ec20 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
1ec30 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1ec40 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
1ec50 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1ec60 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
1ec70 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e 5f  f (cackey_token_
1ec80 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79 5f  present(&cackey_
1ec90 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20 21  slots[slotID]) !
1eca0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
1ecb0 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b 0a  TOKENPRESENT) {.
1ecc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ecd0 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b 65 6e 20  RINTF("No token 
1ece0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 73 6c  is present in sl
1ecf0 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20 73 6c 6f  otID = %lu", slo
1ed00 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1ed10 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ed20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1ed30 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f 4b 45  .return(CKR_TOKE
1ed40 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54 29 3b 0a  N_NOT_PRESENT);.
1ed50 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1ed60 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1ed70 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1ed80 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1ed90 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1eda0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1edb0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1edc0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1edd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1ede0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1edf0 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  OR);..}.../* Det
1ee00 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20 6c 61 62  ermine token lab
1ee10 65 6c 20 66 72 6f 6d 20 63 65 72 74 69 66 69 63  el from certific
1ee20 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73 65 74 28  ates */..memset(
1ee30 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 27 20  pInfo->label, ' 
1ee40 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1ee50 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73 65 5f 64  >label));..use_d
1ee60 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 31  efault_label = 1
1ee70 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ;...if (cackey_s
1ee80 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1ee90 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  el == NULL) {...
1eea0 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
1eeb0 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65  = cackey_read_ce
1eec0 72 74 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  rts(&cackey_slot
1eed0 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55 4c 4c 2c  s[slotID], NULL,
1eee0 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b 0a 09 09   &num_certs);...
1eef0 69 66 20 28 70 63 73 63 5f 69 64 65 6e 74 69 74  if (pcsc_identit
1ef00 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ies != NULL) {..
1ef10 09 09 69 66 20 28 6e 75 6d 5f 63 65 72 74 73 20  ..if (num_certs 
1ef20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61 62 65 6c  > 0) {.....label
1ef30 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 70 63  _ret = cackey_pc
1ef40 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c  sc_identity_to_l
1ef50 61 62 65 6c 28 70 63 73 63 5f 69 64 65 6e 74 69  abel(pcsc_identi
1ef60 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e 6c 61 62  ties, pInfo->lab
1ef70 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  el, sizeof(pInfo
1ef80 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09 09 09 69  ->label));.....i
1ef90 66 20 28 6c 61 62 65 6c 5f 72 65 74 20 3e 20 30  f (label_ret > 0
1efa0 29 20 7b 0a 09 09 09 09 09 75 73 65 5f 64 65 66  ) {......use_def
1efb0 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30 3b 0a  ault_label = 0;.
1efc0 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1efd0 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c  ts[slotID].label
1efe0 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
1eff0 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1f000 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61  .......memcpy(ca
1f010 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1f020 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e 66 6f 2d  D].label, pInfo-
1f030 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
1f040 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
1f050 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ...}....}.....ca
1f060 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28  ckey_free_certs(
1f070 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 2c  pcsc_identities,
1f080 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29 3b 0a   num_certs, 1);.
1f090 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
1f0a0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6c 61  memcpy(pInfo->la
1f0b0 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  bel, cackey_slot
1f0c0 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c  s[slotID].label,
1f0d0 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1f0e0 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73 65 5f 64  abel));....use_d
1f0f0 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20 30  efault_label = 0
1f100 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 5f 64  ;..}...if (use_d
1f110 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29 20 7b 0a  efault_label) {.
1f120 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e  ..memcpy(pInfo->
1f130 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c 74 4c 61  label, defaultLa
1f140 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64 65 66 61  bel, sizeof(defa
1f150 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31 29 3b 0a  ultLabel) - 1);.
1f160 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66  .}...memset(pInf
1f170 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1f180 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70  D, ' ', sizeof(p
1f190 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1f1a0 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28  erID));..memcpy(
1f1b0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1f1c0 72 65 72 49 44 2c 20 6d 61 6e 75 66 61 63 74 75  rerID, manufactu
1f1d0 72 65 72 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61  rerID, sizeof(ma
1f1e0 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 2d 20  nufacturerID) - 
1f1f0 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e  1);...memset(pIn
1f200 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20 27 2c 20  fo->model, ' ', 
1f210 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 6f  sizeof(pInfo->mo
1f220 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70  del));..memcpy(p
1f230 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 6d 6f 64  Info->model, mod
1f240 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f 64 65 6c  el, sizeof(model
1f250 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
1f260 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e 75  (pInfo->serialNu
1f270 6d 62 65 72 2c 20 27 20 27 2c 20 73 69 7a 65 6f  mber, ' ', sizeo
1f280 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61 6c 4e  f(pInfo->serialN
1f290 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65 6d 73 65  umber));...memse
1f2a0 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  t(pInfo->utcTime
1f2b0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1f2c0 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29 29 3b 0a  nfo->utcTime));.
1f2d0 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64 77 61 72  ..pInfo->hardwar
1f2e0 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  eVersion.major =
1f2f0 20 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73   (cackey_getvers
1f300 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20 26 20 30  ion() >> 16) & 0
1f310 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  xff;..pInfo->har
1f320 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  dwareVersion.min
1f330 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1f340 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 38 29 20  version() >> 8) 
1f350 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e 66 6f 2d  & 0xff;...pInfo-
1f360 3e 66 69 72 6d 77 61 72 65 56 65 72 73 69 6f 6e  >firmwareVersion
1f370 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30 3b 0a 09  .major = 0x00;..
1f380 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1f390 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 30  ersion.minor = 0
1f3a0 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c  x00;...pInfo->fl
1f3b0 61 67 73 20 3d 20 43 4b 46 5f 57 52 49 54 45 5f  ags = CKF_WRITE_
1f3c0 50 52 4f 54 45 43 54 45 44 20 7c 20 43 4b 46 5f  PROTECTED | CKF_
1f3d0 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54 49 41 4c  USER_PIN_INITIAL
1f3e0 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f 4b 45 4e  IZED | CKF_TOKEN
1f3f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 63  _INITIALIZED | c
1f400 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1f410 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 3b  ID].token_flags;
1f420 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 53  ...pInfo->ulMaxS
1f430 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 28 73  essionCount = (s
1f440 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1f450 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1f460 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1f470 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49 6e 66 6f  0])) - 1;..pInfo
1f480 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f 75 6e 74  ->ulSessionCount
1f490 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
1f4a0 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
1f4b0 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52 77 53 65  pInfo->ulMaxRwSe
1f4c0 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 30 3b 0a  ssionCount = 0;.
1f4d0 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53 65 73 73  .pInfo->ulRwSess
1f4e0 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e  ionCount = CK_UN
1f4f0 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1f500 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75  ATION;..pInfo->u
1f510 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20 31 32 38  lMaxPinLen = 128
1f520 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 50  ;..pInfo->ulMinP
1f530 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70 49 6e 66  inLen = 0;..pInf
1f540 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62 6c 69 63  o->ulTotalPublic
1f550 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56  Memory = CK_UNAV
1f560 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1f570 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 46  ION;..pInfo->ulF
1f580 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20  reePublicMemory 
1f590 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45  = CK_UNAVAILABLE
1f5a0 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70  _INFORMATION;..p
1f5b0 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 72 69  Info->ulTotalPri
1f5c0 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
1f5d0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
1f5e0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
1f5f0 3e 75 6c 46 72 65 65 50 72 69 76 61 74 65 4d 65  >ulFreePrivateMe
1f600 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49  mory = CK_UNAVAI
1f610 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1f620 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  N;...CACKEY_DEBU
1f630 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1f640 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1f650 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1f660 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1f670 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1f680 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57 61 69 74  ON(CK_RV, C_Wait
1f690 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29 28 43 4b  ForSlotEvent)(CK
1f6a0 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c 20 43 4b  _FLAGS flags, CK
1f6b0 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20 70 53 6c  _SLOT_ID_PTR pSl
1f6c0 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  otID, CK_VOID_PT
1f6d0 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
1f6e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f6f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f700 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
1f710 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
1f720 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f730 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
1f740 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
1f750 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f760 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1f770 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1f780 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f790 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f7a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f7b0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f7c0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f7d0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f7e0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f7f0 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44 4f 3a 20  ../* XXX: TODO: 
1f800 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69 73 2e 2e  Implement this..
1f810 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f 44 45 42  . */..CACKEY_DEB
1f820 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1f830 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
1f840 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
1f850 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
1f860 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
1f870 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
1f880 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1f890 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
1f8a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1f8b0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
1f8c0 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b 5f 53 4c  anismList)(CK_SL
1f8d0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1f8e0 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 5f  _MECHANISM_TYPE_
1f8f0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 4c 69  PTR pMechanismLi
1f900 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  st, CK_ULONG_PTR
1f910 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41   pulCount) {..CA
1f920 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f930 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1f940 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1f950 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1f960 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f970 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1f980 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1f990 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1f9a0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1f9b0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1f9c0 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
1f9d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f9e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f9f0 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  .  pulCount is N
1fa00 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1fa10 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1fa20 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  BAD);..}...if (p
1fa30 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 20 3d 3d  MechanismList ==
1fa40 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70 75 6c 43   NULL) {...*pulC
1fa50 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09 43 41 43  ount = 1;....CAC
1fa60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fa70 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1fa80 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1fa90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1faa0 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 2a  _OK);..}...if (*
1fab0 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29 20 7b 0a  pulCount < 1) {.
1fac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fad0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 42  RINTF("Error.  B
1fae0 75 66 66 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2e  uffer too small.
1faf0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fb00 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
1fb10 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65 63 68 61  LL);..}...pMecha
1fb20 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d 20 43 4b  nismList[0] = CK
1fb30 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09 2a 70 75  M_RSA_PKCS;..*pu
1fb40 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 43 41  lCount = 1;...CA
1fb50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fb60 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1fb70 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1fb80 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1fb90 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
1fba0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
1fbb0 56 2c 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73  V, C_GetMechanis
1fbc0 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49  mInfo)(CK_SLOT_I
1fbd0 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 4d 45 43  D slotID, CK_MEC
1fbe0 48 41 4e 49 53 4d 5f 54 59 50 45 20 74 79 70 65  HANISM_TYPE type
1fbf0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 49  , CK_MECHANISM_I
1fc00 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b  NFO_PTR pInfo) {
1fc10 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
1fc20 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
1fc30 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1fc40 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66  d.");...if (pInf
1fc50 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  o == NULL) {...C
1fc60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1fc70 54 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f  TF("Error. pInfo
1fc80 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
1fc90 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
1fca0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
1fcb0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1fcc0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1fcd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fce0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1fcf0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1fd00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1fd10 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1fd20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
1fd30 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
1fd40 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
1fd50 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1fd60 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1fd70 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
1fd80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fd90 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1fda0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1fdb0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
1fdc0 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
1fdd0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
1fde0 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f  urn(CKR_SLOT_ID_
1fdf0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
1fe00 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1fe10 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
1fe20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1fe30 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1fe40 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1fe50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fe60 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
1fe70 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1fe80 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1fe90 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1fea0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1feb0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
1fec0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
1fed0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1fee0 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1fef0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1ff00 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
1ff10 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
1ff20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1ff30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1ff40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ff50 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1ff60 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1ff70 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1ff80 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1ff90 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1ffa0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1ffb0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1ffc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ffd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ffe0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1fff0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20000 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20010 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  ROR);..}...switc
20020 68 20 28 74 79 70 65 29 20 7b 0a 09 09 63 61 73  h (type) {...cas
20030 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a  e CKM_RSA_PKCS:.
20040 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 69 6e 4b  ...pInfo->ulMinK
20050 65 79 53 69 7a 65 20 3d 20 35 31 32 3b 0a 09 09  eySize = 512;...
20060 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 4b 65 79  .pInfo->ulMaxKey
20070 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a 09 09 09  Size = 8192;....
20080 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43  pInfo->flags = C
20090 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45 4e 43 52  KF_HW | CKF_ENCR
200a0 59 50 54 20 7c 20 43 4b 46 5f 44 45 43 52 59 50  YPT | CKF_DECRYP
200b0 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20 7c 20 43  T | CKF_SIGN | C
200c0 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09 09 62 72  KF_VERIFY;....br
200d0 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  eak;..}...CACKEY
200e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
200f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
20100 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
20110 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
20120 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74  ;.}../* We don't
20130 20 73 75 70 70 6f 72 74 20 74 68 69 73 20 6d 65   support this me
20140 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49  thod. */.CK_DEFI
20150 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
20160 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 29 28  V, C_InitToken)(
20170 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
20180 44 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  D, CK_UTF8CHAR_P
20190 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
201a0 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43 4b 5f 55  G ulPinLen, CK_U
201b0 54 46 38 43 48 41 52 5f 50 54 52 20 70 4c 61 62  TF8CHAR_PTR pLab
201c0 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  el) {..CACKEY_DE
201d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
201e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
201f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
20200 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20210 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20220 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
20230 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
20240 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
20250 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
20260 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
20270 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
20280 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52  ing CKR_TOKEN_WR
20290 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 28 25  ITE_PROTECTED (%
202a0 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45 4e 5f 57  i)", CKR_TOKEN_W
202b0 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b  RITE_PROTECTED);
202c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 54 4f  ...return(CKR_TO
202d0 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
202e0 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  TED);.}../* We d
202f0 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
20300 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
20310 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
20320 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 50 49 4e  CK_RV, C_InitPIN
20330 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
20340 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
20350 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50  _UTF8CHAR_PTR pP
20360 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  in, CK_ULONG ulP
20370 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  inLen) {..CACKEY
20380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
20390 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
203a0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
203b0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
203c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
203d0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
203e0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
203f0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20400 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20410 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
20420 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20430 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e  urning CKR_TOKEN
20440 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
20450 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45   (%i)", CKR_TOKE
20460 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
20470 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
20480 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
20490 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57  TECTED);.}../* W
204a0 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
204b0 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
204c0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
204d0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 74 50  ON(CK_RV, C_SetP
204e0 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  IN)(CK_SESSION_H
204f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
20500 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
20510 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  pOldPin, CK_ULON
20520 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e 2c 20 43  G ulOldPinLen, C
20530 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
20540 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  NewPin, CK_ULONG
20550 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29 20 7b 0a   ulNewPinLen) {.
20560 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20570 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20580 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20590 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
205a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
205b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
205c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
205d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
205e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
205f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
20600 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20610 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
20620 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
20630 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
20640 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
20650 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
20660 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
20670 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
20680 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
20690 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
206a0 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 29 28 43  C_OpenSession)(C
206b0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
206c0 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  , CK_FLAGS flags
206d0 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41  , CK_VOID_PTR pA
206e0 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43 4b 5f 4e  pplication, CK_N
206f0 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c 20 43 4b  OTIFY notify, CK
20700 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
20710 50 54 52 20 70 68 53 65 73 73 69 6f 6e 29 20 7b  PTR phSession) {
20720 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
20730 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  idx;..int mutex_
20740 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 66 6f 75  retval;..int fou
20750 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 30 3b 0a  nd_session = 0;.
20760 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20770 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
20780 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67 73 20 26  ;...if ((flags &
20790 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53 45 53 53   CKF_SERIAL_SESS
207a0 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53 45 52 49  ION) != CKF_SERI
207b0 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b 0a 09 09  AL_SESSION) {...
207c0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
207d0 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e 4f 54 5f  ON_PARALLEL_NOT_
207e0 53 55 50 50 4f 52 54 45 44 29 3b 0a 09 7d 0a 0a  SUPPORTED);..}..
207f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
20800 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
20810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20820 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
20830 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
20840 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
20850 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
20860 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
20870 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
20880 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
20890 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
208a0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
208b0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
208c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
208d0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
208e0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
208f0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
20900 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
20910 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
20920 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44  turn(CKR_SLOT_ID
20930 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
20940 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
20950 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
20960 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20970 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
20980 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
20990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
209a0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
209b0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
209c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
209d0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
209e0 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
209f0 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
20a00 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
20a10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20a20 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
20a30 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
20a40 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
20a50 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
20a60 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
20a70 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
20a80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20a90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20aa0 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29  SLOT_ID_INVALID)
20ab0 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72 69 66 79  ;..}.../* Verify
20ac0 20 74 68 61 74 20 74 68 65 20 63 61 72 64 20 69   that the card i
20ad0 73 20 61 63 74 75 61 6c 6c 79 20 69 6e 20 74 68  s actually in th
20ae0 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f 2a 20 58  e slot. */../* X
20af0 58 58 3a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b  XX: Check to mak
20b00 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 69  e sure this is i
20b10 6e 20 74 68 65 20 50 4b 43 53 23 31 31 20 73 70  n the PKCS#11 sp
20b20 65 63 69 66 69 63 61 74 69 6f 6e 20 2a 2f 0a 09  ecification */..
20b30 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b 65 6e  if (cackey_token
20b40 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b 65 79  _present(&cackey
20b50 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 29 20  _slots[slotID]) 
20b60 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
20b70 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29 20 7b  _TOKENPRESENT) {
20b80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20b90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20ba0 43 61 72 64 20 6e 6f 74 20 70 72 65 73 65 6e 74  Card not present
20bb0 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  .  Returning CKR
20bc0 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 22  _DEVICE_REMOVED"
20bd0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
20be0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
20bf0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
20c00 74 75 72 6e 28 43 4b 52 5f 44 45 56 49 43 45 5f  turn(CKR_DEVICE_
20c10 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a 0a 09 66  REMOVED);..}...f
20c20 6f 72 20 28 69 64 78 20 3d 20 31 3b 20 69 64 78  or (idx = 1; idx
20c30 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
20c40 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
20c50 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
20c60 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
20c70 29 20 7b 0a 09 09 69 66 20 28 21 63 61 63 6b 65  ) {...if (!cacke
20c80 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
20c90 61 63 74 69 76 65 29 20 7b 0a 09 09 09 66 6f 75  active) {....fou
20ca0 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20 31 3b 0a  nd_session = 1;.
20cb0 0a 09 09 09 2a 70 68 53 65 73 73 69 6f 6e 20 3d  ....*phSession =
20cc0 20 69 64 78 3b 0a 0a 09 09 09 63 61 63 6b 65 79   idx;.....cackey
20cd0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
20ce0 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 63 61  ctive = 1;....ca
20cf0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
20d00 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73 6c 6f 74  x].slotID = slot
20d10 49 44 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  ID;....cackey_se
20d20 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 74 61 74  ssions[idx].stat
20d30 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49  e = CKS_RO_PUBLI
20d40 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09 09 63 61  C_SESSION;....ca
20d50 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
20d60 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73  x].flags = flags
20d70 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
20d80 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44 65 76 69  ions[idx].ulDevi
20d90 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a 09 09 09  ceError = 0;....
20da0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20db0 69 64 78 5d 2e 70 41 70 70 6c 69 63 61 74 69 6f  idx].pApplicatio
20dc0 6e 20 3d 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  n = pApplication
20dd0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
20de0 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74 69 66 79  ions[idx].Notify
20df0 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09 09 09 63   = notify;.....c
20e00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
20e10 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  dx].identities =
20e20 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79   NULL;....cackey
20e30 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 69  _sessions[idx].i
20e40 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
20e50 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
20e60 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 65  sessions[idx].se
20e70 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
20e80 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
20e90 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67 6e 5f 61  ions[idx].sign_a
20ea0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
20eb0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
20ec0 64 78 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  dx].decrypt_acti
20ed0 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  ve = 0;.....cack
20ee0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
20ef0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  .identities = ca
20f00 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69  ckey_read_identi
20f10 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f  ties(&cackey_slo
20f20 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63  ts[slotID], &cac
20f30 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
20f40 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
20f50 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65 61 6b 3b  nt);......break;
20f60 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ...}..}...mutex_
20f70 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20f80 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20f90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
20fa0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
20fb0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
20fc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20fd0 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
20fe0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20ff0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21000 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
21010 66 20 28 21 66 6f 75 6e 64 5f 73 65 73 73 69 6f  f (!found_sessio
21020 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  n) {...CACKEY_DE
21030 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21040 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53 53 49 4f  rning CKR_SESSIO
21050 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22 2c 20 43  N_COUNT (%i)", C
21060 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54  KR_SESSION_COUNT
21070 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21080 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 29 3b  _SESSION_COUNT);
21090 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
210a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
210b0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
210c0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
210d0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
210e0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
210f0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6c 6f  ION(CK_RV, C_Clo
21100 73 65 53 65 73 73 69 6f 6e 29 28 43 4b 5f 53 45  seSession)(CK_SE
21110 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
21120 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74 20 6d 75  ssion) {..int mu
21130 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
21140 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21150 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21160 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21170 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21180 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21190 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
211a0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
211b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
211c0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
211d0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
211e0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
211f0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
21200 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
21210 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
21220 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
21230 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21240 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21250 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
21260 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
21270 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21280 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
21290 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
212a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
212b0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
212c0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
212d0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
212e0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
212f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21300 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
21310 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21320 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21330 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
21340 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
21350 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
21360 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
21370 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21380 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21390 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
213a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
213b0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
213c0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
213d0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
213e0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
213f0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
21400 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
21410 69 76 65 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79  ive = 0;..cackey
21420 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73  _free_identities
21430 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21440 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
21450 69 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65  ities, cackey_se
21460 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
21470 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
21480 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  t);...mutex_retv
21490 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
214a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
214b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
214c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
214d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
214e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
214f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
21500 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21510 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21520 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
21530 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21540 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
21550 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
21560 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
21570 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
21580 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
21590 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
215a0 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  ns)(CK_SLOT_ID s
215b0 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e 74 33 32  lotID) {..uint32
215c0 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  _t idx;..int mut
215d0 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
215e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
215f0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
21600 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21610 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21620 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21630 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
21640 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
21650 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
21660 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
21670 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
21680 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
21690 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
216a0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
216b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
216c0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
216d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
216e0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
216f0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
21700 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
21710 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
21720 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
21730 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
21740 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
21750 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
21760 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
21770 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
21780 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
21790 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
217a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
217b0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
217c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
217d0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
217e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
217f0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
21800 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
21810 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
21820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21830 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
21840 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
21850 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
21860 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
21870 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
21880 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
21890 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
218a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
218b0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
218c0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
218d0 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
218e0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
218f0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
21900 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
21910 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
21920 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21930 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  idx].active) {..
21940 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
21950 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49  sions[idx].slotI
21960 44 20 21 3d 20 73 6c 6f 74 49 44 29 20 7b 0a 09  D != slotID) {..
21970 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
21980 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  }.....cackey_mut
21990 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
219a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 43 5f  _biglock);....C_
219b0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78  CloseSession(idx
219c0 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
219d0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
219e0 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a 09 7d 0a  iglock);...}..}.
219f0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
21a00 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
21a10 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
21a20 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
21a30 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
21a40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21a50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
21a60 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
21a70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21a80 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
21a90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
21aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
21ab0 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
21ac0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
21ad0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
21ae0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
21af0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
21b00 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29 28 43 4b  tSessionInfo)(CK
21b10 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
21b20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 53 45 53  hSession, CK_SES
21b30 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52 20 70 49  SION_INFO_PTR pI
21b40 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  nfo) {..int mute
21b50 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
21b60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21b70 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
21b80 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
21b90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21ba0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21bb0 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
21bc0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
21bd0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
21be0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
21bf0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
21c00 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21c10 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21c20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
21c30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21c40 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
21c50 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
21c60 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
21c70 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
21c80 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
21c90 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
21ca0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
21cb0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
21cc0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21cd0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
21ce0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
21cf0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
21d00 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
21d10 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
21d20 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
21d30 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
21d40 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
21d50 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
21d60 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
21d70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21d80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
21d90 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
21da0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
21db0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
21dc0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
21dd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21de0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
21df0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21e00 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21e10 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
21e20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21e30 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
21e40 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
21e50 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
21e60 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
21e70 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e  D);..}...pInfo->
21e80 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
21e90 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
21ea0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70 49 6e 66  n].slotID;..pInf
21eb0 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61 63 6b 65  o->state = cacke
21ec0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
21ed0 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09 70 49 6e  ion].state;..pIn
21ee0 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63 61 63 6b  fo->flags = cack
21ef0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21f00 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a 09 70 49  sion].flags;..pI
21f10 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65 45 72 72  nfo->ulDeviceErr
21f20 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  or = cackey_sess
21f30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 75  ions[hSession].u
21f40 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 0a 09  lDeviceError;...
21f50 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
21f60 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
21f70 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
21f80 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
21f90 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
21fa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21fb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
21fc0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
21fd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
21fe0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
21ff0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
22000 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
22010 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
22020 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
22030 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
22040 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
22050 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f  ON(CK_RV, C_GetO
22060 70 65 72 61 74 69 6f 6e 53 74 61 74 65 29 28 43  perationState)(C
22070 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22080 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
22090 54 45 5f 50 54 52 20 70 4f 70 65 72 61 74 69 6f  TE_PTR pOperatio
220a0 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nState, CK_ULONG
220b0 5f 50 54 52 20 70 75 6c 4f 70 65 72 61 74 69 6f  _PTR pulOperatio
220c0 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a 09 43 41  nStateLen) {..CA
220d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
220e0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
220f0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22100 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22120 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22130 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22140 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22150 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22160 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
22170 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22180 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
22190 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
221a0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
221b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
221c0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
221d0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
221e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
221f0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
22200 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
22210 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
22220 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22230 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
22240 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61  _BYTE_PTR pOpera
22250 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c  tionState, CK_UL
22260 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69 6f 6e 53  ONG ulOperationS
22270 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f 42 4a 45  tateLen, CK_OBJE
22280 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e 63 72 79  CT_HANDLE hEncry
22290 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ptionKey, CK_OBJ
222a0 45 43 54 5f 48 41 4e 44 4c 45 20 68 41 75 74 68  ECT_HANDLE hAuth
222b0 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79 29 20 7b  enticationKey) {
222c0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
222d0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
222e0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
222f0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
22300 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22310 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
22320 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
22330 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22340 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
22350 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
22360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22370 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
22380 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22390 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
223a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
223b0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
223c0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
223d0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
223e0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
223f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
22400 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f 53 45 53   C_Login)(CK_SES
22410 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
22420 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52 5f 54 59  sion, CK_USER_TY
22430 50 45 20 75 73 65 72 54 79 70 65 2c 20 43 4b 5f  PE userType, CK_
22440 55 54 46 38 43 48 41 52 5f 50 54 52 20 70 50 69  UTF8CHAR_PTR pPi
22450 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69  n, CK_ULONG ulPi
22460 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54  nLen) {..CK_SLOT
22470 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74  _ID slotID;..int
22480 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
22490 69 6e 74 20 74 72 69 65 73 5f 72 65 6d 61 69 6e  int tries_remain
224a0 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67 69 6e 5f  ing;..int login_
224b0 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
224c0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
224d0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
224e0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
224f0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
22500 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22510 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
22520 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
22530 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
22540 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
22550 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
22560 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
22570 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
22580 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
22590 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
225a0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
225b0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
225c0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
225d0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
225e0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
225f0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
22600 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
22610 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65 72 54 79  ..}...if (userTy
22620 70 65 20 21 3d 20 43 4b 55 5f 55 53 45 52 29 20  pe != CKU_USER) 
22630 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22640 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22650 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   We only support
22660 20 55 53 45 52 20 6d 6f 64 65 2c 20 61 73 6b 65   USER mode, aske
22670 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64 65 2e 22  d for %lu mode."
22680 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
22690 29 20 75 73 65 72 54 79 70 65 29 0a 0a 09 09 72  ) userType)....r
226a0 65 74 75 72 6e 28 43 4b 52 5f 55 53 45 52 5f 54  eturn(CKR_USER_T
226b0 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  YPE_INVALID);..}
226c0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
226d0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
226e0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
226f0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
22700 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
22710 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22720 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
22730 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
22740 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
22750 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
22760 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
22770 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
22780 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
22790 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
227a0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
227b0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
227c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
227d0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
227e0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
227f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
22800 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
22810 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20  D);..}...slotID 
22820 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
22830 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74  s[hSession].slot
22840 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44  ID;...if (slotID
22850 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e   < 0 || slotID >
22860 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
22870 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
22880 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
22890 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
228a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
228b0 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
228c0 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
228d0 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c  , outside of val
228e0 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49  id range", slotI
228f0 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  D);....return(CK
22900 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22910 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
22920 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
22930 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
22940 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22950 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
22960 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
22970 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
22980 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
22990 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
229a0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
229b0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
229c0 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
229d0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
229e0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f 67 69 6e  ROR);..}...login
229f0 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 6c 6f  _ret = cackey_lo
22a00 67 69 6e 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74  gin(&cackey_slot
22a10 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50 69 6e 2c  s[slotID], pPin,
22a20 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74 72 69 65   ulPinLen, &trie
22a30 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 09 69  s_remaining);..i
22a40 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 21 3d 20  f (login_ret != 
22a50 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
22a60 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
22a70 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
22a80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66  _biglock);....if
22a90 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43   (login_ret == C
22aa0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43  ACKEY_PCSC_E_LOC
22ab0 4b 45 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  KED) {....CACKEY
22ac0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22ad0 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20 69 73 20  rror.  Token is 
22ae0 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09 09 09 63  locked.");.....c
22af0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
22b00 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
22b10 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f  |= CKF_USER_PIN_
22b20 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72 65 74 75  LOCKED;.....retu
22b30 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f 43 4b 45  rn(CKR_PIN_LOCKE
22b40 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  D);...} else if 
22b50 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d 20 43 41  (login_ret == CA
22b60 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42 41 44 50  CKEY_PCSC_E_BADP
22b70 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  IN) {....CACKEY_
22b80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22b90 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64 20 50 49  ror.  Invalid PI
22ba0 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  N.");.....cackey
22bb0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
22bc0 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
22bd0 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54  F_USER_PIN_COUNT
22be0 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20 28 74 72  _LOW;.....if (tr
22bf0 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 3d  ies_remaining ==
22c00 20 31 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79   1) {.....cackey
22c10 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 74  _slots[slotID].t
22c20 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d 20 43 4b  oken_flags |= CK
22c30 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c  F_USER_PIN_FINAL
22c40 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  _TRY;....}.....r
22c50 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 49 4e  eturn(CKR_PIN_IN
22c60 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d 0a 0a 09  CORRECT);...}...
22c70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22c80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
22c90 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72 65 74 75  known error retu
22ca0 72 6e 65 64 20 66 72 6f 6d 20 63 61 63 6b 65 79  rned from cackey
22cb0 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29 22 2c 20  _login() (%i)", 
22cc0 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a 09 09 72  login_ret);....r
22cd0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
22ce0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 63  L_ERROR);..}...c
22cf0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
22d00 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
22d10 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52 5f 50 49  &= ~(CKF_USER_PI
22d20 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b 46 5f 55  N_LOCKED | CKF_U
22d30 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54 5f 4c 4f  SER_PIN_COUNT_LO
22d40 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  W | CKF_LOGIN_RE
22d50 51 55 49 52 45 44 20 7c 20 43 4b 46 5f 55 53 45  QUIRED | CKF_USE
22d60 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54 52 59 29  R_PIN_FINAL_TRY)
22d70 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ;...cackey_sessi
22d80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
22d90 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 55 53 45  ate = CKS_RO_USE
22da0 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a 0a 09 6d  R_FUNCTIONS;...m
22db0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
22dc0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
22dd0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22de0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
22df0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
22e00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22e10 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
22e20 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
22e30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
22e40 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
22e50 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
22e60 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
22e70 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
22e80 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
22e90 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
22ea0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
22eb0 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 6f 75  N(CK_RV, C_Logou
22ec0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
22ed0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b  NDLE hSession) {
22ee0 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  ..CK_SLOT_ID slo
22ef0 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  tID;..int mutex_
22f00 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
22f10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
22f20 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
22f30 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
22f40 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22f50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22f60 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22f70 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22f80 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22f90 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22fa0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
22fb0 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
22fc0 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
22fd0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22fe0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
22ff0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
23000 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23010 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23020 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
23030 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
23040 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
23050 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
23060 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
23070 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
23080 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
23090 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
230a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
230b0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
230c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
230d0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
230e0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
230f0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23100 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
23110 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
23120 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
23130 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
23140 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
23150 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
23160 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23170 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
23180 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
23190 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
231a0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
231b0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
231c0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
231d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
231e0 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
231f0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
23200 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
23210 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
23220 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
23230 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
23240 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23250 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
23260 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
23270 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
23280 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
23290 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
232a0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
232b0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
232c0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
232d0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
232e0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
232f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23300 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
23310 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
23320 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
23330 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
23340 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
23350 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23360 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
23370 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
23380 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
23390 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
233a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
233b0 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42 4c 49 43   = CKS_RO_PUBLIC
233c0 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 61 63 6b 65  _SESSION;..cacke
233d0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
233e0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
233f0 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
23400 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
23410 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
23420 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
23430 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
23440 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
23450 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23460 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23470 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
23480 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23490 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
234a0 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
234b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
234c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
234d0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
234e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
234f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
23500 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
23510 43 72 65 61 74 65 4f 62 6a 65 63 74 29 28 43 4b  CreateObject)(CK
23520 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
23530 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
23540 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
23550 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
23560 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  lCount, CK_OBJEC
23570 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f  T_HANDLE_PTR phO
23580 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59  bject) {..CACKEY
23590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
235a0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
235b0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
235c0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
235d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
235e0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
235f0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
23600 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
23610 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
23620 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
23630 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23640 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
23650 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23660 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
23670 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23680 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
23690 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
236a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
236b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
236c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f 70 79 4f  N(CK_RV, C_CopyO
236d0 62 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f  bject)(CK_SESSIO
236e0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
236f0 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  n, CK_OBJECT_HAN
23700 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f  DLE hObject, CK_
23710 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
23720 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
23730 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
23740 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
23750 70 68 4e 65 77 4f 62 6a 65 63 74 29 20 7b 0a 09  phNewObject) {..
23760 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23770 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
23780 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
23790 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
237a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
237b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
237c0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
237d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
237e0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
237f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
23800 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23810 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
23820 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23830 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
23840 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
23850 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
23860 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
23870 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
23880 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
23890 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
238a0 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63 74 29 28  _DestroyObject)(
238b0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
238c0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
238d0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
238e0 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ject) {..CACKEY_
238f0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23900 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23910 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23920 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23930 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23940 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23950 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23960 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23970 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23980 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
23990 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
239a0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
239b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
239c0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
239d0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
239e0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
239f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23a00 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
23a10 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
23a20 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4f 62 6a  (CK_RV, C_GetObj
23a30 65 63 74 53 69 7a 65 29 28 43 4b 5f 53 45 53 53  ectSize)(CK_SESS
23a40 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
23a50 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
23a60 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43  ANDLE hObject, C
23a70 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
23a80 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ize) {..CACKEY_D
23a90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
23aa0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
23ab0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
23ac0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
23ad0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23ae0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
23af0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
23b00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
23b10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
23b20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
23b30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23b40 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
23b50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
23b60 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
23b70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
23b80 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
23b90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23ba0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
23bb0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
23bc0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41 74 74 72  CK_RV, C_GetAttr
23bd0 69 62 75 74 65 56 61 6c 75 65 29 28 43 4b 5f 53  ibuteValue)(CK_S
23be0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23bf0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
23c00 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
23c10 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
23c20 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
23c30 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 29 20  _ULONG ulCount) 
23c40 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20  {..CK_ATTRIBUTE 
23c50 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 73 74 72  *curr_attr;..str
23c60 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
23c70 69 74 79 20 2a 69 64 65 6e 74 69 74 79 3b 0a 09  ity *identity;..
23c80 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64  unsigned long id
23c90 65 6e 74 69 74 79 5f 69 64 78 2c 20 61 74 74 72  entity_idx, attr
23ca0 5f 69 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f  _idx, sess_attr_
23cb0 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b 0a 09 69  idx, num_ids;..i
23cc0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
23cd0 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d  ..CK_RV retval =
23ce0 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f 56 4f 49   CKR_OK;..CK_VOI
23cf0 44 5f 50 54 52 20 70 56 61 6c 75 65 3b 0a 09 43  D_PTR pValue;..C
23d00 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c 75 65 4c  K_ULONG ulValueL
23d10 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  en;...CACKEY_DEB
23d20 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
23d30 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
23d40 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
23d50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
23d60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23d70 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
23d80 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
23d90 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
23da0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
23db0 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e  }...if (hSession
23dc0 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f   == 0 || hSessio
23dd0 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  n >= (sizeof(cac
23de0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20  key_sessions) / 
23df0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
23e00 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09  ssions[0]))) {..
23e10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23e20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
23e30 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e  ssion out of ran
23e40 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
23e50 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
23e60 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
23e70 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a 65 63 74  .}...if (hObject
23e80 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
23e90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23ea0 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68  Error.  Object h
23eb0 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e  andle out of ran
23ec0 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ge.");......retu
23ed0 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
23ee0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
23ef0 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75 6e 74 20  }...if (ulCount 
23f00 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f  == 0) {.../* Sho
23f10 72 74 20 63 69 72 63 75 69 74 2c 20 69 66 20 7a  rt circuit, if z
23f20 65 72 6f 20 6f 62 6a 65 63 74 73 20 77 65 72 65  ero objects were
23f30 20 73 70 65 63 69 66 69 65 64 20 72 65 74 75 72   specified retur
23f40 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d  n zero items imm
23f50 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09 09 43 41  ediately */...CA
23f60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23f70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
23f80 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
23f90 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
23fa0 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
23fb0 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
23fc0 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20 4e 55 4c  pTemplate == NUL
23fd0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
23fe0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23ff0 72 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  r.  pTemplate is
24000 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
24010 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
24020 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 64 65  S_BAD);..}...ide
24030 6e 74 69 74 79 5f 69 64 78 20 3d 20 68 4f 62 6a  ntity_idx = hObj
24040 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75 74 65 78  ect - 1;...mutex
24050 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24060 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
24070 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
24080 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24090 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
240a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
240b0 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
240c0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
240d0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
240e0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
240f0 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
24100 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
24110 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
24120 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
24130 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
24140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24150 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
24160 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
24170 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
24180 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
24190 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
241a0 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65  .num_ids = cacke
241b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
241c0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
241d0 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28 69 64 65  count;...if (ide
241e0 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20 6e 75 6d  ntity_idx >= num
241f0 5f 69 64 73 29 20 7b 0a 09 09 63 61 63 6b 65 79  _ids) {...cackey
24200 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24210 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24220 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24230 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f  RINTF("Error.  O
24240 62 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74  bject handle out
24250 20 6f 66 20 72 61 6e 67 65 2e 20 20 69 64 65 6e   of range.  iden
24260 74 69 74 79 5f 69 64 78 20 3d 20 25 6c 75 2c 20  tity_idx = %lu, 
24270 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75 2e 22 2c  num_ids = %lu.",
24280 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
24290 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 28   identity_idx, (
242a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6e  unsigned long) n
242b0 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72 65 74 75  um_ids);....retu
242c0 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54 5f 48 41  rn(CKR_OBJECT_HA
242d0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
242e0 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20 3d 20 26  }...identity = &
242f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24300 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
24310 74 69 65 73 5b 69 64 65 6e 74 69 74 79 5f 69 64  ties[identity_id
24320 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74 74 72 5f  x];...for (attr_
24330 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69 64  idx = 0; attr_id
24340 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 61 74 74  x < ulCount; att
24350 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72  r_idx++) {...cur
24360 72 5f 61 74 74 72 20 3d 20 26 70 54 65 6d 70 6c  r_attr = &pTempl
24370 61 74 65 5b 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  ate[attr_idx];..
24380 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
24390 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
243a0 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09  (CK_LONG) -1;...
243b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
243c0 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67 20 66 6f  INTF("Looking fo
243d0 72 20 61 74 74 72 69 62 75 74 65 20 30 78 25 30  r attribute 0x%0
243e0 38 6c 78 20 28 69 64 65 6e 74 69 74 79 3a 25 6c  8lx (identity:%l
243f0 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  u) ...", (unsign
24400 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
24410 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e 73 69 67  tr->type, (unsig
24420 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69  ned long) identi
24430 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66 6f 72 20  ty_idx);....for 
24440 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d  (sess_attr_idx =
24450 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64   0; sess_attr_id
24460 78 20 3c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  x < identity->at
24470 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
24480 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
24490 20 7b 0a 09 09 09 69 66 20 28 69 64 65 6e 74 69   {....if (identi
244a0 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73  ty->attributes[s
244b0 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2e 74 79  ess_attr_idx].ty
244c0 70 65 20 3d 3d 20 63 75 72 72 5f 61 74 74 72 2d  pe == curr_attr-
244d0 3e 74 79 70 65 29 20 7b 0a 09 09 09 09 43 41 43  >type) {.....CAC
244e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
244f0 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20 69 74 2c  (" ... found it,
24500 20 70 56 61 6c 75 65 20 3d 20 25 70 2c 20 75 6c   pValue = %p, ul
24510 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c 75 22 2c  ValueLen = %lu",
24520 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
24530 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
24540 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 69 64 65  idx].pValue, ide
24550 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
24560 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
24570 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
24580 09 09 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  .......pValue = 
24590 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
245a0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
245b0 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09 09 09 09  dx].pValue;.....
245c0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 69 64 65  ulValueLen = ide
245d0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
245e0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
245f0 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  .ulValueLen;....
24600 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 75 72  }...}....if (cur
24610 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 20 26  r_attr->pValue &
24620 26 20 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 69  & pValue) {....i
24630 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c  f (curr_attr->ul
24640 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75 6c 56 61  ValueLen >= ulVa
24650 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 6d 65  lueLen) {.....me
24660 6d 63 70 79 28 63 75 72 72 5f 61 74 74 72 2d 3e  mcpy(curr_attr->
24670 70 56 61 6c 75 65 2c 20 70 56 61 6c 75 65 2c 20  pValue, pValue, 
24680 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09 09  ulValueLen);....
24690 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 75 6c 56  } else {.....ulV
246a0 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
246b0 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09 72 65 74  NG) -1;......ret
246c0 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52  val = CKR_BUFFER
246d0 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d  _TOO_SMALL;....}
246e0 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f 61 74 74  ...}....curr_att
246f0 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  r->ulValueLen = 
24700 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 7d 0a 0a  ulValueLen;..}..
24710 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
24720 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
24730 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
24740 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
24750 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
24760 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24770 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
24780 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
24790 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
247a0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
247b0 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  ..}...if (retval
247c0 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49 42 55 54   == CKR_ATTRIBUT
247d0 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 20  E_TYPE_INVALID) 
247e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
247f0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24800 6e 67 20 43 4b 52 5f 41 54 54 52 49 42 55 54 45  ng CKR_ATTRIBUTE
24810 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 20 28 25  _TYPE_INVALID (%
24820 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  i)", (int) retva
24830 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  l);..} else if (
24840 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 42 55  retval == CKR_BU
24850 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20  FFER_TOO_SMALL) 
24860 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
24870 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
24880 6e 67 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  ng CKR_BUFFER_TO
24890 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22 2c 20 28  O_SMALL (%i)", (
248a0 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
248b0 20 65 6c 73 65 20 69 66 20 28 72 65 74 76 61 6c   else if (retval
248c0 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   == CKR_OK) {...
248d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
248e0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
248f0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 28 69 6e  KR_OK (%i)", (in
24900 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65  t) retval);..} e
24910 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  lse {...CACKEY_D
24920 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
24930 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74  urning %i", (int
24940 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09  ) retval);..}...
24950 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
24960 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
24970 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
24980 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
24990 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
249a0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
249b0 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
249c0 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
249d0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
249e0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
249f0 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f  ount) {..CACKEY_
24a00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24a10 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24a20 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24a30 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24a40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24a50 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24a60 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24a70 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24a80 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24a90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
24aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
24ab0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
24ac0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
24ad0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
24ae0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
24af0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
24b00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
24b10 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
24b20 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
24b30 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62  (CK_RV, C_FindOb
24b40 6a 65 63 74 73 49 6e 69 74 29 28 43 4b 5f 53 45  jectsInit)(CK_SE
24b50 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
24b60 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54 52 49 42  ssion, CK_ATTRIB
24b70 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
24b80 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f  e, CK_ULONG ulCo
24b90 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  unt) {..CK_SLOT_
24ba0 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 55  ID slotID;..CK_U
24bb0 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d  LONG idx;..int m
24bc0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
24bd0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24be0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
24bf0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
24c00 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
24c10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24c20 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
24c30 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
24c40 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
24c50 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
24c60 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
24c70 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
24c80 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
24c90 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
24ca0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
24cb0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24cc0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
24cd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24ce0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
24cf0 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
24d00 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
24d10 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
24d20 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
24d30 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24d40 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
24d50 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24d60 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24d70 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
24d80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24d90 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
24da0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
24db0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
24dc0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
24dd0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
24de0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
24df0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
24e00 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24e10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24e20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24e30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
24e40 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
24e50 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
24e60 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
24e70 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
24e80 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
24e90 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
24ea0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
24eb0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
24ec0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
24ed0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
24ee0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24ef0 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
24f00 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
24f10 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
24f20 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
24f30 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  TIVE);..}...slot
24f40 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
24f50 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24f60 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
24f70 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
24f80 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
24f90 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
24fa0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
24fb0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
24fc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24fd0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
24fe0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
24ff0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
25000 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
25010 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
25020 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
25030 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
25040 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
25050 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
25060 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
25070 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25080 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
25090 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
250a0 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
250b0 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
250c0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
250d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
250e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
250f0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
25100 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
25110 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
25120 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72 65 73 65  lotID].slot_rese
25130 74 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  t) {...CACKEY_DE
25140 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 65 20  BUG_PRINTF("The 
25150 73 6c 6f 74 20 68 61 73 20 62 65 65 6e 20 72 65  slot has been re
25160 73 65 74 20 73 69 6e 63 65 20 77 65 20 6c 61 73  set since we las
25170 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20 69 64 65  t looked for ide
25180 6e 74 69 74 69 65 73 20 2d 2d 20 72 65 73 63 61  ntities -- resca
25190 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69 66 20 28  nning");....if (
251a0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
251b0 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
251c0 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  ties != NULL) {.
251d0 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 69  ...cackey_free_i
251e0 64 65 6e 74 69 74 69 65 73 28 63 61 63 6b 65 79  dentities(cackey
251f0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25200 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 2c 20  on].identities, 
25210 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25220 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
25230 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
25240 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25250 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
25260 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ities = NULL;...
25270 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
25280 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
25290 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 20 30 3b  ities_count = 0;
252a0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b  ...}....if (cack
252b0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
252c0 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  .label != NULL) 
252d0 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
252e0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
252f0 61 62 65 6c 29 3b 0a 09 09 09 63 61 63 6b 65 79  abel);....cackey
25300 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
25310 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d  abel = NULL;...}
25320 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
25330 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b  slot_reset(&cack
25340 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
25350 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  );...cackey_slot
25360 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
25370 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  eset = 0;..}...i
25380 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
25390 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
253a0 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29  ntities == NULL)
253b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73   {...cackey_sess
253c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
253d0 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63 6b  dentities = cack
253e0 65 79 5f 72 65 61 64 5f 69 64 65 6e 74 69 74 69  ey_read_identiti
253f0 65 73 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73  es(&cackey_slots
25400 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61 63 6b 65  [slotID], &cacke
25410 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25420 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
25430 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  count);..}...if 
25440 28 70 54 65 6d 70 6c 61 74 65 20 21 3d 20 4e 55  (pTemplate != NU
25450 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75 6c 43 6f  LL) {...if (ulCo
25460 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09 09 09 63  unt != 0) {....c
25470 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25480 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
25490 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 75 6c  query_count = ul
254a0 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63 6b 65 79  Count;....cackey
254b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
254c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
254d0 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43 6f 75 6e   = malloc(ulCoun
254e0 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
254f0 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09 6d 65 6d  plate));.....mem
25500 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73 73 69  cpy(cackey_sessi
25510 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
25520 61 72 63 68 5f 71 75 65 72 79 2c 20 70 54 65 6d  arch_query, pTem
25530 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e 74 20 2a  plate, ulCount *
25540 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d 70 6c 61   sizeof(*pTempla
25550 74 65 29 29 3b 0a 09 09 09 66 6f 72 20 28 69 64  te));....for (id
25560 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 75 6c 43  x = 0; idx < ulC
25570 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
25580 09 09 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
25590 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e  [idx].ulValueLen
255a0 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 09 63 61   == 0) {......ca
255b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
255c0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
255d0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
255e0 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 09 63   = NULL;.......c
255f0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a  ontinue;.....}..
25600 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
25610 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
25620 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
25630 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28  pValue = malloc(
25640 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75  pTemplate[idx].u
25650 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
25660 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73  .if (cackey_sess
25670 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25680 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d  earch_query[idx]
25690 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  .pValue) {......
256a0 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
256b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
256c0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
256d0 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54 65 6d 70  x].pValue, pTemp
256e0 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61 6c 75 65  late[idx].pValue
256f0 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d  , pTemplate[idx]
25700 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 09 09  .ulValueLen);...
25710 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73  ..}....}...} els
25720 65 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  e {....cackey_se
25730 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25740 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
25750 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63 61 63 6b  unt = 0;....cack
25760 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
25770 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65  sion].search_que
25780 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09  ry = NULL;...}..
25790 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 75  } else {...if (u
257a0 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
257b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
257c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
257d0 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41 43 4b 45  lock);.....CACKE
257e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
257f0 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 71  Error.  Search q
25800 75 65 72 79 20 73 70 65 63 69 66 69 65 64 20 61  uery specified a
25810 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e 75 6d 62  s NULL, but numb
25820 65 72 20 6f 66 20 71 75 65 72 79 20 74 65 72 6d  er of query term
25830 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  s not specified 
25840 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09 72 65 74  as 0.");.....ret
25850 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
25860 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a 09 09 63  S_BAD);...}....c
25870 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25880 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
25890 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b  query_count = 0;
258a0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
258b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
258c0 72 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c  rch_query = NULL
258d0 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
258e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
258f0 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
25900 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   1;..cackey_sess
25910 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25920 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20  earch_curr_id = 
25930 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  0;...mutex_retva
25940 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
25950 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
25960 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
25970 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
25980 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
25990 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
259a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
259b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
259c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
259d0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
259e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
259f0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
25a00 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
25a10 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
25a20 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
25a30 63 61 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f  cackey_pkcs11_co
25a40 6d 70 61 72 65 5f 61 74 74 72 69 62 75 74 65 73  mpare_attributes
25a50 28 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61  (CK_ATTRIBUTE *a
25a60 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  , CK_ATTRIBUTE *
25a70 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63  b) {..unsigned c
25a80 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66 2c 20 2a  har *smallbuf, *
25a90 6c 61 72 67 65 62 75 66 3b 0a 09 73 69 7a 65 5f  largebuf;..size_
25aa0 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 2c 20  t smallbuf_len, 
25ab0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b 0a 0a 09  largebuf_len;...
25ac0 69 66 20 28 61 2d 3e 74 79 70 65 20 21 3d 20 62  if (a->type != b
25ad0 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72 65 74 75  ->type) {...retu
25ae0 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  rn(0);..}...CACK
25af0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25b00 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20 6d  "    ... found m
25b10 61 74 63 68 69 6e 67 20 74 79 70 65 20 2e 2e 2e  atching type ...
25b20 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
25b30 55 47 5f 50 52 49 4e 54 42 55 46 28 22 20 20 20  UG_PRINTBUF("   
25b40 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75 65 3a 22   ... our value:"
25b50 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20 61 2d 3e  , a->pValue, a->
25b60 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 69  ulValueLen);...i
25b70 66 20 28 62 2d 3e 70 56 61 6c 75 65 20 3d 3d 20  f (b->pValue == 
25b80 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
25b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
25ba0 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75 6e 64 20        ... found 
25bb0 77 69 6c 64 63 61 72 64 20 6d 61 74 63 68 22 29  wildcard match")
25bc0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
25bd0 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70 56 61 6c  .}...if (a->pVal
25be0 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ue == NULL) {...
25bf0 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 20  return(0);..}.. 
25c00 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c 75 65 4c  .if (b->ulValueL
25c10 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61 6c 75 65  en == a->ulValue
25c20 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70 28 61 2d  Len && memcmp(a-
25c30 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70 56 61 6c  >pValue, b->pVal
25c40 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65  ue, b->ulValueLe
25c50 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  n) == 0) {...CAC
25c60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25c70 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
25c80 6e 64 20 65 78 61 63 74 20 6d 61 74 63 68 22 29  nd exact match")
25c90 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  ;....return(1);.
25ca0 09 7d 0a 0a 09 73 77 69 74 63 68 20 28 61 2d 3e  .}...switch (a->
25cb0 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65 20 43  type) {...case C
25cc0 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09 09 09 69  KA_MODULUS:....i
25cd0 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  f (a->ulValueLen
25ce0 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65   == b->ulValueLe
25cf0 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n) {.....break;.
25d00 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 61 2d 3e  ...}.....if (a->
25d10 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20 62 2d 3e  ulValueLen > b->
25d20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
25d30 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20 62 2d 3e  ..smallbuf = b->
25d40 70 56 61 6c 75 65 3b 0a 09 09 09 09 73 6d 61 6c  pValue;.....smal
25d50 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e 75 6c  lbuf_len = b->ul
25d60 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09 09 09 6c  ValueLen;......l
25d70 61 72 67 65 62 75 66 20 3d 20 61 2d 3e 70 56 61  argebuf = a->pVa
25d80 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67 65 62 75  lue;.....largebu
25d90 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c  f_len = a->ulVal
25da0 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65 6c 73 65  ueLen;....} else
25db0 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20   {.....smallbuf 
25dc0 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = a->pValue;....
25dd0 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20  .smallbuf_len = 
25de0 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a  a->ulValueLen;..
25df0 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 62  ....largebuf = b
25e00 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61  ->pValue;.....la
25e10 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 62 2d 3e  rgebuf_len = b->
25e20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d  ulValueLen;....}
25e30 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c 61 72 67  .....for (; larg
25e40 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c  ebuf_len != smal
25e50 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72 67 65 62  lbuf_len; largeb
25e60 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66 5f 6c 65  uf++,largebuf_le
25e70 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66 20 28 6c  n--) {.....if (l
25e80 61 72 67 65 62 75 66 5b 30 5d 20 21 3d 20 30 29  argebuf[0] != 0)
25e90 20 7b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09   {......break;..
25ea0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66  ...}....}.....if
25eb0 20 28 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21   (largebuf_len !
25ec0 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 29 20  = smallbuf_len) 
25ed0 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  {.....break;....
25ee0 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d 63 6d 70  }.....if (memcmp
25ef0 28 6c 61 72 67 65 62 75 66 2c 20 73 6d 61 6c 6c  (largebuf, small
25f00 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  buf, smallbuf_le
25f10 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09 43  n) == 0) {.....C
25f20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25f30 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66  TF("       ... f
25f40 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d 61 74 65  ound approximate
25f50 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09 09 09 72   match");......r
25f60 65 74 75 72 6e 28 31 29 3b 0a 09 09 09 7d 0a 0a  eturn(1);....}..
25f70 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 72  ...break;..}...r
25f80 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 43 4b 5f  eturn(0);.}..CK_
25f90 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
25fa0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
25fb0 65 63 74 73 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ects)(CK_SESSION
25fc0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
25fd0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
25fe0 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65 63 74 2c  LE_PTR phObject,
25ff0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d 61 78 4f   CK_ULONG ulMaxO
26000 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43 4b 5f 55  bjectCount, CK_U
26010 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 62 6a 65  LONG_PTR pulObje
26020 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75  ctCount) {..stru
26030 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
26040 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a 09 43 4b  ty *curr_id;..CK
26050 5f 41 54 54 52 49 42 55 54 45 20 2a 63 75 72 72  _ATTRIBUTE *curr
26060 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c 4f 4e 47  _attr;..CK_ULONG
26070 20 63 75 72 72 5f 69 64 5f 69 64 78 2c 20 63 75   curr_id_idx, cu
26080 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2c 20 63  rr_out_id_idx, c
26090 75 72 72 5f 61 74 74 72 5f 69 64 78 2c 20 73 65  urr_attr_idx, se
260a0 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a 09 43 4b  ss_attr_idx;..CK
260b0 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65 64 5f 63  _ULONG matched_c
260c0 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61 74 63 68  ount, prev_match
260d0 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e 74 20 6d  ed_count;..int m
260e0 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 23 69 66  utex_retval;.#if
260f0 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
26100 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
26110 54 0a 09 73 74 72 75 63 74 20 74 69 6d 65 76 61  T..struct timeva
26120 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b 0a 09 75  l start, end;..u
26130 69 6e 74 36 34 5f 74 20 73 74 61 72 74 5f 69 6e  int64_t start_in
26140 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23 65 6e 64  t, end_int;.#end
26150 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
26160 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
26170 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
26180 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
26190 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
261a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
261b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
261c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
261d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
261e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
261f0 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a 65 63 74  ...if (pulObject
26200 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Count == NULL) {
26210 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26220 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26230 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 69  pulObjectCount i
26240 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
26250 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
26260 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
26270 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
26280 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65 63  LL && ulMaxObjec
26290 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09  tCount == 0) {..
262a0 09 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69  ./* Short circui
262b0 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63  t, if zero objec
262c0 74 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65  ts were specifie
262d0 64 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74  d return zero it
262e0 65 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ems immediately 
262f0 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65 63 74 43  */...*pulObjectC
26300 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 43 41 43  ount = 0;....CAC
26310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26320 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26330 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20 63  OK (%i) (short c
26340 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b  ircuit)", CKR_OK
26350 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26360 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  _OK);..}...if (p
26370 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29  hObject == NULL)
26380 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26390 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
263a0 20 20 70 68 4f 62 6a 65 63 74 20 69 73 20 4e 55    phObject is NU
263b0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
263c0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
263d0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  AD);..}...if (ul
263e0 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  MaxObjectCount =
263f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
26400 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
26410 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d 20 6e 75  ror.  Maximum nu
26420 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
26430 73 70 65 63 69 66 69 65 64 20 61 73 20 7a 65 72  specified as zer
26440 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  o.");....return(
26450 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
26460 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
26470 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
26480 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
26490 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
264a0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
264b0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
264c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
264d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
264e0 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
264f0 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
26500 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
26510 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
26520 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
26530 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
26540 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
26550 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
26560 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
26570 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
26580 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26590 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
265a0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
265b0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
265c0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  ROR);..}...if (!
265d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
265e0 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65  hSession].active
265f0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
26600 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
26610 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
26620 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26630 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
26640 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
26650 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
26660 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
26670 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
26680 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
26690 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
266a0 65 61 72 63 68 5f 61 63 74 69 76 65 29 20 7b 0a  earch_active) {.
266b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
266c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
266d0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
266e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
266f0 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20 6e 6f  rror.  Search no
26700 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
26710 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
26720 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
26730 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 23 69 66  ALIZED);..}..#if
26740 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
26750 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
26760 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28  T..gettimeofday(
26770 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29 3b 0a 23  &start, NULL);.#
26780 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f 6f 75 74  endif...curr_out
26790 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f  _id_idx = 0;..fo
267a0 72 20 28 63 75 72 72 5f 69 64 5f 69 64 78 20 3d  r (curr_id_idx =
267b0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
267c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
267d0 68 5f 63 75 72 72 5f 69 64 3b 20 63 75 72 72 5f  h_curr_id; curr_
267e0 69 64 5f 69 64 78 20 3c 20 63 61 63 6b 65 79 5f  id_idx < cackey_
267f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
26800 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  n].identities_co
26810 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f 62 6a 65  unt && ulMaxObje
26820 63 74 43 6f 75 6e 74 3b 20 63 75 72 72 5f 69 64  ctCount; curr_id
26830 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63 75 72 72  _idx++) {...curr
26840 5f 69 64 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  _id = &cackey_se
26850 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26860 2e 69 64 65 6e 74 69 74 69 65 73 5b 63 75 72 72  .identities[curr
26870 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09 43 41 43  _id_idx];....CAC
26880 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26890 28 22 50 72 6f 63 65 73 73 69 6e 67 20 69 64 65  ("Processing ide
268a0 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28 75 6e 73  ntity:%lu", (uns
268b0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
268c0 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09 6d 61 74  _id_idx);....mat
268d0 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  ched_count = 0;.
268e0 0a 09 09 66 6f 72 20 28 63 75 72 72 5f 61 74 74  ...for (curr_att
268f0 72 5f 69 64 78 20 3d 20 30 3b 20 63 75 72 72 5f  r_idx = 0; curr_
26900 61 74 74 72 5f 69 64 78 20 3c 20 63 61 63 6b 65  attr_idx < cacke
26910 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
26920 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
26930 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72 5f 61 74  y_count; curr_at
26940 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 70  tr_idx++) {....p
26950 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
26960 74 20 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e  t = matched_coun
26970 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72  t;.....curr_attr
26980 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
26990 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
269a0 61 72 63 68 5f 71 75 65 72 79 5b 63 75 72 72 5f  arch_query[curr_
269b0 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09 09 09 43  attr_idx];.....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 43 68 65 63 6b 69 6e 67 20 66  TF("  Checking f
269e0 6f 72 20 61 74 74 72 69 62 75 74 65 20 25 73 20  or attribute %s 
269f0 28 30 78 25 30 38 6c 78 29 20 69 6e 20 69 64 65  (0x%08lx) in ide
26a00 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c 20 43 41  ntity:%i...", CA
26a10 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
26a20 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54 52  ATTRIBUTE_TO_STR
26a30 28 63 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65  (curr_attr->type
26a40 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
26a50 67 29 20 63 75 72 72 5f 61 74 74 72 2d 3e 74 79  g) curr_attr->ty
26a60 70 65 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  pe, (int) curr_i
26a70 64 5f 69 64 78 29 3b 0a 09 09 09 43 41 43 4b 45  d_idx);....CACKE
26a80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
26a90 28 22 20 20 20 20 56 61 6c 75 65 20 6c 6f 6f 6b  ("    Value look
26aa0 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75 72 72 5f  ing for:", curr_
26ab0 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 63 75  attr->pValue, cu
26ac0 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
26ad0 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72 20 28 73  Len);.....for (s
26ae0 65 73 73 5f 61 74 74 72 5f 69 64 78 20 3d 20 30  ess_attr_idx = 0
26af0 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20  ; sess_attr_idx 
26b00 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69  < curr_id->attri
26b10 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20 73 65 73  butes_count; ses
26b20 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  s_attr_idx++) {.
26b30 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 70  ....if (cackey_p
26b40 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74  kcs11_compare_at
26b50 74 72 69 62 75 74 65 73 28 26 63 75 72 72 5f 69  tributes(&curr_i
26b60 64 2d 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65  d->attributes[se
26b70 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c 20 63 75  ss_attr_idx], cu
26b80 72 72 5f 61 74 74 72 29 29 20 7b 0a 09 09 09 09  rr_attr)) {.....
26b90 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 2b 2b  .matched_count++
26ba0 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
26bb0 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  ...}....}...../*
26bc0 20 49 66 20 74 68 65 20 61 74 74 72 69 62 75 74   If the attribut
26bd0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6d  e could not be m
26be0 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f 74 20 74  atched, do not t
26bf0 72 79 20 74 6f 20 6d 61 74 63 68 20 61 64 64 69  ry to match addi
26c00 74 69 6f 6e 61 6c 20 61 74 74 72 69 62 75 74 65  tional attribute
26c10 73 20 2a 2f 0a 09 09 09 69 66 20 28 70 72 65 76  s */....if (prev
26c20 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  _matched_count =
26c30 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 29  = matched_count)
26c40 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09   {.....break;...
26c50 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6d 61  .}...}....if (ma
26c60 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 3d 20 63  tched_count == c
26c70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
26c80 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
26c90 71 75 65 72 79 5f 63 6f 75 6e 74 29 20 7b 0a 09  query_count) {..
26ca0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26cb0 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 41 6c 6c  RINTF("  ... All
26cc0 20 25 69 20 61 74 74 72 69 62 75 74 65 73 20 63   %i attributes c
26cd0 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
26ce0 2c 20 61 64 64 69 6e 67 20 69 64 65 6e 74 69 74  , adding identit
26cf0 79 3a 25 69 20 74 6f 20 72 65 74 75 72 6e 65 64  y:%i to returned
26d00 20 6c 69 73 74 22 2c 20 28 69 6e 74 29 20 63 61   list", (int) ca
26d10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26d20 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
26d30 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28 69 6e 74  uery_count, (int
26d40 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a  ) curr_id_idx);.
26d50 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b 63 75 72  ....phObject[cur
26d60 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d 20 3d 20  r_out_id_idx] = 
26d70 63 75 72 72 5f 69 64 5f 69 64 78 20 2b 20 31 3b  curr_id_idx + 1;
26d80 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a 65 63 74  .....ulMaxObject
26d90 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09 63 75 72  Count--;.....cur
26da0 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b 2b 3b 0a  r_out_id_idx++;.
26db0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43 41  ..} else {....CA
26dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26dd0 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20 61 6c 6c  F("  ... Not all
26de0 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75 6e 64 20   %i (only found 
26df0 25 69 29 20 61 74 74 72 69 62 75 74 65 73 20 63  %i) attributes c
26e00 68 65 63 6b 65 64 20 66 6f 72 20 66 6f 75 6e 64  hecked for found
26e10 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20 69 64 65  , not adding ide
26e20 6e 74 69 74 79 3a 25 69 22 2c 20 28 69 6e 74 29  ntity:%i", (int)
26e30 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
26e40 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
26e50 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
26e60 69 6e 74 29 20 6d 61 74 63 68 65 64 5f 63 6f 75  int) matched_cou
26e70 6e 74 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69  nt, (int) curr_i
26e80 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09 7d 0a 09  d_idx);...}..}..
26e90 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
26ea0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
26eb0 5f 63 75 72 72 5f 69 64 20 3d 20 63 75 72 72 5f  _curr_id = curr_
26ec0 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c 4f 62 6a  id_idx;..*pulObj
26ed0 65 63 74 43 6f 75 6e 74 20 3d 20 63 75 72 72 5f  ectCount = curr_
26ee0 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a 23 69 66  out_id_idx;..#if
26ef0 64 65 66 20 43 41 43 4b 45 59 5f 44 45 42 55 47  def CACKEY_DEBUG
26f00 5f 53 45 41 52 43 48 5f 53 50 45 45 44 54 45 53  _SEARCH_SPEEDTES
26f10 54 0a 09 67 65 74 74 69 6d 65 6f 66 64 61 79 28  T..gettimeofday(
26f20 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a 09 73 74  &end, NULL);..st
26f30 61 72 74 5f 69 6e 74 20 3d 20 28 73 74 61 72 74  art_int = (start
26f40 2e 74 76 5f 73 65 63 20 2a 20 31 30 30 30 30 30  .tv_sec * 100000
26f50 30 29 20 2b 20 73 74 61 72 74 2e 74 76 5f 75 73  0) + start.tv_us
26f60 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20 3d 20 28  ec;..end_int = (
26f70 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20 31 30 30  end.tv_sec * 100
26f80 30 30 30 30 29 20 2b 20 65 6e 64 2e 74 76 5f 75  0000) + end.tv_u
26f90 73 65 63 3b 0a 09 66 70 72 69 6e 74 66 28 73 74  sec;..fprintf(st
26fa0 64 65 72 72 2c 20 22 53 65 61 72 63 68 20 74 6f  derr, "Search to
26fb0 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73 65 63 6f  ok %lu microseco
26fc0 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69 67 6e 65  nds\n", (unsigne
26fd0 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f 69 6e 74  d long) (end_int
26fe0 20 2d 20 73 74 61 72 74 5f 69 6e 74 29 29 3b 0a   - start_int));.
26ff0 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65 78 5f 72  #endif...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 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
27020 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
27030 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
27040 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
27050 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27060 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
27070 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
27080 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
27090 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
270a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
270b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
270c0 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d 20 6f 62  _OK (%i), num ob
270d0 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c 20 43 4b  jects = %lu", CK
270e0 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a 65 63 74  R_OK, *pulObject
270f0 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e  Count);...return
27100 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
27110 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
27120 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64 4f 62 6a  CK_RV, C_FindObj
27130 65 63 74 73 46 69 6e 61 6c 29 28 43 4b 5f 53 45  ectsFinal)(CK_SE
27140 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27150 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f 55 4c 4f  ssion) {..CK_ULO
27160 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  NG idx;..int mut
27170 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
27180 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27190 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
271a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
271b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
271c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
271d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
271e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
271f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27200 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27210 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
27220 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
27230 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
27240 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
27250 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
27260 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
27270 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
27280 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
27290 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
272a0 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
272b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
272c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
272d0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
272e0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
272f0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
27300 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
27310 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
27320 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
27330 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27340 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
27350 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
27360 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
27370 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
27380 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
27390 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
273a0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
273b0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
273c0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
273d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
273e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
273f0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
27400 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
27410 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
27420 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
27430 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
27440 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27450 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29 20  .search_active) 
27460 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
27470 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
27480 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
27490 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
274a0 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68 20  "Error.  Search 
274b0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
274c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
274d0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
274e0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
274f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27500 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
27510 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 66  _active = 0;...f
27520 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
27530 20 3c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   < cackey_sessio
27540 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
27550 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b  rch_query_count;
27560 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
27570 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27580 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
27590 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c  _query[idx].pVal
275a0 75 65 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  ue) {....free(ca
275b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
275c0 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
275d0 75 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65  uery[idx].pValue
275e0 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  );...}..}...if (
275f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27600 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
27610 5f 71 75 65 72 79 29 20 7b 0a 09 09 66 72 65 65  _query) {...free
27620 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27630 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
27640 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a 0a 09 6d  h_query);..}...m
27650 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
27660 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
27670 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
27680 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
27690 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
276a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
276b0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
276c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
276d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
276e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
276f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
27700 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
27710 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
27720 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
27730 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
27740 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
27750 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79  N(CK_RV, C_Encry
27760 70 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  ptInit)(CK_SESSI
27770 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
27780 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
27790 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c  _PTR pMechanism,
277a0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
277b0 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45  E hKey) {..CACKE
277c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
277d0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
277e0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
277f0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
27800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27810 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
27820 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
27830 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
27840 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
27850 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
27860 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
27870 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
27880 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27890 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
278a0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
278b0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
278c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
278d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
278e0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
278f0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72  ON(CK_RV, C_Encr
27900 79 70 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ypt)(CK_SESSION_
27910 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
27920 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
27930 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
27940 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
27950 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61  PTR pEncryptedDa
27960 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  ta, CK_ULONG_PTR
27970 20 70 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74   pulEncryptedDat
27980 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  aLen) {..CACKEY_
27990 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
279a0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
279b0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
279c0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
279d0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
279e0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
279f0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
27a00 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
27a10 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
27a20 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
27a30 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
27a40 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
27a50 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
27a60 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
27a70 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27a80 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
27a90 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27aa0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
27ab0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
27ac0 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63 72 79 70  (CK_RV, C_Encryp
27ad0 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
27ae0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
27af0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
27b00 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
27b10 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
27b20 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
27b30 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
27b40 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
27b50 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
27b60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27b70 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
27b80 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
27b90 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
27ba0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27bb0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
27bc0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
27bd0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
27be0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
27bf0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
27c00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27c10 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
27c20 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
27c30 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
27c40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
27c50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
27c60 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
27c70 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
27c80 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
27c90 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
27ca0 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53  cryptFinal)(CK_S
27cb0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
27cc0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
27cd0 50 54 52 20 70 4c 61 73 74 45 6e 63 72 79 70 74  PTR pLastEncrypt
27ce0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
27cf0 5f 50 54 52 20 70 75 6c 4c 61 73 74 45 6e 63 72  _PTR pulLastEncr
27d00 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
27d10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27d20 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
27d30 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
27d40 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
27d50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27d60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
27d70 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
27d80 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
27d90 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
27da0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
27db0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27dc0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
27dd0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
27de0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
27df0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
27e00 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
27e10 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
27e20 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
27e30 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
27e40 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
27e50 43 5f 44 65 63 72 79 70 74 49 6e 69 74 29 28 43  C_DecryptInit)(C
27e60 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27e70 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
27e80 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
27e90 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
27ea0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
27eb0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
27ec0 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
27ed0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27ee0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
27ef0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
27f00 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
27f10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27f20 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
27f30 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
27f40 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27f50 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27f60 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
27f70 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
27f80 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
27f90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27fa0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
27fb0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
27fc0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
27fd0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
27fe0 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
27ff0 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
28000 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
28010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28020 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
28030 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
28040 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
28050 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29  s CKM_RSA_PKCS")
28060 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28070 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f  MECHANISM_PARAM_
28080 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
28090 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
280a0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
280b0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
280c0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
280d0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
280e0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
280f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28100 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
28110 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
28120 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
28130 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
28140 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
28150 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
28160 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
28170 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28180 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
28190 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
281a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
281b0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
281c0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
281d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
281e0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
281f0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
28200 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
28210 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
28220 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
28230 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
28240 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
28250 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28260 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
28270 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
28280 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
28290 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
282a0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
282b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
282c0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
282d0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
282e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
282f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
28300 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28310 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63  NTF("Error.  Dec
28320 72 79 70 74 20 61 6c 72 65 61 64 79 20 69 6e 20  rypt already in 
28330 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a  progress.");....
28340 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
28350 52 41 54 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a  RATION_ACTIVE);.
28360 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d  .}...if (hKey >=
28370 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
28380 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
28390 69 74 69 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09  ities_count) {..
283a0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
283b0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
283c0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
283d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
283e0 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65  ror.  Key handle
283f0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 28 72   out of range (r
28400 65 71 75 65 73 74 65 64 20 6b 65 79 20 25 6c 75  equested key %lu
28410 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74  , only %lu ident
28420 69 74 69 65 73 20 61 76 61 69 6c 61 62 6c 65 29  ities available)
28430 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
28440 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e 73 69 67  ng) hKey, (unsig
28450 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79  ned long) cackey
28460 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
28470 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
28480 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ount);....return
28490 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f  (CKR_KEY_HANDLE_
284a0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63  INVALID);..}...c
284b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
284c0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
284d0 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 09 63  _active = 1;...c
284e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
284f0 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
28500 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d 65  _mechanism = pMe
28510 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69  chanism->mechani
28520 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  sm;..cackey_sess
28530 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
28540 65 63 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d  ecrypt_mech_parm
28550 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 70   = pMechanism->p
28560 50 61 72 61 6d 65 74 65 72 3b 0a 09 63 61 63 6b  Parameter;..cack
28570 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28580 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65  sion].decrypt_me
28590 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20 70 4d 65  ch_parmlen = pMe
285a0 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61 72 61 6d  chanism->ulParam
285b0 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63 6b 65 79  eterLen;..cackey
285c0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
285d0 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e  on].decrypt_iden
285e0 74 69 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73  tity = &cackey_s
285f0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28600 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65  ].identities[hKe
28610 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y];...mutex_retv
28620 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
28630 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28640 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
28650 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
28660 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28670 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28680 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
28690 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
286a0 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
286b0 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
286c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
286d0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
286e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
286f0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
28700 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
28710 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
28720 43 5f 44 65 63 72 79 70 74 29 28 43 4b 5f 53 45  C_Decrypt)(CK_SE
28730 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
28740 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
28750 54 52 20 70 45 6e 63 72 79 70 74 65 64 44 61 74  TR pEncryptedDat
28760 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e  a, CK_ULONG ulEn
28770 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
28780 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
28790 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
287a0 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
287b0 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c 65 6e 5f  K_ULONG datalen_
287c0 75 70 64 61 74 65 2c 20 64 61 74 61 6c 65 6e 5f  update, datalen_
287d0 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56 20 64 65  final;..CK_RV de
287e0 63 72 79 70 74 5f 72 65 74 3b 0a 09 69 6e 74 20  crypt_ret;..int 
287f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
28800 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28810 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
28820 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
28830 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
28840 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28850 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
28860 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
28870 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
28880 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
28890 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
288a0 20 28 70 75 6c 44 61 74 61 4c 65 6e 20 3d 3d 20   (pulDataLen == 
288b0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
288c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
288d0 72 72 6f 72 2e 20 70 75 6c 44 61 74 61 4c 65 6e  rror. pulDataLen
288e0 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
288f0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
28900 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
28910 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 3d  datalen_update =
28920 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b 0a 0a 09   *pulDataLen;...
28930 64 65 63 72 79 70 74 5f 72 65 74 20 3d 20 43 5f  decrypt_ret = C_
28940 44 65 63 72 79 70 74 55 70 64 61 74 65 28 68 53  DecryptUpdate(hS
28950 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72 79 70 74  ession, pEncrypt
28960 65 64 44 61 74 61 2c 20 75 6c 45 6e 63 72 79 70  edData, ulEncryp
28970 74 65 64 44 61 74 61 4c 65 6e 2c 20 70 44 61 74  tedDataLen, pDat
28980 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75 70 64 61  a, &datalen_upda
28990 74 65 29 3b 0a 09 69 66 20 28 64 65 63 72 79 70  te);..if (decryp
289a0 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29  t_ret != CKR_OK)
289b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
289c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
289d0 20 20 44 65 63 72 79 70 74 55 70 64 61 74 65 28    DecryptUpdate(
289e0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
289f0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
28a00 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
28a10 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
28a20 09 09 69 66 20 28 64 65 63 72 79 70 74 5f 72 65  ..if (decrypt_re
28a30 74 20 21 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  t != CKR_BUFFER_
28a40 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a 09 09 09  TOO_SMALL) {....
28a50 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20 64 65 63  /* Terminate dec
28a60 72 79 70 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ryption operatio
28a70 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65 78 5f 72  n */.....mutex_r
28a80 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
28a90 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
28aa0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
28ab0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28ac0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
28ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28ae0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
28af0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
28b00 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28b10 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
28b20 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
28b30 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28b40 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  n].active) {....
28b50 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
28b60 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28b70 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
28b80 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28b90 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
28ba0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
28bb0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28bc0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
28bd0 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a  INVALID);....}..
28be0 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
28bf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28c00 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65  ].decrypt_active
28c10 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
28c20 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28c30 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
28c40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28c50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 44  RINTF("Error.  D
28c60 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69 76  ecrypt not activ
28c70 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74  e.");........ret
28c80 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
28c90 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  N_NOT_INITIALIZE
28ca0 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63  D);....}.....cac
28cb0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28cc0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
28cd0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 6d  ctive = 0;.....m
28ce0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
28cf0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
28d00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
28d10 29 3b 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f  );....if (mutex_
28d20 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
28d30 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28d40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28d50 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
28d60 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e  .");......return
28d70 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
28d80 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  OR);....}...}...
28d90 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74 5f  .return(decrypt_
28da0 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ret);..}...if (p
28db0 44 61 74 61 29 20 7b 0a 09 09 70 44 61 74 61 20  Data) {...pData 
28dc0 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  += datalen_updat
28dd0 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65 6e 5f 66  e;..}..datalen_f
28de0 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61 74 61 4c  inal = *pulDataL
28df0 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f 75 70 64  en - datalen_upd
28e00 61 74 65 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72  ate;...decrypt_r
28e10 65 74 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69  et = C_DecryptFi
28e20 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 44  nal(hSession, pD
28e30 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 66 69  ata, &datalen_fi
28e40 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65 63 72 79  nal);..if (decry
28e50 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b  pt_ret != CKR_OK
28e60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28e70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28e80 2e 20 20 44 65 63 72 79 70 74 46 69 6e 61 6c 28  .  DecryptFinal(
28e90 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
28ea0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
28eb0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
28ec0 20 64 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 0a   decrypt_ret);..
28ed0 09 09 72 65 74 75 72 6e 28 64 65 63 72 79 70 74  ..return(decrypt
28ee0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a 70 75 6c  _ret);..}...*pul
28ef0 44 61 74 61 4c 65 6e 20 3d 20 64 61 74 61 6c 65  DataLen = datale
28f00 6e 5f 75 70 64 61 74 65 20 2b 20 64 61 74 61 6c  n_update + datal
28f10 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43 41 43 4b  en_final;...CACK
28f20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28f30 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
28f40 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
28f50 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
28f60 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
28f70 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
28f80 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
28f90 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
28fa0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
28fb0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
28fc0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
28fd0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
28fe0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
28ff0 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
29000 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
29010 6e 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  n) {..static CK_
29020 42 59 54 45 20 62 75 66 5b 31 36 33 38 34 5d 3b  BYTE buf[16384];
29030 0a 09 73 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e  ..ssize_t buflen
29040 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ;..CK_SLOT_ID sl
29050 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74  otID;..CK_RV ret
29060 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
29070 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 6d 75  L_ERROR;..int mu
29080 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
29090 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
290a0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
290b0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
290c0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
290d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
290e0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
290f0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
29100 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
29110 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
29120 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
29130 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
29140 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
29150 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
29160 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
29170 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
29180 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
29190 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
291a0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
291b0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
291c0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
291d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
291e0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  VALID);..}...if 
291f0 28 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20  (pEncryptedPart 
29200 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 45 6e 63  == NULL && ulEnc
29210 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20 3d 3d  ryptedPartLen ==
29220 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
29230 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61   circuit if we a
29240 72 65 20 61 73 6b 65 64 20 74 6f 20 64 65 63 72  re asked to decr
29250 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a  ypt nothing... *
29260 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
29270 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
29280 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
29290 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
292a0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
292b0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
292c0 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64  ..if (pEncrypted
292d0 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Part == NULL) {.
292e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
292f0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 45  RINTF("Error. pE
29300 6e 63 72 79 70 74 65 64 50 61 72 74 20 69 73 20  ncryptedPart is 
29310 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45 6e 63 72  NULL, but ulEncr
29320 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20  yptedPartLen is 
29330 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74  not 0.");....ret
29340 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
29350 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
29360 28 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74  (ulEncryptedPart
29370 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  Len == 0) {...CA
29380 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29390 46 28 22 45 72 72 6f 72 2e 20 75 6c 45 6e 63 72  F("Error. ulEncr
293a0 79 70 74 65 64 50 61 72 74 4c 65 6e 20 69 73 20  yptedPartLen is 
293b0 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20  0, but pPart is 
293c0 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
293d0 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
293e0 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
293f0 69 66 20 28 70 75 6c 50 61 72 74 4c 65 6e 20 3d  if (pulPartLen =
29400 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
29410 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29420 22 45 72 72 6f 72 2e 20 70 75 6c 50 61 72 74 4c  "Error. pulPartL
29430 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  en is NULL.");..
29440 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
29450 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
29460 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
29470 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
29480 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29490 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
294a0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
294b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
294c0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
294d0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
294e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
294f0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
29500 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
29510 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
29520 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
29530 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
29540 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
29550 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
29560 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29570 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
29580 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
29590 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
295a0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
295b0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
295c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
295d0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
295e0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
295f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
29600 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
29610 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29620 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
29630 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63 74 69  Decrypt not acti
29640 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
29650 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
29660 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
29670 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d  );..}...slotID =
29680 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
29690 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49  [hSession].slotI
296a0 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20  D;...if (slotID 
296b0 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d  < 0 || slotID >=
296c0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
296d0 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  slots) / sizeof(
296e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29  cackey_slots[0])
296f0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
29700 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29710 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
29720 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
29730 20 6f 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69   outside of vali
29740 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44  d range", slotID
29750 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29760 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
29770 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
29780 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
29790 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
297a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
297b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
297c0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
297d0 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
297e0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
297f0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
29800 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
29810 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
29820 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
29830 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
29840 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  OR);..}...switch
29850 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e   (cackey_session
29860 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
29870 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ypt_mechanism) {
29880 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
29890 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b 20  PKCS:..../* Ask 
298a0 63 61 72 64 20 74 6f 20 64 65 63 72 79 70 74 20  card to decrypt 
298b0 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20 3d 20 63  */....buflen = c
298c0 61 63 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70  ackey_signdecryp
298d0 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  t(&cackey_slots[
298e0 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f  slotID], cackey_
298f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29900 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64 65 6e 74  n].decrypt_ident
29910 69 74 79 2c 20 70 45 6e 63 72 79 70 74 65 64 50  ity, pEncryptedP
29920 61 72 74 2c 20 75 6c 45 6e 63 72 79 70 74 65 64  art, ulEncrypted
29930 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c 20 73 69  PartLen, buf, si
29940 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c 20 31 29  zeof(buf), 0, 1)
29950 3b 0a 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e  ;.....if (buflen
29960 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f 2a 20 44   < 0) {...../* D
29970 65 63 72 79 70 74 69 6f 6e 20 66 61 69 6c 65 64  ecryption failed
29980 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 62 75 66  . */.....if (buf
29990 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
299a0 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 20  SC_E_NEEDLOGIN) 
299b0 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
299c0 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f 4c 4f 47  CKR_USER_NOT_LOG
299d0 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d 20 65 6c  GED_IN;.....} el
299e0 73 65 20 69 66 20 28 62 75 66 6c 65 6e 20 3d 3d  se if (buflen ==
299f0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
29a00 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09  OKENABSENT) {...
29a10 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
29a20 44 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a  DEVICE_REMOVED;.
29a30 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
29a40 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47  ..retval = CKR_G
29a50 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09  ENERAL_ERROR;...
29a60 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66  ..}....} else if
29a70 20 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   (((unsigned lon
29a80 67 29 20 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75  g) buflen) > *pu
29a90 6c 50 61 72 74 4c 65 6e 20 26 26 20 70 50 61 72  lPartLen && pPar
29aa0 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44 65 63 72  t) {...../* Decr
29ab0 79 70 74 65 64 20 64 61 74 61 20 74 6f 6f 20 6c  ypted data too l
29ac0 61 72 67 65 20 2a 2f 0a 09 09 09 09 72 65 74 76  arge */.....retv
29ad0 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f  al = CKR_BUFFER_
29ae0 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09 09 7d 20  TOO_SMALL;....} 
29af0 65 6c 73 65 20 7b 0a 09 09 09 09 69 66 20 28 70  else {.....if (p
29b00 50 61 72 74 29 20 7b 0a 09 09 09 09 09 6d 65 6d  Part) {......mem
29b10 63 70 79 28 70 50 61 72 74 2c 20 62 75 66 2c 20  cpy(pPart, buf, 
29b20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09 7d 0a 0a  buflen);.....}..
29b30 09 09 09 09 2a 70 75 6c 50 61 72 74 4c 65 6e 20  ....*pulPartLen 
29b40 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72  = buflen;......r
29b50 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a  etval = CKR_OK;.
29b60 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
29b70 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
29b80 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
29b90 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29ba0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
29bb0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
29bc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29bd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29be0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
29bf0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29c00 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
29c10 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
29c20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
29c30 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69  eturning %i", (i
29c40 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  nt) retval);...r
29c50 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
29c60 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
29c70 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
29c80 63 72 79 70 74 46 69 6e 61 6c 29 28 43 4b 5f 53  cryptFinal)(CK_S
29c90 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
29ca0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
29cb0 50 54 52 20 70 4c 61 73 74 50 61 72 74 2c 20 43  PTR pLastPart, C
29cc0 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c  K_ULONG_PTR pulL
29cd0 61 73 74 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69  astPartLen) {..i
29ce0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
29cf0 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74 65 5f  ..int terminate_
29d00 64 65 63 72 79 70 74 20 3d 20 31 3b 0a 0a 09 43  decrypt = 1;...C
29d10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29d20 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
29d30 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
29d40 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
29d50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29d60 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
29d70 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
29d80 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
29d90 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
29da0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  LIZED);..}...if 
29db0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
29dc0 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
29dd0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
29de0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
29df0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29e00 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
29e10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29e20 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
29e30 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
29e40 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
29e50 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
29e60 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
29e70 20 28 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e   (pulLastPartLen
29e80 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
29e90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29ea0 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 4c 61 73  F("Error. pulLas
29eb0 74 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c  tPartLen is NULL
29ec0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29ed0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
29ee0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
29ef0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
29f00 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
29f10 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
29f20 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
29f30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29f40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29f50 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
29f60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29f70 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
29f80 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
29f90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
29fa0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
29fb0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
29fc0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
29fd0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
29fe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
29ff0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2a000 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2a010 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a020 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
2a030 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
2a040 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2a050 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
2a060 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
2a070 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2a080 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2a090 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
2a0a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a0b0 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f  ror.  Decrypt no
2a0c0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2a0d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
2a0e0 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
2a0f0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 2a 70  ALIZED);..}...*p
2a100 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 3d 20  ulLastPartLen = 
2a110 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73 74 50 61  0;...if (pLastPa
2a120 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rt == NULL) {...
2a130 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
2a140 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28  t = 0;..}...if (
2a150 74 65 72 6d 69 6e 61 74 65 5f 64 65 63 72 79 70  terminate_decryp
2a160 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 65  t) {...cackey_se
2a170 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a180 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 20  .decrypt_active 
2a190 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  = 0;..}...mutex_
2a1a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2a1b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2a1c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2a1d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2a1e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2a1f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2a200 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2a210 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
2a220 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
2a230 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
2a240 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a250 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a260 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
2a270 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
2a280 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
2a290 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2a2a0 52 56 2c 20 43 5f 44 69 67 65 73 74 49 6e 69 74  RV, C_DigestInit
2a2b0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2a2c0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2a2d0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2a2e0 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a 09 43 41  Mechanism) {..CA
2a2f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a300 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2a310 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2a320 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2a330 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a340 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2a350 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2a360 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2a370 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2a380 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2a390 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a3a0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2a3b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2a3c0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2a3d0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a3e0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2a3f0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2a400 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2a410 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2a420 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2a430 69 67 65 73 74 29 28 43 4b 5f 53 45 53 53 49 4f  igest)(CK_SESSIO
2a440 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2a450 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2a460 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
2a470 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54  lDataLen, CK_BYT
2a480 45 5f 50 54 52 20 70 44 69 67 65 73 74 2c 20 43  E_PTR pDigest, C
2a490 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 44  K_ULONG_PTR pulD
2a4a0 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09 43 41 43  igestLen) {..CAC
2a4b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a4c0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2a4d0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2a4e0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2a4f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a500 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2a510 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2a520 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2a530 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2a540 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2a550 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a560 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2a570 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a580 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2a590 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a5a0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2a5b0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2a5c0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2a5d0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a5e0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69  TION(CK_RV, C_Di
2a5f0 67 65 73 74 55 70 64 61 74 65 29 28 43 4b 5f 53  gestUpdate)(CK_S
2a600 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2a610 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2a620 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2a630 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
2a640 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a650 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2a660 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2a670 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2a680 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a690 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2a6a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2a6b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2a6c0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2a6d0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2a6e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a6f0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2a700 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a710 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2a720 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2a730 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2a740 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2a750 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2a760 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2a770 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2a780 20 43 5f 44 69 67 65 73 74 4b 65 79 29 28 43 4b   C_DigestKey)(CK
2a790 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2a7a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a  hSession, CK_OBJ
2a7b0 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29  ECT_HANDLE hKey)
2a7c0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2a7d0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2a7e0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2a7f0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2a800 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a810 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a820 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2a830 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a840 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2a850 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2a860 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a870 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2a880 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2a890 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2a8a0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2a8b0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2a8c0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2a8d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2a8e0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2a8f0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2a900 56 2c 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c  V, C_DigestFinal
2a910 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2a920 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2a930 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73  _BYTE_PTR pDiges
2a940 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
2a950 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a  pulDigestLen) {.
2a960 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a970 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2a980 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2a990 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2a9a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a9b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2a9c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2a9d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2a9e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2a9f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2aa00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2aa10 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2aa20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2aa30 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2aa40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2aa50 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2aa60 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2aa70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2aa80 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2aa90 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2aaa0 43 5f 53 69 67 6e 49 6e 69 74 29 28 43 4b 5f 53  C_SignInit)(CK_S
2aab0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2aac0 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2aad0 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2aae0 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2aaf0 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 69  ANDLE hKey) {..i
2ab00 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2ab10 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09 43 41 43  ...hKey--;...CAC
2ab20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2ab30 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2ab40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2ab50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2ab60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ab70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2ab80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2ab90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2aba0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2abb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70  ZED);..}...if (p
2abc0 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20 4e 55 4c  Mechanism == NUL
2abd0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2abe0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2abf0 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d 20 69 73  r. pMechanism is
2ac00 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2ac10 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2ac20 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
2ac30 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63  (pMechanism->mec
2ac40 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d 5f 52 53  hanism != CKM_RS
2ac50 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43 41 43 4b  A_PKCS) {...CACK
2ac60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ac70 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69  "Error. pMechani
2ac80 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 6e 6f  sm->mechanism no
2ac90 74 20 73 70 65 63 69 66 69 65 64 20 61 73 20 43  t specified as C
2aca0 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29 3b 0a 0a  KM_RSA_PKCS");..
2acb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4d 45 43  ..return(CKR_MEC
2acc0 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f 49 4e 56  HANISM_PARAM_INV
2acd0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2ace0 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
2acf0 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
2ad00 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2ad10 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
2ad20 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
2ad30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
2ad40 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2ad50 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
2ad60 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
2ad70 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
2ad80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
2ad90 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
2ada0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2adb0 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2adc0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2add0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2ade0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2adf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ae00 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2ae10 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2ae20 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2ae30 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2ae40 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2ae50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2ae60 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2ae70 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2ae80 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2ae90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2aea0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2aeb0 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2aec0 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2aed0 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2aee0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2aef0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
2af00 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2af10 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
2af20 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2af30 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2af40 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2af50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2af60 72 72 6f 72 2e 20 20 53 69 67 6e 20 61 6c 72 65  rror.  Sign alre
2af70 61 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ady in progress.
2af80 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2af90 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43  CKR_OPERATION_AC
2afa0 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  TIVE);..}...if (
2afb0 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73  hKey >= cackey_s
2afc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2afd0 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  ].identities_cou
2afe0 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  nt) {...cackey_m
2aff0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2b000 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2b010 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2b020 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79  NTF("Error.  Key
2b030 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72   handle out of r
2b040 61 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20  ange (requested 
2b050 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c  key %lu, only %l
2b060 75 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61  u identities ava
2b070 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69  ilable).", (unsi
2b080 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c  gned long) hKey,
2b090 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2b0a0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2b0b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2b0c0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09  ities_count);...
2b0d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f  .return(CKR_KEY_
2b0e0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2b0f0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
2b100 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b110 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 31 3b  sign_active = 1;
2b120 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2b130 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2b140 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20 70 4d  n_mechanism = pM
2b150 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
2b160 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ism;...cackey_se
2b170 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b180 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20 3d 20 31  .sign_buflen = 1
2b190 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  28;..cackey_sess
2b1a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b1b0 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 30 3b  ign_bufused = 0;
2b1c0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b1d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b1e0 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  _buf = malloc(si
2b1f0 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73 65 73  zeof(*cackey_ses
2b200 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b210 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61 63 6b  sign_buf) * cack
2b220 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b230 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65  sion].sign_bufle
2b240 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  n);...CACKEY_DEB
2b250 55 47 5f 50 52 49 4e 54 46 28 22 53 65 73 73 69  UG_PRINTF("Sessi
2b260 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69 64 65 6e  on %lu sign_iden
2b270 74 69 74 79 20 69 73 20 25 70 20 28 69 64 65 6e  tity is %p (iden
2b280 74 69 74 79 20 23 25 6c 75 29 22 2c 20 28 75 6e  tity #%lu)", (un
2b290 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65  signed long) hSe
2b2a0 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20 2a 29 20  ssion, (void *) 
2b2b0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
2b2c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
2b2d0 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20 28 75 6e  ities[hKey], (un
2b2e0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65  signed long) hKe
2b2f0 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  y);..cackey_sess
2b300 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b310 69 67 6e 5f 69 64 65 6e 74 69 74 79 20 3d 20 26  ign_identity = &
2b320 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b330 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
2b340 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75  ties[hKey];...mu
2b350 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
2b360 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2b370 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2b380 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2b390 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2b3a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b3b0 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
2b3c0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2b3d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2b3e0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2b3f0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b400 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2b410 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
2b420 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
2b430 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
2b440 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2b450 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 29 28  (CK_RV, C_Sign)(
2b460 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2b470 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2b480 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2b490 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
2b4a0 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2b4b0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2b4c0 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
2b4d0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75 6e 73 69  tureLen) {..unsi
2b4e0 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61 72 74 5f  gned long start_
2b4f0 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 43  sign_bufused;..C
2b500 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74 3b 0a 09  K_RV sign_ret;..
2b510 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2b520 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2b530 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2b540 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2b550 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2b560 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b570 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2b580 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2b590 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2b5a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2b5b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2b5c0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
2b5d0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
2b5e0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2b5f0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
2b600 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2b610 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
2b620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b630 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2b640 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
2b650 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2b660 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2b670 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2b680 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e 5f 62 75  ...start_sign_bu
2b690 66 75 73 65 64 20 3d 20 63 61 63 6b 65 79 5f 73  fused = cackey_s
2b6a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b6b0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 3b 0a  ].sign_bufused;.
2b6c0 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53  ..sign_ret = C_S
2b6d0 69 67 6e 55 70 64 61 74 65 28 68 53 65 73 73 69  ignUpdate(hSessi
2b6e0 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c 44 61 74  on, pData, ulDat
2b6f0 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73 69 67 6e  aLen);..if (sign
2b700 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f 4b 29 20  _ret != CKR_OK) 
2b710 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b720 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b730 20 53 69 67 6e 55 70 64 61 74 65 28 29 20 72 65   SignUpdate() re
2b740 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28  turned failure (
2b750 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  rv = %lu).", (un
2b760 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
2b770 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66 20 28 73  n_ret);....if (s
2b780 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42  ign_ret != CKR_B
2b790 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
2b7a0 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76   {....mutex_retv
2b7b0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2b7c0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
2b7d0 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d  glock);....if (m
2b7e0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2b7f0 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
2b800 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b810 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69  or.  Locking fai
2b820 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
2b830 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2b840 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 0a 09 09  ERROR);....}....
2b850 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2b860 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b870 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
2b880 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2b890 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2b8a0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
2b8b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b8c0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
2b8d0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2b8e0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2b8f0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2b900 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  ALID);....}.....
2b910 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2b920 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b930 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a 09 09  ign_active) {...
2b940 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2b950 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2b960 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
2b970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b980 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f  "Error.  Sign no
2b990 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
2b9a0 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2b9b0 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2b9c0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a  TIALIZED);....}.
2b9d0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2b9e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2b9f0 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  gn_active = 0;..
2ba00 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2ba10 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2ba20 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2ba30 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
2ba40 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2ba50 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
2ba60 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ba70 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
2ba80 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
2ba90 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2baa0 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09  _ERROR);....}...
2bab0 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67 6e  }....return(sign
2bac0 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73 69 67 6e  _ret);..}...sign
2bad0 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e 46 69 6e  _ret = C_SignFin
2bae0 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20 70 53 69  al(hSession, pSi
2baf0 67 6e 61 74 75 72 65 2c 20 70 75 6c 53 69 67 6e  gnature, pulSign
2bb00 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69 66 20 28  atureLen);..if (
2bb10 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
2bb20 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73 69 67 6e  OK) {...if (sign
2bb30 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42 55 46 46  _ret == CKR_BUFF
2bb40 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
2bb50 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bb60 50 52 49 4e 54 46 28 22 53 69 67 6e 46 69 6e 61  PRINTF("SignFina
2bb70 6c 28 29 20 72 65 74 75 72 6e 65 64 20 43 4b 52  l() returned CKR
2bb80 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
2bb90 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c 20 75 6e  L (rv = %lu), un
2bba0 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61  doing C_SignUpda
2bbb0 74 65 28 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  te()", (unsigned
2bbc0 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74 29   long) sign_ret)
2bbd0 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  ;.....cackey_ses
2bbe0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2bbf0 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 73  sign_bufused = s
2bc00 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65  tart_sign_bufuse
2bc10 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 73 69  d;.....return(si
2bc20 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a 0a 09 09  gn_ret);...}....
2bc30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bc40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
2bc50 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65  nFinal() returne
2bc60 64 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20  d failure (rv = 
2bc70 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  %lu).", (unsigne
2bc80 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72 65 74  d long) sign_ret
2bc90 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 73 69 67  );....return(sig
2bca0 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66 20  n_ret);..}...if 
2bcb0 28 70 53 69 67 6e 61 74 75 72 65 20 3d 3d 20 4e  (pSignature == N
2bcc0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2bcd0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70 53  DEBUG_PRINTF("pS
2bce0 69 67 6e 61 74 75 72 65 20 73 70 65 63 69 66 69  ignature specifi
2bcf0 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75 6e 64 6f  ed as NULL, undo
2bd00 69 6e 67 20 43 5f 53 69 67 6e 55 70 64 61 74 65  ing C_SignUpdate
2bd10 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  ()");....cackey_
2bd20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2bd30 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
2bd40 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  = start_sign_buf
2bd50 75 73 65 64 3b 0a 0a 09 09 72 65 74 75 72 6e 28  used;....return(
2bd60 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
2bd70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bd80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2bd90 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
2bda0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
2bdb0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
2bdc0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2bdd0 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70 64 61 74  _RV, C_SignUpdat
2bde0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2bdf0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2be00 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74  K_BYTE_PTR pPart
2be10 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72  , CK_ULONG ulPar
2be20 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20 6d 75 74  tLen) {..int mut
2be30 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
2be40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2be50 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2be60 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2be70 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2be80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2be90 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2bea0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2beb0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2bec0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2bed0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
2bee0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2bef0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2bf00 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2bf10 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2bf20 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2bf30 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2bf40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2bf50 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2bf60 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2bf70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2bf80 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2bf90 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
2bfa0 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  pPart == NULL &&
2bfb0 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29   ulPartLen == 0)
2bfc0 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
2bfd0 72 63 75 69 74 20 69 66 20 77 65 20 61 72 65 20  rcuit if we are 
2bfe0 61 73 6b 65 64 20 74 6f 20 73 69 67 6e 20 6e 6f  asked to sign no
2bff0 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41  thing... */...CA
2c000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c010 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2c020 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72 74 20  _OK (%i) (short 
2c030 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52 5f 4f  circuit)", CKR_O
2c040 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  K);....return(CK
2c050 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  R_OK);..}...if (
2c060 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pPart == NULL) {
2c070 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c080 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
2c090 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75  Part is NULL, bu
2c0a0 74 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 6e  t ulPartLen is n
2c0b0 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ot 0.");....retu
2c0c0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
2c0d0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
2c0e0 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  ulPartLen == 0) 
2c0f0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c100 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c110 75 6c 50 61 72 74 4c 65 6e 20 69 73 20 30 2c 20  ulPartLen is 0, 
2c120 62 75 74 20 70 50 61 72 74 20 69 73 20 6e 6f 74  but pPart is not
2c130 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
2c140 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
2c150 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  S_BAD);..}...mut
2c160 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2c170 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
2c180 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
2c190 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2c1a0 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
2c1b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c1c0 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2c1d0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
2c1e0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2c1f0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2c200 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
2c210 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
2c220 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2c230 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2c240 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2c250 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c260 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
2c270 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
2c280 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2c290 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2c2a0 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2c2b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2c2c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c2d0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
2c2e0 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
2c2f0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2c300 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
2c310 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c320 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74  Error.  Sign not
2c330 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
2c340 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
2c350 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
2c360 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 77 69  LIZED);..}...swi
2c370 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
2c380 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2c390 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20 7b  ign_mechanism) {
2c3a0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
2c3b0 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 63 63 75  PKCS:..../* Accu
2c3c0 6d 75 6c 61 74 65 20 64 69 72 65 63 74 6c 79 20  mulate directly 
2c3d0 2a 2f 0a 09 09 09 69 66 20 28 28 63 61 63 6b 65  */....if ((cacke
2c3e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c3f0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2c400 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e 29 20 3e  d + ulPartLen) >
2c410 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2c420 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2c430 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09 09 63 61  buflen) {.....ca
2c440 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c450 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2c460 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09 09 09 63  len *= 2;......c
2c470 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c480 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2c490 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63 61 63 6b  f = realloc(cack
2c4a0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c4b0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
2c4c0 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 73  sizeof(*cackey_s
2c4d0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c4e0 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63 61  ].sign_buf) * ca
2c4f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c500 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2c510 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 6d  len);....}.....m
2c520 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65 73  emcpy(cackey_ses
2c530 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c540 73 69 67 6e 5f 62 75 66 20 2b 20 63 61 63 6b 65  sign_buf + cacke
2c550 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c560 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2c570 64 2c 20 70 50 61 72 74 2c 20 75 6c 50 61 72 74  d, pPart, ulPart
2c580 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  Len);.....cackey
2c590 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2c5a0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2c5b0 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e 3b 0a 0a   += ulPartLen;..
2c5c0 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d  ...break;..}...m
2c5d0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2c5e0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2c5f0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2c600 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2c610 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2c620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c630 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
2c640 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2c650 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2c660 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2c670 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2c680 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2c690 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2c6a0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2c6b0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2c6c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2c6d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 46  N(CK_RV, C_SignF
2c6e0 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
2c6f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2c700 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2c710 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
2c720 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74  NG_PTR pulSignat
2c730 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69  ureLen) {..stati
2c740 63 20 43 4b 5f 42 59 54 45 20 73 69 67 62 75 66  c CK_BYTE sigbuf
2c750 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a 65 5f 74  [1024];..ssize_t
2c760 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f   sigbuflen;..CK_
2c770 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
2c780 09 43 4b 5f 52 56 20 72 65 74 76 61 6c 20 3d 20  .CK_RV retval = 
2c790 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2c7a0 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61 74  R;..int terminat
2c7b0 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 69 6e 74  e_sign = 1;..int
2c7c0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2c7d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c7e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2c7f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2c800 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2c810 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c820 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2c830 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2c840 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2c850 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2c860 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2c870 66 20 28 70 75 6c 53 69 67 6e 61 74 75 72 65 4c  f (pulSignatureL
2c880 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
2c890 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c8a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 53  NTF("Error. pulS
2c8b0 69 67 6e 61 74 75 72 65 4c 65 6e 20 69 73 20 4e  ignatureLen is N
2c8c0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
2c8d0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
2c8e0 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  BAD);..}...if (h
2c8f0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
2c900 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
2c910 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2c920 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
2c930 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
2c940 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
2c950 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c960 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
2c970 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
2c980 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
2c990 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
2c9a0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
2c9b0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2c9c0 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2c9d0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
2c9e0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2c9f0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
2ca00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2ca10 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
2ca20 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2ca30 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2ca40 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2ca50 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
2ca60 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
2ca70 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2ca80 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2ca90 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2caa0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2cab0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
2cac0 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
2cad0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2cae0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2caf0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2cb00 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2cb10 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2cb20 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b 0a  .sign_active) {.
2cb30 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2cb40 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2cb50 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
2cb60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2cb70 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e 6f 74 20  rror.  Sign not 
2cb80 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2cb90 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
2cba0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
2cbb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  IZED);..}...slot
2cbc0 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
2cbd0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2cbe0 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
2cbf0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
2cc00 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
2cc10 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
2cc20 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
2cc30 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2cc40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2cc50 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
2cc60 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
2cc70 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
2cc80 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
2cc90 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
2cca0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2ccb0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
2ccc0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2ccd0 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
2cce0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2ccf0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2cd00 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
2cd10 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
2cd20 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
2cd30 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
2cd40 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
2cd50 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2cd60 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
2cd70 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2cd80 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
2cd90 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
2cda0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2cdb0 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 29 20  sign_mechanism) 
2cdc0 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41  {...case CKM_RSA
2cdd0 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41 73 6b  _PKCS:..../* Ask
2cde0 20 63 61 72 64 20 74 6f 20 73 69 67 6e 20 2a 2f   card to sign */
2cdf0 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2ce00 5f 50 52 49 4e 54 46 28 22 41 73 6b 69 6e 67 20  _PRINTF("Asking 
2ce10 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20 69 64 65  to sign from ide
2ce20 6e 74 69 74 79 20 25 70 20 69 6e 20 73 65 73 73  ntity %p in sess
2ce30 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f 69 64 20  ion %lu", (void 
2ce40 2a 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  *) cackey_sessio
2ce50 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2ce60 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28 75 6e 73  n_identity, (uns
2ce70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 53 65 73  igned long) hSes
2ce80 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67 62 75 66  sion);....sigbuf
2ce90 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67  len = cackey_sig
2cea0 6e 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79  ndecrypt(&cackey
2ceb0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
2cec0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ced0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 69  hSession].sign_i
2cee0 64 65 6e 74 69 74 79 2c 20 63 61 63 6b 65 79 5f  dentity, cackey_
2cef0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2cf00 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20 63 61 63  n].sign_buf, cac
2cf10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2cf20 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2cf30 73 65 64 2c 20 73 69 67 62 75 66 2c 20 73 69 7a  sed, sigbuf, siz
2cf40 65 6f 66 28 73 69 67 62 75 66 29 2c 20 31 2c 20  eof(sigbuf), 1, 
2cf50 30 29 3b 0a 0a 09 09 09 69 66 20 28 73 69 67 62  0);.....if (sigb
2cf60 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09  uflen < 0) {....
2cf70 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66 61 69 6c  ./* Signing fail
2cf80 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28 73  ed. */.....if (s
2cf90 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
2cfa0 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f  EY_PCSC_E_NEEDLO
2cfb0 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76  GIN) {......retv
2cfc0 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f  al = CKR_USER_NO
2cfd0 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09  T_LOGGED_IN;....
2cfe0 09 7d 20 65 6c 73 65 20 69 66 20 28 73 69 67 62  .} else if (sigb
2cff0 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f  uflen == CACKEY_
2d000 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
2d010 4e 54 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  NT) {......retva
2d020 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52  l = CKR_DEVICE_R
2d030 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c  EMOVED;.....} el
2d040 73 65 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  se {......retval
2d050 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2d060 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d  RROR;.....}....}
2d070 20 65 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69   else if (((unsi
2d080 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62 75  gned long) sigbu
2d090 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53 69 67 6e  flen) > *pulSign
2d0a0 61 74 75 72 65 4c 65 6e 20 26 26 20 70 53 69 67  atureLen && pSig
2d0b0 6e 61 74 75 72 65 29 20 7b 0a 09 09 09 09 2f 2a  nature) {...../*
2d0c0 20 53 69 67 6e 65 64 20 64 61 74 61 20 74 6f 6f   Signed data too
2d0d0 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 43 41   large */.....CA
2d0e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d0f0 46 28 22 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  F("retval = CKR_
2d100 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2d110 3b 20 20 73 69 67 62 75 66 6c 65 6e 20 3d 20 25  ;  sigbuflen = %
2d120 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74 75 72 65  lu, pulSignature
2d130 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  Len = %lu", (uns
2d140 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 62  igned long) sigb
2d150 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67 6e 65 64  uflen, (unsigned
2d160 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69 67 6e 61   long) *pulSigna
2d170 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 72  tureLen);......r
2d180 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
2d190 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 0a 09  ER_TOO_SMALL;...
2d1a0 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  ...terminate_sig
2d1b0 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65 6c 73 65  n = 0;....} else
2d1c0 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65   {.....terminate
2d1d0 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09 09 09 09  _sign = 0;......
2d1e0 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 29 20  if (pSignature) 
2d1f0 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 70 53  {......memcpy(pS
2d200 69 67 6e 61 74 75 72 65 2c 20 73 69 67 62 75 66  ignature, sigbuf
2d210 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b 0a 0a 09  , sigbuflen);...
2d220 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f 73 69  ....terminate_si
2d230 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d 0a 0a 09  gn = 1;.....}...
2d240 09 09 09 2a 70 75 6c 53 69 67 6e 61 74 75 72 65  ...*pulSignature
2d250 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c 65 6e 3b  Len = sigbuflen;
2d260 0a 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
2d270 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09  KR_OK;....}.....
2d280 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69 66 20 28  break;..}...if (
2d290 74 65 72 6d 69 6e 61 74 65 5f 73 69 67 6e 29 20  terminate_sign) 
2d2a0 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  {...if (cackey_s
2d2b0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2d2c0 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b 0a 09 09  ].sign_buf) {...
2d2d0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73  .free(cackey_ses
2d2e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2d2f0 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09 7d 0a 0a  sign_buf);...}..
2d300 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2d310 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2d320 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a  _active = 0;..}.
2d330 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2d340 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2d350 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2d360 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2d370 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2d380 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d390 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2d3a0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2d3b0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2d3c0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2d3d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2d3e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2d3f0 72 6e 69 6e 67 20 25 69 22 2c 20 28 69 6e 74 29  rning %i", (int)
2d400 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
2d410 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 43  rn(retval);.}..C
2d420 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2d430 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 52  N(CK_RV, C_SignR
2d440 65 63 6f 76 65 72 49 6e 69 74 29 28 43 4b 5f 53  ecoverInit)(CK_S
2d450 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2d460 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2d470 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2d480 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2d490 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2d4a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d4b0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2d4c0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2d4d0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2d4e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d4f0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2d500 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2d510 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2d520 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2d530 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2d540 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d550 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2d560 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d570 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2d580 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d590 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2d5a0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2d5b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d5c0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2d5d0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2d5e0 53 69 67 6e 52 65 63 6f 76 65 72 29 28 43 4b 5f  SignRecover)(CK_
2d5f0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2d600 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2d610 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
2d620 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
2d630 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67  CK_BYTE_PTR pSig
2d640 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47  nature, CK_ULONG
2d650 5f 50 54 52 20 70 75 6c 53 69 67 6e 61 74 75 72  _PTR pulSignatur
2d660 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2d670 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2d680 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2d690 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2d6a0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2d6b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d6c0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2d6d0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2d6e0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2d6f0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d700 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2d710 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2d720 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2d730 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d740 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2d750 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d760 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2d770 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d780 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2d790 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d7a0 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2d7b0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
2d7c0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d7d0 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2d7e0 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2d7f0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2d800 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2d810 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2d820 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2d830 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2d840 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2d850 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d860 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2d870 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2d880 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2d890 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d8a0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2d8b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2d8c0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2d8d0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d8e0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2d8f0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d900 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2d910 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d920 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2d930 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d940 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2d950 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2d960 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2d970 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c  _BYTE_PTR pData,
2d980 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61   CK_ULONG ulData
2d990 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  Len, CK_BYTE_PTR
2d9a0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2d9b0 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
2d9c0 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  eLen) {..CACKEY_
2d9d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2d9e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2d9f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2da00 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2da10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2da20 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2da30 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2da40 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2da50 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2da60 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2da70 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2da80 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2da90 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2daa0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2dab0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2dac0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2dad0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2dae0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2daf0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2db00 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2db10 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2db20 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2db30 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2db40 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2db50 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  ulPartLen) {..CA
2db60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2db70 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2db80 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2db90 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2dba0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2dbb0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2dbc0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2dbd0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2dbe0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2dbf0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2dc00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2dc10 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2dc20 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2dc30 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2dc40 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2dc50 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2dc60 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2dc70 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2dc80 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2dc90 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56  CTION(CK_RV, C_V
2dca0 65 72 69 66 79 46 69 6e 61 6c 29 28 43 4b 5f 53  erifyFinal)(CK_S
2dcb0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2dcc0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2dcd0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
2dce0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
2dcf0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
2dd00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2dd10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2dd20 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2dd30 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2dd40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dd50 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2dd60 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2dd70 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2dd80 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2dd90 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2dda0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2ddb0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2ddc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ddd0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2dde0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2ddf0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2de00 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2de10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2de20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2de30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2de40 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ifyRecoverInit)(
2de50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2de60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2de70 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2de80 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2de90 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2dea0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2deb0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2dec0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2ded0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2dee0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2def0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2df00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2df10 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2df20 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2df30 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2df40 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2df50 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2df60 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2df70 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2df80 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2df90 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2dfa0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2dfb0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2dfc0 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2dfd0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2dfe0 2c 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65  , C_VerifyRecove
2dff0 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
2e000 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2e010 4b 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e  K_BYTE_PTR pSign
2e020 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  ature, CK_ULONG 
2e030 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 2c 20  ulSignatureLen, 
2e040 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2e050 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  a, CK_ULONG_PTR 
2e060 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  pulDataLen) {..C
2e070 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e080 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e090 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2e0a0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2e0b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e0c0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2e0d0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2e0e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2e0f0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2e100 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2e110 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e120 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2e130 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e140 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2e150 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e160 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2e170 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2e180 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e190 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2e1a0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2e1b0 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64  DigestEncryptUpd
2e1c0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2e1d0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2e1e0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50 61   CK_BYTE_PTR pPa
2e1f0 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50  rt, CK_ULONG ulP
2e200 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2e210 50 54 52 20 70 45 6e 63 72 79 70 74 65 64 50 61  PTR pEncryptedPa
2e220 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52  rt, CK_ULONG_PTR
2e230 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72   pulEncryptedPar
2e240 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2e250 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2e260 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2e270 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2e280 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2e290 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e2a0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2e2b0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2e2c0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2e2d0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2e2e0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2e2f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2e300 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2e310 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2e320 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2e330 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2e340 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2e350 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e360 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2e370 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2e380 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70  (CK_RV, C_Decryp
2e390 74 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  tDigestUpdate)(C
2e3a0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2e3b0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2e3c0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2e3d0 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dPart, CK_ULONG 
2e3e0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
2e3f0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2e400 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pPart, CK_ULONG_
2e410 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e 29 20  PTR pulPartLen) 
2e420 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2e430 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2e440 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2e450 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2e460 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e470 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2e480 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2e490 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2e4a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2e4b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2e4c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e4d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2e4e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2e4f0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2e500 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2e510 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2e520 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2e530 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2e540 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2e550 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2e560 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55  , C_SignEncryptU
2e570 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2e580 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2e590 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2e5a0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2e5b0 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  lPartLen, CK_BYT
2e5c0 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
2e5d0 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Part, CK_ULONG_P
2e5e0 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64 50  TR pulEncryptedP
2e5f0 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
2e600 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e610 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2e620 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2e630 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2e640 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2e650 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2e660 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2e670 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2e680 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2e690 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2e6a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2e6b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2e6c0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2e6d0 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2e6e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e6f0 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2e700 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2e710 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2e720 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2e730 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72  ON(CK_RV, C_Decr
2e740 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 29  yptVerifyUpdate)
2e750 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2e760 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2e770 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2e780 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2e790 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72  G ulEncryptedPar
2e7a0 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  tLen, CK_BYTE_PT
2e7b0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2e7c0 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65 6e  G_PTR pulPartLen
2e7d0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2e7e0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2e7f0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2e800 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2e810 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2e820 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2e830 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2e840 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2e850 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2e860 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2e870 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2e880 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2e890 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2e8a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2e8b0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2e8c0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e8d0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2e8e0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2e8f0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2e900 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2e910 52 56 2c 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  RV, C_GenerateKe
2e920 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
2e930 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2e940 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2e950 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41  pMechanism, CK_A
2e960 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
2e970 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
2e980 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a   ulCount, CK_OBJ
2e990 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
2e9a0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2e9b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2e9c0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2e9d0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2e9e0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2e9f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ea00 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2ea10 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2ea20 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2ea30 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2ea40 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2ea50 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2ea60 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2ea70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ea80 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2ea90 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2eaa0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2eab0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2eac0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2ead0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2eae0 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
2eaf0 74 65 4b 65 79 50 61 69 72 29 28 43 4b 5f 53 45  teKeyPair)(CK_SE
2eb00 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2eb10 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
2eb20 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
2eb30 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45  sm, CK_ATTRIBUTE
2eb40 5f 50 54 52 20 70 50 75 62 6c 69 63 4b 65 79 54  _PTR pPublicKeyT
2eb50 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2eb60 47 20 75 6c 50 75 62 6c 69 63 4b 65 79 41 74 74  G ulPublicKeyAtt
2eb70 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
2eb80 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 50  ATTRIBUTE_PTR pP
2eb90 72 69 76 61 74 65 4b 65 79 54 65 6d 70 6c 61 74  rivateKeyTemplat
2eba0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 72  e, CK_ULONG ulPr
2ebb0 69 76 61 74 65 4b 65 79 41 74 74 72 69 62 75 74  ivateKeyAttribut
2ebc0 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
2ebd0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 50  T_HANDLE_PTR phP
2ebe0 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f 4f 42 4a  ublicKey, CK_OBJ
2ebf0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
2ec00 68 50 72 69 76 61 74 65 4b 65 79 29 20 7b 0a 09  hPrivateKey) {..
2ec10 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ec20 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2ec30 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2ec40 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2ec50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ec60 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2ec70 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2ec80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2ec90 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2eca0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2ecb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ecc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2ecd0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ece0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2ecf0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ed00 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2ed10 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2ed20 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2ed30 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2ed40 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2ed50 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f 53 45 53  _WrapKey)(CK_SES
2ed60 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2ed70 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2ed80 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2ed90 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2eda0 44 4c 45 20 68 57 72 61 70 70 69 6e 67 4b 65 79  DLE hWrappingKey
2edb0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2edc0 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42 59 54 45  LE hKey, CK_BYTE
2edd0 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65 79  _PTR pWrappedKey
2ede0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2edf0 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 29  ulWrappedKeyLen)
2ee00 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2ee10 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2ee20 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2ee30 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2ee40 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2ee50 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2ee60 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2ee70 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2ee80 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2ee90 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2eea0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2eeb0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2eec0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2eed0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2eee0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2eef0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2ef00 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2ef10 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ef20 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2ef30 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2ef40 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65 79 29 28  V, C_UnwrapKey)(
2ef50 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2ef60 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2ef70 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2ef80 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2ef90 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e 77 72 61  CT_HANDLE hUnwra
2efa0 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f 42 59 54  ppingKey, CK_BYT
2efb0 45 5f 50 54 52 20 70 57 72 61 70 70 65 64 4b 65  E_PTR pWrappedKe
2efc0 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 57 72  y, CK_ULONG ulWr
2efd0 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20 43 4b 5f  appedKeyLen, CK_
2efe0 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
2eff0 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2f000 47 20 75 6c 41 74 74 72 69 62 75 74 65 43 6f 75  G ulAttributeCou
2f010 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  nt, CK_OBJECT_HA
2f020 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65 79 29 20  NDLE_PTR phKey) 
2f030 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2f040 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2f050 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2f060 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2f070 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f080 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2f090 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2f0a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2f0b0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2f0c0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2f0d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2f0e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2f0f0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f100 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2f110 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2f120 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2f130 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2f140 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f150 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2f160 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2f170 2c 20 43 5f 44 65 72 69 76 65 4b 65 79 29 28 43  , C_DeriveKey)(C
2f180 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2f190 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2f1a0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2f1b0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
2f1c0 54 5f 48 41 4e 44 4c 45 20 68 42 61 73 65 4b 65  T_HANDLE hBaseKe
2f1d0 79 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  y, CK_ATTRIBUTE_
2f1e0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
2f1f0 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
2f200 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
2f210 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
2f220 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2f230 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2f240 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2f250 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2f260 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2f270 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2f280 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2f290 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2f2a0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2f2b0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2f2c0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2f2d0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2f2e0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2f2f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f300 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2f310 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f320 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2f330 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f340 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2f350 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2f360 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65 64 52 61  (CK_RV, C_SeedRa
2f370 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ndom)(CK_SESSION
2f380 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2f390 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2f3a0 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  eed, CK_ULONG ul
2f3b0 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  SeedLen) {..CACK
2f3c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f3d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2f3e0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2f3f0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2f400 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f410 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2f420 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2f430 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2f440 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2f450 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2f460 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2f470 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2f480 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f490 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2f4a0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f4b0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2f4c0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2f4d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2f4e0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2f4f0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
2f500 65 72 61 74 65 52 61 6e 64 6f 6d 29 28 43 4b 5f  erateRandom)(CK_
2f510 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2f520 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2f530 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44 61 74 61  _PTR pRandomData
2f540 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 52 61 6e  , CK_ULONG ulRan
2f550 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  domLen) {..CACKE
2f560 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f570 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2f580 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2f590 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2f5a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2f5b0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2f5c0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2f5d0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2f5e0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2f5f0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2f600 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2f610 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2f620 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2f630 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2f640 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2f650 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2f660 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2f670 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2f680 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75  /* Deprecated Fu
2f690 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46  nction */.CK_DEF
2f6a0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2f6b0 52 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f  RV, C_GetFunctio
2f6c0 6e 53 74 61 74 75 73 29 28 43 4b 5f 53 45 53 53  nStatus)(CK_SESS
2f6d0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2f6e0 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  ion) {..CACKEY_D
2f6f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2f700 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59  led.");...CACKEY
2f710 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2f720 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2f730 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c  CTION_NOT_PARALL
2f740 45 4c 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  EL (%i)", CKR_FU
2f750 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
2f760 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  LEL);...return(C
2f770 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2f780 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65  PARALLEL);...hSe
2f790 73 73 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e  ssion = hSession
2f7a0 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75  ; /* Supress unu
2f7b0 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61 72  sed variable war
2f7c0 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 20 44 65  ning */.}../* De
2f7d0 70 72 65 63 61 74 65 64 20 46 75 6e 63 74 69 6f  precated Functio
2f7e0 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  n */.CK_DEFINE_F
2f7f0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2f800 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f 6e 29  _CancelFunction)
2f810 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2f820 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
2f830 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2f840 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2f850 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f860 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2f870 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2f880 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22  T_PARALLEL (%i)"
2f890 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2f8a0 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
2f8b0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2f8c0 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
2f8d0 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20  );...hSession = 
2f8e0 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70  hSession; /* Sup
2f8f0 72 65 73 73 20 75 6e 75 73 65 64 20 76 61 72 69  ress unused vari
2f900 61 62 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  able warning */.
2f910 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2f920 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
2f930 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 28  etFunctionList)(
2f940 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
2f950 5f 50 54 52 5f 50 54 52 20 70 70 46 75 6e 63 74  _PTR_PTR ppFunct
2f960 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43 4b 5f 46  ionList) {..CK_F
2f970 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f 50 54 52  UNCTION_LIST_PTR
2f980 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
2f990 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2f9a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2f9b0 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e 63 74 69  ;...if (ppFuncti
2f9c0 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20  onList == NULL) 
2f9d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2f9e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2f9f0 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 69  ppFunctionList i
2fa00 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2fa10 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2fa20 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 70 46  TS_BAD);..}...pF
2fa30 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 6d 61  unctionList = ma
2fa40 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 46 75  lloc(sizeof(*pFu
2fa50 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b 0a 0a 09  nctionList));...
2fa60 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76  pFunctionList->v
2fa70 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28  ersion.major = (
2fa80 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
2fa90 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
2faa0 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
2fab0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 76 65  FunctionList->ve
2fac0 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 28  rsion.minor = ((
2fad0 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f  CACKEY_CRYPTOKI_
2fae0 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e 3e  VERSION_CODE) >>
2faf0 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 46   8) & 0xff;...pF
2fb00 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49  unctionList->C_I
2fb10 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43 5f 49 6e  nitialize = C_In
2fb20 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63  itialize;..pFunc
2fb30 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 61  tionList->C_Fina
2fb40 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61 6c 69 7a  lize = C_Finaliz
2fb50 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2fb60 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20 3d 20 43  t->C_GetInfo = C
2fb70 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  _GetInfo;..pFunc
2fb80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
2fb90 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47 65 74 53  lotList = C_GetS
2fba0 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75 6e 63 74  lotList;..pFunct
2fbb0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 6c  ionList->C_GetSl
2fbc0 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 6c  otInfo = C_GetSl
2fbd0 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  otInfo;..pFuncti
2fbe0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 54 6f 6b  onList->C_GetTok
2fbf0 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 54 6f  enInfo = C_GetTo
2fc00 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  kenInfo;..pFunct
2fc10 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61 69 74 46  ionList->C_WaitF
2fc20 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d 20 43 5f  orSlotEvent = C_
2fc30 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
2fc40 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2fc50 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d  ->C_GetMechanism
2fc60 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d 65 63 68  List = C_GetMech
2fc70 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70 46 75 6e  anismList;..pFun
2fc80 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2fc90 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f 20 3d 20  MechanismInfo = 
2fca0 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e  C_GetMechanismIn
2fcb0 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  fo;..pFunctionLi
2fcc0 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b 65 6e 20  st->C_InitToken 
2fcd0 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e 3b 0a 09  = C_InitToken;..
2fce0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2fcf0 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f 49 6e 69  _InitPIN = C_Ini
2fd00 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tPIN;..pFunction
2fd10 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49 4e 20 3d  List->C_SetPIN =
2fd20 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70 46 75 6e   C_SetPIN;..pFun
2fd30 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 4f 70 65  ctionList->C_Ope
2fd40 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f 4f 70 65  nSession = C_Ope
2fd50 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e 63  nSession;..pFunc
2fd60 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f 73  tionList->C_Clos
2fd70 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f 43 6c 6f  eSession = C_Clo
2fd80 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70 46 75 6e  seSession;..pFun
2fd90 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6c 6f  ctionList->C_Clo
2fda0 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73 20 3d 20  seAllSessions = 
2fdb0 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f  C_CloseAllSessio
2fdc0 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ns;..pFunctionLi
2fdd0 73 74 2d 3e 43 5f 47 65 74 53 65 73 73 69 6f 6e  st->C_GetSession
2fde0 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53 65 73 73  Info = C_GetSess
2fdf0 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74  ionInfo;..pFunct
2fe00 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 70  ionList->C_GetOp
2fe10 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43  erationState = C
2fe20 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
2fe30 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
2fe40 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72 61 74 69  st->C_SetOperati
2fe50 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53 65 74 4f  onState = C_SetO
2fe60 70 65 72 61 74 69 6f 6e 53 74 61 74 65 3b 0a 09  perationState;..
2fe70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2fe80 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f 67 69 6e  _Login = C_Login
2fe90 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2fea0 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20 43 5f 4c  ->C_Logout = C_L
2feb0 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63 74 69 6f  ogout;..pFunctio
2fec0 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61 74 65 4f  nList->C_CreateO
2fed0 62 6a 65 63 74 20 3d 20 43 5f 43 72 65 61 74 65  bject = C_Create
2fee0 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
2fef0 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70 79 4f 62  onList->C_CopyOb
2ff00 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79 4f 62 6a  ject = C_CopyObj
2ff10 65 63 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ect;..pFunctionL
2ff20 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f 79 4f 62  ist->C_DestroyOb
2ff30 6a 65 63 74 20 3d 20 43 5f 44 65 73 74 72 6f 79  ject = C_Destroy
2ff40 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
2ff50 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4f 62 6a  onList->C_GetObj
2ff60 65 63 74 53 69 7a 65 20 3d 20 43 5f 47 65 74 4f  ectSize = C_GetO
2ff70 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70 46 75 6e  bjectSize;..pFun
2ff80 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2ff90 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d  AttributeValue =
2ffa0 20 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56   C_GetAttributeV
2ffb0 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  alue;..pFunction
2ffc0 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74 74 72 69  List->C_SetAttri
2ffd0 62 75 74 65 56 61 6c 75 65 20 3d 20 43 5f 53 65  buteValue = C_Se
2ffe0 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 3b  tAttributeValue;
2fff0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30000 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e  >C_FindObjectsIn
30010 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63  it = C_FindObjec
30020 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69  tsInit;..pFuncti
30030 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62  onList->C_FindOb
30040 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e 64 4f 62  jects = C_FindOb
30050 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63 74 69 6f  jects;..pFunctio
30060 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
30070 65 63 74 73 46 69 6e 61 6c 20 3d 20 43 5f 46 69  ectsFinal = C_Fi
30080 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 3b 0a  ndObjectsFinal;.
30090 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
300a0 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 20 3d 20  C_EncryptInit = 
300b0 43 5f 45 6e 63 72 79 70 74 49 6e 69 74 3b 0a 09  C_EncryptInit;..
300c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
300d0 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f 45 6e 63  _Encrypt = C_Enc
300e0 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rypt;..pFunction
300f0 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 55  List->C_EncryptU
30100 70 64 61 74 65 20 3d 20 43 5f 45 6e 63 72 79 70  pdate = C_Encryp
30110 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
30120 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
30130 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45 6e 63 72  ptFinal = C_Encr
30140 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  yptFinal;..pFunc
30150 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72  tionList->C_Decr
30160 79 70 74 49 6e 69 74 20 3d 20 43 5f 44 65 63 72  yptInit = C_Decr
30170 79 70 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  yptInit;..pFunct
30180 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
30190 70 74 20 3d 20 43 5f 44 65 63 72 79 70 74 3b 0a  pt = C_Decrypt;.
301a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
301b0 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65 20  C_DecryptUpdate 
301c0 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
301d0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
301e0 74 2d 3e 43 5f 44 65 63 72 79 70 74 46 69 6e 61  t->C_DecryptFina
301f0 6c 20 3d 20 43 5f 44 65 63 72 79 70 74 46 69 6e  l = C_DecryptFin
30200 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
30210 73 74 2d 3e 43 5f 44 69 67 65 73 74 49 6e 69 74  st->C_DigestInit
30220 20 3d 20 43 5f 44 69 67 65 73 74 49 6e 69 74 3b   = C_DigestInit;
30230 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30240 3e 43 5f 44 69 67 65 73 74 20 3d 20 43 5f 44 69  >C_Digest = C_Di
30250 67 65 73 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  gest;..pFunction
30260 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 55 70  List->C_DigestUp
30270 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 55  date = C_DigestU
30280 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
30290 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 4b  nList->C_DigestK
302a0 65 79 20 3d 20 43 5f 44 69 67 65 73 74 4b 65 79  ey = C_DigestKey
302b0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
302c0 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 20  ->C_DigestFinal 
302d0 3d 20 43 5f 44 69 67 65 73 74 46 69 6e 61 6c 3b  = C_DigestFinal;
302e0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
302f0 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d 20 43 5f  >C_SignInit = C_
30300 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46 75 6e 63  SignInit;..pFunc
30310 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
30320 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70 46 75 6e   = C_Sign;..pFun
30330 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
30340 6e 55 70 64 61 74 65 20 3d 20 43 5f 53 69 67 6e  nUpdate = C_Sign
30350 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
30360 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 46 69  onList->C_SignFi
30370 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46 69 6e 61  nal = C_SignFina
30380 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
30390 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f 76 65 72  t->C_SignRecover
303a0 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e 52 65 63  Init = C_SignRec
303b0 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63  overInit;..pFunc
303c0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
303d0 52 65 63 6f 76 65 72 20 3d 20 43 5f 53 69 67 6e  Recover = C_Sign
303e0 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
303f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
30400 79 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79  yInit = C_Verify
30410 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
30420 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 20 3d  List->C_Verify =
30430 20 43 5f 56 65 72 69 66 79 3b 0a 09 70 46 75 6e   C_Verify;..pFun
30440 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
30450 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 56 65  ifyUpdate = C_Ve
30460 72 69 66 79 55 70 64 61 74 65 3b 0a 09 70 46 75  rifyUpdate;..pFu
30470 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
30480 72 69 66 79 46 69 6e 61 6c 20 3d 20 43 5f 56 65  rifyFinal = C_Ve
30490 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70 46 75 6e  rifyFinal;..pFun
304a0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72  ctionList->C_Ver
304b0 69 66 79 52 65 63 6f 76 65 72 49 6e 69 74 20 3d  ifyRecoverInit =
304c0 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
304d0 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  Init;..pFunction
304e0 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66 79 52 65  List->C_VerifyRe
304f0 63 6f 76 65 72 20 3d 20 43 5f 56 65 72 69 66 79  cover = C_Verify
30500 52 65 63 6f 76 65 72 3b 0a 09 70 46 75 6e 63 74  Recover;..pFunct
30510 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
30520 74 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  tEncryptUpdate =
30530 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74   C_DigestEncrypt
30540 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
30550 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
30560 74 44 69 67 65 73 74 55 70 64 61 74 65 20 3d 20  tDigestUpdate = 
30570 43 5f 44 65 63 72 79 70 74 44 69 67 65 73 74 55  C_DecryptDigestU
30580 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
30590 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 45 6e 63  nList->C_SignEnc
305a0 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 53  ryptUpdate = C_S
305b0 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
305c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
305d0 2d 3e 43 5f 44 65 63 72 79 70 74 56 65 72 69 66  ->C_DecryptVerif
305e0 79 55 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72  yUpdate = C_Decr
305f0 79 70 74 56 65 72 69 66 79 55 70 64 61 74 65 3b  yptVerifyUpdate;
30600 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30610 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 20 3d  >C_GenerateKey =
30620 20 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 3b 0a   C_GenerateKey;.
30630 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
30640 43 5f 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69  C_GenerateKeyPai
30650 72 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  r = C_GenerateKe
30660 79 50 61 69 72 3b 0a 09 70 46 75 6e 63 74 69 6f  yPair;..pFunctio
30670 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70 4b 65 79  nList->C_WrapKey
30680 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b 0a 09 70   = C_WrapKey;..p
30690 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
306a0 55 6e 77 72 61 70 4b 65 79 20 3d 20 43 5f 55 6e  UnwrapKey = C_Un
306b0 77 72 61 70 4b 65 79 3b 0a 09 70 46 75 6e 63 74  wrapKey;..pFunct
306c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 72 69 76  ionList->C_Deriv
306d0 65 4b 65 79 20 3d 20 43 5f 44 65 72 69 76 65 4b  eKey = C_DeriveK
306e0 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
306f0 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e 64 6f 6d  st->C_SeedRandom
30700 20 3d 20 43 5f 53 65 65 64 52 61 6e 64 6f 6d 3b   = C_SeedRandom;
30710 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30720 3e 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f  >C_GenerateRando
30730 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 52 61  m = C_GenerateRa
30740 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ndom;..pFunction
30750 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
30760 69 6f 6e 53 74 61 74 75 73 20 3d 20 43 5f 47 65  ionStatus = C_Ge
30770 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 3b  tFunctionStatus;
30780 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
30790 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69 6f  >C_CancelFunctio
307a0 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63  n = C_CancelFunc
307b0 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tion;..pFunction
307c0 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75 6e 63 74  List->C_GetFunct
307d0 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47 65 74 46  ionList = C_GetF
307e0 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a 0a 09 2a  unctionList;...*
307f0 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  ppFunctionList =
30800 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a   pFunctionList;.
30810 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
30820 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
30830 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
30840 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
30850 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a           (CKR_OK);.}..