Hex Artifact Content

Artifact 13b6e88e7c87750caeeea1d093e5858cb79de17c:


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 2c 20 69 6e 63 6c 75  certs = 0, inclu
1a7f0 64 65 5f 64 6f 64 5f 63 65 72 74 73 3b 0a 0a 09  de_dod_certs;...
1a800 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a810 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1a820 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64 20  ..if (ids_found 
1a830 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
1a840 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1a850 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66 6f  ("Error.  ids_fo
1a860 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a  und is NULL");..
1a870 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
1a880 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45  .}..#ifdef CACKE
1a890 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43 4c  Y_CARD_SLOT_INCL
1a8a0 55 44 45 5f 45 58 54 52 41 5f 43 45 52 54 53 0a  UDE_EXTRA_CERTS.
1a8b0 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63  .include_extra_c
1a8c0 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66  erts = 1;.#endif
1a8d0 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
1a8e0 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53 5f  ACKEY_DOD_CERTS_
1a8f0 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21 3d  ON_HW_SLOTS") !=
1a900 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c 75   NULL) {...inclu
1a910 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20 3d  de_extra_certs =
1a920 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65 74   1;..}...if (get
1a930 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f 44  env("CACKEY_NO_D
1a940 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f 53  OD_CERTS_ON_HW_S
1a950 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  LOTS") != NULL) 
1a960 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  {...include_extr
1a970 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d 0a  a_certs = 0;..}.
1a980 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 4e  .#ifdef CACKEY_N
1a990 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 0a 09 69  O_EXTRA_CERTS..i
1a9a0 66 20 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45  f (getenv("CACKE
1a9b0 59 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20  Y_EXTRA_CERTS") 
1a9c0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63  != NULL) {...inc
1a9d0 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 20 3d  lude_dod_certs =
1a9e0 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09   1;..} else {...
1a9f0 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65 72 74  include_dod_cert
1aa00 73 20 3d 20 30 3b 0a 09 7d 0a 23 65 6c 73 65 0a  s = 0;..}.#else.
1aa10 09 69 66 20 28 67 65 74 65 6e 76 28 22 43 41 43  .if (getenv("CAC
1aa20 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43 45 52  KEY_NO_EXTRA_CER
1aa30 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  TS") != NULL) {.
1aa40 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64 5f 63 65  ..include_dod_ce
1aa50 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65  rts = 0;..} else
1aa60 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 64 6f 64   {...include_dod
1aa70 5f 63 65 72 74 73 20 3d 20 31 3b 0a 09 7d 0a 23  _certs = 1;..}.#
1aa80 65 6e 64 69 66 0a 0a 09 69 66 20 28 69 6e 63 6c  endif...if (incl
1aa90 75 64 65 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b  ude_dod_certs) {
1aaa0 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  ...num_dod_certs
1aab0 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f   = sizeof(extra_
1aac0 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  certs) / sizeof(
1aad0 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b  extra_certs[0]);
1aae0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 6e 75 6d  ..} else {...num
1aaf0 5f 64 6f 64 5f 63 65 72 74 73 20 3d 20 30 3b 0a  _dod_certs = 0;.
1ab00 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69  .}...if (slot->i
1ab10 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75 6d  nternal) {...num
1ab20 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 72 65  _ids = cackey_re
1ab30 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69 65  ad_dod_identitie
1ab40 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64 5f  s(NULL, num_dod_
1ab50 63 65 72 74 73 29 3b 0a 0a 09 09 69 66 20 28 6e  certs);....if (n
1ab60 75 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a 09  um_ids != 0) {..
1ab70 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d  ..identities = m
1ab80 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20  alloc(num_ids * 
1ab90 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1aba0 65 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  es));.....cackey
1abb0 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1abc0 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 2c  ties(identities,
1abd0 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b   num_dod_certs);
1abe0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 69  ...} else {....i
1abf0 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c  dentities = NULL
1ac00 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66 6f  ;...}....*ids_fo
1ac10 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a  und = num_ids;..
1ac20 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74  ..return(identit
1ac30 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f  ies);..}...pcsc_
1ac40 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61 63  identities = cac
1ac50 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28 73  key_read_certs(s
1ac60 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f  lot, NULL, &num_
1ac70 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63 73  certs);..if (pcs
1ac80 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20  c_identities != 
1ac90 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f 6e  NULL) {.../* Con
1aca0 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20 43  vert number of C
1acb0 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20 6f  erts to number o
1acc0 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09 6e  f objects */...n
1acd0 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50 52  um_ids = (CKO_PR
1ace0 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f 5f  IVATE_KEY - CKO_
1acf0 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31 29  CERTIFICATE + 1)
1ad00 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a 09   * num_certs;...
1ad10 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78 74  .if (include_ext
1ad20 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 6e  ra_certs) {....n
1ad30 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65 79  um_ids += cackey
1ad40 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
1ad50 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64  ties(NULL, num_d
1ad60 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a  od_certs);...}..
1ad70 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 6d  ..identities = m
1ad80 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a 20  alloc(num_ids * 
1ad90 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1ada0 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64 20  es));..../* Add 
1adb0 63 65 72 74 69 66 69 63 61 74 65 73 2c 20 70 75  certificates, pu
1adc0 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64 20 70  blic keys, and p
1add0 72 69 76 61 74 65 20 6b 65 79 73 20 66 72 6f 6d  rivate keys from
1ade0 20 74 68 65 20 73 6d 61 72 74 63 61 72 64 20 2a   the smartcard *
1adf0 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b 0a  /...id_idx = 0;.
1ae00 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78 20  ..for (cert_idx 
1ae10 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c 20  = 0; cert_idx < 
1ae20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74 5f  num_certs; cert_
1ae30 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72 20  idx++) {....for 
1ae40 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d 20  (curr_id_type = 
1ae50 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 3b  CKO_CERTIFICATE;
1ae60 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c 3d   curr_id_type <=
1ae70 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
1ae80 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b 2b  ; curr_id_type++
1ae90 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74 69  ) {.....identiti
1aea0 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
1aeb0 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f 67  butes = cackey_g
1aec0 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63 75  et_attributes(cu
1aed0 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63 73  rr_id_type, &pcs
1aee0 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72  c_identities[cer
1aef0 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64 78  t_idx], cert_idx
1af00 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64  , &identities[id
1af10 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
1af20 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69 64  _count);......id
1af30 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1af40 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 3d  .pcsc_identity =
1af50 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
1af60 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
1af70 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
1af80 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69  ));.....memcpy(i
1af90 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1afa0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2c  ].pcsc_identity,
1afb0 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65   &pcsc_identitie
1afc0 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73 69 7a  s[cert_idx], siz
1afd0 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b  eof(*identities[
1afe0 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
1aff0 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 69 64  ntity));......id
1b000 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
1b010 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  .pcsc_identity->
1b020 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61  certificate = ma
1b030 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e 74 69  lloc(pcsc_identi
1b040 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
1b050 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1b060 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65 6e  .....memcpy(iden
1b070 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 70  tities[id_idx].p
1b080 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
1b090 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63 5f  rtificate, pcsc_
1b0a0 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74 5f  identities[cert_
1b0b0 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
1b0c0 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  , pcsc_identitie
1b0d0 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72 74  s[cert_idx].cert
1b0e0 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09  ificate_len);...
1b0f0 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09 09  ...id_idx++;....
1b100 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e 63  }...}....if (inc
1b110 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73  lude_extra_certs
1b120 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1b130 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63 6c  BUG_PRINTF("Incl
1b140 75 64 69 6e 67 20 55 53 20 47 6f 76 65 72 6e 6d  uding US Governm
1b150 65 6e 74 20 43 65 72 74 69 66 69 63 61 74 65 73  ent Certificates
1b160 20 6f 6e 20 68 61 72 64 77 61 72 65 20 73 6c 6f   on hardware slo
1b170 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  t");.....cackey_
1b180 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74  read_dod_identit
1b190 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 20 2b  ies(identities +
1b1a0 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f 64   id_idx, num_dod
1b1b0 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09 09  _certs);...}....
1b1c0 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
1b1d0 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65  s(pcsc_identitie
1b1e0 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31 29  s, num_certs, 1)
1b1f0 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64 20  ;....*ids_found 
1b200 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72 65  = num_ids;....re
1b210 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73 29  turn(identities)
1b220 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f 75  ;..}....*ids_fou
1b230 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 28  nd = 0;..return(
1b240 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  NULL);.}..CK_DEF
1b250 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1b260 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65  RV, C_Initialize
1b270 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 49  )(CK_VOID_PTR pI
1b280 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f 43  nitArgs) {..CK_C
1b290 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47 53  _INITIALIZE_ARGS
1b2a0 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09 75   CK_PTR args;..u
1b2b0 69 6e 74 33 32 5f 74 20 69 64 78 2c 20 68 69 67  int32_t idx, hig
1b2c0 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74 20  hest_slot;..int 
1b2d0 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b 0a  mutex_init_ret;.
1b2e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b2f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1b300 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 69  ;...if (cackey_i
1b310 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1b320 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1b330 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c 72  NTF("Error.  Alr
1b340 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65 64  eady initialized
1b350 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b360 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52 45  KR_CRYPTOKI_ALRE
1b370 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  ADY_INITIALIZED)
1b380 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69 74  ;..}...if (pInit
1b390 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Args != NULL) {.
1b3a0 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41 72  ..args = pInitAr
1b3b0 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63 61  gs;...memcpy(&ca
1b3c0 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73 2c  ckey_args, args,
1b3d0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 61   sizeof(cackey_a
1b3e0 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61 72  rgs));....if (ar
1b3f0 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78 20  gs->CreateMutex 
1b400 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d  == NULL || args-
1b410 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d 3d  >DestroyMutex ==
1b420 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c   NULL || args->L
1b430 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
1b440 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b   || args->Unlock
1b450 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Mutex == NULL) {
1b460 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43 72  ....if (args->Cr
1b470 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55 4c  eateMutex != NUL
1b480 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74 72  L || args->Destr
1b490 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20  oyMutex != NULL 
1b4a0 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75 74  || args->LockMut
1b4b0 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex != NULL || ar
1b4c0 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78 20  gs->UnlockMutex 
1b4d0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 43  != NULL) {.....C
1b4e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1b4f0 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65 2c  TF("Error. Some,
1b500 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68 72   but not All thr
1b510 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76 65  eading primitive
1b520 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a 0a  s provided.");..
1b530 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1b540 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1b550 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  ..}...}..} else 
1b560 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73 2e  {...cackey_args.
1b570 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e 55  CreateMutex = NU
1b580 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67  LL;...cackey_arg
1b590 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d  s.DestroyMutex =
1b5a0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1b5b0 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20 3d  args.LockMutex =
1b5c0 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1b5d0 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78  args.UnlockMutex
1b5e0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65   = NULL;...cacke
1b5f0 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20 30  y_args.flags = 0
1b600 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
1b610 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
1b620 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1b630 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
1b640 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
1b650 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63 61  ); idx++) {...ca
1b660 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1b670 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  x].active = 0;..
1b680 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30  }...for (idx = 0
1b690 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28  ; idx < (sizeof(
1b6a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1b6b0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1b6c0 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29  ots[0])); idx++)
1b6d0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74   {...cackey_slot
1b6e0 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20  s[idx].active = 
1b6f0 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
1b700 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61 64  s[idx].pcsc_read
1b710 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63  er = NULL;...cac
1b720 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74  key_slots[idx].t
1b730 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
1b740 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1b750 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61  lots[idx].transa
1b760 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
1b770 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ck = 0;...cackey
1b780 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f 74  _slots[idx].slot
1b790 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63 61  _reset = 0;...ca
1b7a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1b7b0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
1b7c0 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
1b7d0 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  idx].label = NUL
1b7e0 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  L;...cackey_slot
1b7f0 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 20  s[idx].internal 
1b800 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65  = 0;..}...if (ge
1b810 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f  tenv("CACKEY_NO_
1b820 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21 3d  EXTRA_CERTS") !=
1b830 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1b840 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b850 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e 63  Asked not to inc
1b860 6c 75 64 65 20 44 6f 44 20 63 65 72 74 69 66 69  lude DoD certifi
1b870 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73 65  cates");..} else
1b880 20 7b 0a 09 09 68 69 67 68 65 73 74 5f 73 6c 6f   {...highest_slo
1b890 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t = (sizeof(cack
1b8a0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1b8b0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1b8c0 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41 43  0])) - 1;....CAC
1b8d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b8e0 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44 20  ("Including DoD 
1b8f0 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 20 25 6c  certs in slot %l
1b900 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  u", (unsigned lo
1b910 6e 67 29 20 68 69 67 68 65 73 74 5f 73 6c 6f 74  ng) highest_slot
1b920 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  );....cackey_slo
1b930 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d  ts[highest_slot]
1b940 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 63  .active = 1;...c
1b950 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1b960 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  est_slot].intern
1b970 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65 79  al = 1;...cackey
1b980 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73  _slots[highest_s
1b990 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75 6e  lot].label = (un
1b9a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 22  signed char *) "
1b9b0 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43 65  US Government Ce
1b9c0 72 74 69 66 69 63 61 74 65 73 22 3b 0a 09 09 63  rtificates";...c
1b9d0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68  ackey_slots[high
1b9e0 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  est_slot].pcsc_r
1b9f0 65 61 64 65 72 20 3d 20 22 43 41 43 4b 65 79 22  eader = "CACKey"
1ba00 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1ba10 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 74  [highest_slot].t
1ba20 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b 0a  oken_flags = 0;.
1ba30 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69 74  .}...cackey_init
1ba40 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09 69  ialized = 1;...i
1ba50 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c 6f  f (!cackey_biglo
1ba60 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75 74  ck_init) {...mut
1ba70 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63 61  ex_init_ret = ca
1ba80 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61 74  ckey_mutex_creat
1ba90 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  e(&cackey_bigloc
1baa0 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65 78  k);....if (mutex
1bab0 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29 20  _init_ret != 0) 
1bac0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
1bad0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1bae0 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c 69    Mutex initiali
1baf0 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22 29  zation failed.")
1bb00 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ;.....return(CKR
1bb10 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09 7d  _CANT_LOCK);...}
1bb20 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ....cackey_biglo
1bb30 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d 0a  ck_init = 1;..}.
1bb40 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1bb50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1bb60 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1bb70 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1bb80 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1bb90 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1bba0 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69 7a  CK_RV, C_Finaliz
1bbb0 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
1bbc0 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69 6e  Reserved) {..uin
1bbd0 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41 43  t32_t idx;...CAC
1bbe0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1bbf0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1bc00 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d 20  f (pReserved != 
1bc10 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1bc20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1bc30 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64 20  rror. pReserved 
1bc40 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
1bc50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1bc60 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1bc70 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1bc80 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1bc90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1bca0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1bcb0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1bcc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1bcd0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1bce0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 66  IALIZED);..}...f
1bcf0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
1bd00 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1bd10 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
1bd20 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
1bd30 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  ions[0])); idx++
1bd40 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65 79  ) {...if (cackey
1bd50 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 61  _sessions[idx].a
1bd60 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43 6c  ctive) {....C_Cl
1bd70 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29 3b  oseSession(idx);
1bd80 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ...}..}...cackey
1bd90 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
1bda0 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20 28  t_all();...for (
1bdb0 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
1bdc0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1bdd0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1bde0 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b  ckey_slots[0]));
1bdf0 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
1be00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1be10 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ].internal) {...
1be20 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a 0a  .continue;...}..
1be30 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1be40 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
1be50 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28 63  der) {....free(c
1be60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1be70 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09  .pcsc_reader);..
1be80 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79  .}....if (cackey
1be90 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63 68  _slots[idx].cach
1bea0 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09 63  ed_certs) {....c
1beb0 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
1bec0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1bed0 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 2c  x].cached_certs,
1bee0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64   cackey_slots[id
1bef0 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 5f  x].cached_certs_
1bf00 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09 63  count, 1);.....c
1bf10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1bf20 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d 20  .cached_certs = 
1bf30 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63  NULL;...}..}...c
1bf40 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
1bf50 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b 65  nnect();...cacke
1bf60 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  y_initialized = 
1bf70 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
1bf80 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1bf90 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1bfa0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1bfb0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1bfc0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1bfd0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 49  ON(CK_RV, C_GetI
1bfe0 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54 52  nfo)(CK_INFO_PTR
1bff0 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74 69   pInfo) {..stati
1c000 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d 61  c CK_UTF8CHAR ma
1c010 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20 3d  nufacturerID[] =
1c020 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65 6e   "U.S. Governmen
1c030 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55  t";..static CK_U
1c040 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79 44  TF8CHAR libraryD
1c050 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22  escription[] = "
1c060 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b 45  CACKey";...CACKE
1c070 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c080 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1c090 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20  (pInfo == NULL) 
1c0a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c0b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c0c0 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29  pInfo is NULL.")
1c0d0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c0e0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1c0f0 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1c100 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1c110 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c120 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1c130 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1c140 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1c150 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1c160 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1c170 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
1c180 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20  Version.major = 
1c190 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
1c1a0 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
1c1b0 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
1c1c0 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69 56  pInfo->cryptokiV
1c1d0 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28  ersion.minor = (
1c1e0 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49  (CACKEY_CRYPTOKI
1c1f0 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20 3e  _VERSION_CODE) >
1c200 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 6d  > 8) & 0xff;...m
1c210 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emset(pInfo->man
1c220 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20 27  ufacturerID, ' '
1c230 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e  , sizeof(pInfo->
1c240 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 29  manufacturerID))
1c250 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
1c260 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
1c270 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c   manufacturerID,
1c280 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63 74   sizeof(manufact
1c290 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a 09  urerID) - 1);...
1c2a0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 30  pInfo->flags = 0
1c2b0 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70 49  x00;...memset(pI
1c2c0 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63  nfo->libraryDesc
1c2d0 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69  ription, ' ', si
1c2e0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62 72  zeof(pInfo->libr
1c2f0 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29 29  aryDescription))
1c300 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
1c310 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  >libraryDescript
1c320 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73 63  ion, libraryDesc
1c330 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66 28  ription, sizeof(
1c340 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69  libraryDescripti
1c350 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e 66  on) - 1);...pInf
1c360 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69 6f  o->libraryVersio
1c370 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65  n.major = (cacke
1c380 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e  y_getversion() >
1c390 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09 70  > 16) & 0xff;..p
1c3a0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72  Info->libraryVer
1c3b0 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61  sion.minor = (ca
1c3c0 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
1c3d0 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
1c3e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1c3f0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1c400 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1c410 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1c420 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  (CKR_OK);.}../*.
1c430 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74 20   * Process list 
1c440 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64 20  of readers, and 
1c450 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20 62  create mapping b
1c460 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e 61  etween reader na
1c470 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a 20  me and slot ID. 
1c480 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
1c490 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
1c4a0 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f 42  etSlotList)(CK_B
1c4b0 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65 6e  BOOL tokenPresen
1c4c0 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54  t, CK_SLOT_ID_PT
1c4d0 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b 5f  R pSlotList, CK_
1c4e0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75  ULONG_PTR pulCou
1c4f0 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69 6e  nt) {..static in
1c500 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20 31  t first_call = 1
1c510 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
1c520 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  val;..int pcsc_c
1c530 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b 5f  onnect_ret;..CK_
1c540 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c 6f  ULONG count, slo
1c550 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75 72  t_count = 0, cur
1c560 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78 3b  rslot, slot_idx;
1c570 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
1c580 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61 64  ders, *pcsc_read
1c590 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65 61  ers_s, *pcsc_rea
1c5a0 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20 70  ders_e;..DWORD p
1c5b0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b  csc_readers_len;
1c5c0 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69 73  ..LONG scard_lis
1c5d0 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09 73  treaders_ret;..s
1c5e0 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64 65  ize_t curr_reade
1c5f0 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f 74  r_len;..int slot
1c600 5f 72 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45 59  _reset;...CACKEY
1c610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1c620 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1c630 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  pulCount == NULL
1c640 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1c650 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1c660 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e 55  . pulCount is NU
1c670 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1c680 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1c690 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1c6a0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1c6b0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1c6c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c6d0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1c6e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1c6f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1c700 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1c710 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1c720 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1c730 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1c740 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1c750 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1c760 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c770 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1c780 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1c790 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1c7a0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1c7b0 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72 20  ;..}.../* Clear 
1c7c0 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a 2f  list of slots */
1c7d0 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30  ..slot_reset = 0
1c7e0 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ;..if (pSlotList
1c7f0 29 20 7b 0a 09 09 69 66 20 28 66 69 72 73 74 5f  ) {...if (first_
1c800 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73 74  call) {....first
1c810 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09 73  _call = 0;.....s
1c820 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09  lot_reset = 1;..
1c830 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79 20  .}..../* If any 
1c840 6f 66 20 74 68 65 20 73 6c 6f 74 73 20 68 61 76  of the slots hav
1c850 65 20 62 65 65 6e 20 72 65 73 65 74 20 74 68 65  e been reset the
1c860 6e 20 70 75 72 67 65 20 61 6c 6c 20 69 6e 66 6f  n purge all info
1c870 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 68 65 63  rmation and chec
1c880 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f 72  k again */...for
1c890 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
1c8a0 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
1c8b0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1c8c0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1c8d0 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
1c8e0 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69 66  rslot++) {....if
1c8f0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1c900 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61  urrslot].interna
1c910 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  l) {.....continu
1c920 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
1c930 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  !cackey_slots[cu
1c940 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20  rrslot].active) 
1c950 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
1c960 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61 63  ...}.....if (cac
1c970 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1c980 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29 20  ot].slot_reset) 
1c990 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65 73 65 74  {.....slot_reset
1c9a0 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72 65 61 6b   = 1;......break
1c9b0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
1c9c0 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a   (slot_reset) {.
1c9d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1c9e0 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67 20  PRINTF("Purging 
1c9f0 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61  all slot informa
1ca00 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a 20  tion.");...../* 
1ca10 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65 20  Only update the 
1ca20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69 66  list of slots if
1ca30 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c 79   we are actually
1ca40 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74 68   being supply th
1ca50 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69  e slot informati
1ca60 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f  on */....cackey_
1ca70 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74  slots_disconnect
1ca80 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72 20  _all();.....for 
1ca90 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 63  (currslot = 0; c
1caa0 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f  urrslot < (sizeo
1cab0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1cac0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1cad0 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72  slots[0])); curr
1cae0 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69 66  slot++) {.....if
1caf0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63   (cackey_slots[c
1cb00 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61  urrslot].interna
1cb10 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69 6e  l) {......contin
1cb20 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ue;.....}......i
1cb30 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1cb40 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
1cb50 65 61 64 65 72 29 20 7b 0a 09 09 09 09 09 66 72  eader) {......fr
1cb60 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
1cb70 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72  currslot].pcsc_r
1cb80 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09 63 61  eader);.......ca
1cb90 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1cba0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
1cbb0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a 0a   = NULL;.....}..
1cbc0 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
1cbd0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1cbe0 61 62 65 6c 29 20 7b 0a 09 09 09 09 09 66 72 65  abel) {......fre
1cbf0 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  e(cackey_slots[c
1cc00 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29 3b  urrslot].label);
1cc10 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1cc20 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61  ots[currslot].la
1cc30 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  bel = NULL;.....
1cc40 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  }......cackey_sl
1cc50 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1cc60 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a 09  tive = 0;....}..
1cc70 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09 09  .} else {.......
1cc80 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  }..}.../* Determ
1cc90 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61 64  ine list of read
1cca0 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f 6e  ers */..pcsc_con
1ccb0 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
1ccc0 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
1ccd0 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
1cce0 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
1ccf0 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
1cd00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cd10 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
1cd20 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
1cd30 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73 6c  , assuming no sl
1cd40 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f 63  ots");....slot_c
1cd50 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c 73  ount = 0;..} els
1cd60 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64 65  e {...pcsc_reade
1cd70 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09 73  rs_len = 0;....s
1cd80 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1cd90 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73 74  _ret = SCardList
1cda0 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79 5f  Readers(*cackey_
1cdb0 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55 4c  pcsc_handle, NUL
1cdc0 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f 72  L, NULL, &pcsc_r
1cdd0 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09 09  eaders_len);....
1cde0 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65  if (scard_listre
1cdf0 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41  aders_ret == SCA
1ce00 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52 29  RD_F_COMM_ERROR)
1ce10 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1ce20 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ce30 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  . SCardListReade
1ce40 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  rs() returned SC
1ce50 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52  ARD_F_COMM_ERROR
1ce60 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e 65  , assuming Conne
1ce70 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 77  ction to PC/SC w
1ce80 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e 6e  ent away. Reconn
1ce90 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09 63  ecting.");.....c
1cea0 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63 6f  ackey_pcsc_disco
1ceb0 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63 6b  nnect();....cack
1cec0 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
1ced0 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
1cee0 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79 69  BUG_PRINTF("Tryi
1cef0 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  ng SCardListRead
1cf00 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a 09  ers() again");..
1cf10 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
1cf20 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
1cf30 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
1cf40 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
1cf50 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73  NULL, NULL, &pcs
1cf60 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
1cf70 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64  ..}....if (scard
1cf80 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1cf90 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   == SCARD_S_SUCC
1cfa0 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61 64  ESS && pcsc_read
1cfb0 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b 0a  ers_len != 0) {.
1cfc0 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 20  ...pcsc_readers 
1cfd0 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72 65  = malloc(pcsc_re
1cfe0 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 70  aders_len);....p
1cff0 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d 20  csc_readers_s = 
1d000 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a 09  pcsc_readers;...
1d010 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
1d020 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
1d030 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
1d040 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
1d050 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64 65  NULL, pcsc_reade
1d060 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65 72  rs, &pcsc_reader
1d070 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28 73  s_len);....if (s
1d080 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1d090 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f  _ret == SCARD_S_
1d0a0 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09 70  SUCCESS) {.....p
1d0b0 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d 20  csc_readers_e = 
1d0c0 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20 70  pcsc_readers + p
1d0d0 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 3b  csc_readers_len;
1d0e0 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20 77  ....../* Start w
1d0f0 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20 74  ith Slot ID 1, t
1d100 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69 6e  o avoid a bug in
1d110 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f 0a   GDM on RHEL */.
1d120 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39 31  ..../* Bug 59491
1d130 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a 69  1: https://bugzi
1d140 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f 73  lla.redhat.com/s
1d150 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d 35  how_bug.cgi?id=5
1d160 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75 72  94911 */.....cur
1d170 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09 73  rslot = 1;.....s
1d180 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  lot_count = 0;..
1d190 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f 72  ...while (pcsc_r
1d1a0 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72 65  eaders < pcsc_re
1d1b0 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09 09  aders_e) {......
1d1c0 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76 61  /* Find next ava
1d1d0 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a 09  ilable slot */..
1d1e0 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72 73  ....for (; currs
1d1f0 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
1d200 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1d210 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1d220 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74  s[0])); currslot
1d230 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28  ++) {.......if (
1d240 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  !cackey_slots[cu
1d250 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20  rrslot].active) 
1d260 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  {........break;.
1d270 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a 0a  ......}......}..
1d280 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65 72  .....curr_reader
1d290 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70 63  _len = strlen(pc
1d2a0 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09  sc_readers);....
1d2b0 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65 61  ...if ((pcsc_rea
1d2c0 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61 64  ders + curr_read
1d2d0 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f 72  er_len) > pcsc_r
1d2e0 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09  eaders_e) {.....
1d2f0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
1d300 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f 72  ......if (curr_r
1d310 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29 20  eader_len == 0) 
1d320 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  {.......break;..
1d330 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20 28  ....}.......if (
1d340 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69 7a  currslot >= (siz
1d350 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1d360 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1d370 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
1d380 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1d390 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1d3a0 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74 68   more readers th
1d3b0 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61  an slots are ava
1d3c0 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09 09  ilable!");......
1d3d0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d 0a  ..break;......}.
1d3e0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1d3f0 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1d400 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70 63   reader: %s", pc
1d410 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09 09  sc_readers);....
1d420 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74  .../* Only updat
1d430 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73 6c  e the list of sl
1d440 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61 63  ots if we are ac
1d450 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73 6b  tually being ask
1d460 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73 6c  ed supply the sl
1d470 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  ot information *
1d480 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f 74  /......if (pSlot
1d490 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69 66  List) {.......if
1d4a0 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b 0a   (slot_reset) {.
1d4b0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1d4c0 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63  ots[currslot].ac
1d4d0 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09 09  tive = 1;.......
1d4e0 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1d4f0 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61 6c  rrslot].internal
1d500 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63   = 0;........cac
1d510 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1d520 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 20  ot].pcsc_reader 
1d530 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72 65  = strdup(pcsc_re
1d540 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09 63  aders);........c
1d550 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1d560 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64 5f  slot].pcsc_card_
1d570 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09  connected = 0;..
1d580 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ......cackey_slo
1d590 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72 61  ts[currslot].tra
1d5a0 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
1d5b0 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65   0;........cacke
1d5c0 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1d5d0 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65  ].transaction_ne
1d5e0 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b 0a  ed_hw_lock = 0;.
1d5f0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1d600 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 6f  ots[currslot].to
1d610 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46 5f  ken_flags = CKF_
1d620 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b 0a  LOGIN_REQUIRED;.
1d630 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1d640 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61  ots[currslot].la
1d650 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  bel = NULL;.....
1d660 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
1d670 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63 6b  slot_reset(&cack
1d680 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1d690 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09  t]);.......}....
1d6a0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
1d6b0 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c 79  ./* Artificially
1d6c0 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e 75   increase the nu
1d6d0 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20 73  mber of active s
1d6e0 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77 69 6c  lots by what wil
1d6f0 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65 20  l become active 
1d700 2a 2f 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63 6f  */.......slot_co
1d710 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09 09  unt++;......}...
1d720 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a 0a  ...currslot++;..
1d730 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65 72  .....pcsc_reader
1d740 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65 72  s += curr_reader
1d750 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d 0a  _len + 1;.....}.
1d760 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72 73 6c  .....for (currsl
1d770 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f 74  ot = 0; currslot
1d780 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65   < (sizeof(cacke
1d790 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f  y_slots) / sizeo
1d7a0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30  f(cackey_slots[0
1d7b0 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b 29  ])); currslot++)
1d7c0 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61 63 6b   {......if (cack
1d7d0 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1d7e0 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  t].active) {....
1d7f0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d800 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61 63  PRINTF("Found ac
1d810 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 22 2c 20  tive slot %lu", 
1d820 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
1d830 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09 09  currslot);......
1d840 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b 0a  ..slot_count++;.
1d850 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09  .....}.....}....
1d860 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
1d870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d880 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74 6f  ("Second call to
1d890 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65 72   SCardListReader
1d8a0 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e  s failed, return
1d8b0 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45 59   %s/%li", CACKEY
1d8c0 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52  _DEBUG_FUNC_SCAR
1d8d0 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72  DERR_TO_STR(scar
1d8e0 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1d8f0 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
1d900 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74  _listreaders_ret
1d910 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65 65  );....}.....free
1d920 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 29  (pcsc_readers_s)
1d930 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
1d940 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1d950 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c 20  NTF("First call 
1d960 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  to SCardListRead
1d970 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75  ers failed, retu
1d980 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b  rn %s/%li", CACK
1d990 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
1d9a0 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63  ARDERR_TO_STR(sc
1d9b0 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1d9c0 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
1d9d0 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1d9e0 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  et);...}..}...mu
1d9f0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1da00 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1da10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1da20 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1da30 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1da40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1da50 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1da60 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1da70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1da80 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1da90 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73 74  ...if (pSlotList
1daa0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
1dab0 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f 63  ulCount = slot_c
1dac0 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ount;....CACKEY_
1dad0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1dae0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1daf0 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75 20  %i).  Found %lu 
1db00 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f 74  readers, but not
1db10 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70 53   storing IDs (pS
1db20 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c 29  lotList == NULL)
1db30 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69  ", CKR_OK, (unsi
1db40 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f  gned long) slot_
1db50 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75 72  count);....retur
1db60 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
1db70 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75 6e  count = *pulCoun
1db80 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c 20  t;..if (count < 
1db90 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09 09  slot_count) {...
1dba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dbb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72  NTF("Error. User
1dbc0 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65   allocated %lu e
1dbd0 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 68  ntries, but we h
1dbe0 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73 2e  ave %lu entries.
1dbf0 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 63  ", count, slot_c
1dc00 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59  ount);....CACKEY
1dc10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1dc20 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46  eturning CKR_BUF
1dc30 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29 3b  FER_TOO_SMALL");
1dc40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 42  ....return(CKR_B
1dc50 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
1dc60 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  ;...}...mutex_re
1dc70 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1dc80 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
1dc90 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1dca0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1dcb0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1dcc0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1dcd0 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
1dce0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1dcf0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
1dd00 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69 64  R);..}...slot_id
1dd10 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75 72  x = 0;..for (cur
1dd20 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72 72  rslot = 0; (curr
1dd30 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1dd40 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1dd50 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1dd60 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73 6c  ts[0]))); currsl
1dd70 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63  ot++) {...if (!c
1dd80 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1dd90 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
1dda0 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d  ...continue;...}
1ddb0 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64 78  ....if (slot_idx
1ddc0 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09 09   >= count) {....
1ddd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1dde0 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65 72  NTF("Error. User
1ddf0 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20 65   allocated %lu e
1de00 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20 6a  ntries, but we j
1de10 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72 69  ust tried to wri
1de20 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69 6e  te to the %lu in
1de30 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67 22  dex -- ignoring"
1de40 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69 64  , count, slot_id
1de50 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75 65  x);.....continue
1de60 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c 69  ;...}....pSlotLi
1de70 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20 63  st[slot_idx] = c
1de80 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74 5f  urrslot;...slot_
1de90 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74 65  idx++;..}...mute
1dea0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1deb0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1dec0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1ded0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1dee0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1def0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1df00 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1df10 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1df20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1df30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1df40 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
1df50 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b 45  t_count;...CACKE
1df60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1df70 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1df80 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c   (%i).  Found %l
1df90 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b 52  u readers.", CKR
1dfa0 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  _OK, (unsigned l
1dfb0 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74 29  ong) slot_count)
1dfc0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
1dfd0 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73 65  K);...tokenPrese
1dfe0 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65 6e  nt = tokenPresen
1dff0 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75 6e  t; /* Supress un
1e000 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77 61  used variable wa
1e010 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44  rning */.}..CK_D
1e020 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1e030 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74 49  K_RV, C_GetSlotI
1e040 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  nfo)(CK_SLOT_ID 
1e050 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54 5f  slotID, CK_SLOT_
1e060 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20  INFO_PTR pInfo) 
1e070 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46  {..static CK_UTF
1e080 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72 69  8CHAR slotDescri
1e090 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b 65  ption[] = "CACKe
1e0a0 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d 75  y Slot";..int mu
1e0b0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1e0c0 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
1e0d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e0e0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1e0f0 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
1e100 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1e110 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e120 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
1e130 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1e140 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1e150 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1e160 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1e170 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1e180 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e190 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1e1a0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1e1b0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1e1c0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1e1d0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
1e1e0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
1e1f0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1e200 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1e210 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1e220 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1e230 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e240 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1e250 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1e260 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
1e270 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
1e280 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
1e290 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1e2a0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1e2b0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e2c0 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1e2d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1e2e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1e2f0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e300 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e310 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1e320 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1e330 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1e340 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1e350 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1e360 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
1e370 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e380 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e390 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1e3a0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1e3b0 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
1e3c0 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
1e3d0 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
1e3e0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1e3f0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1e400 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1e410 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1e420 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d  ..pInfo->flags =
1e430 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a 09   CKF_HW_SLOT;...
1e440 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74  if (!cackey_slot
1e450 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72 6e  s[slotID].intern
1e460 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66  al) {...pInfo->f
1e470 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d 4f  lags |= CKF_REMO
1e480 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09 7d  VABLE_DEVICE;..}
1e490 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
1e4a0 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
1e4b0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1e4c0 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) == CACKEY_PCS
1e4d0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
1e4e0 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  ) {...pInfo->fla
1e4f0 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e 5f  gs |= CKF_TOKEN_
1e500 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62 79  PRESENT;..}...by
1e510 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73 74  tes_to_copy = st
1e520 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f 74  rlen(cackey_slot
1e530 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72  s[slotID].pcsc_r
1e540 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69 7a  eader);..if (siz
1e550 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  eof(pInfo->manuf
1e560 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79 74  acturerID) < byt
1e570 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09 09  es_to_copy) {...
1e580 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20  bytes_to_copy = 
1e590 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
1e5a0 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a 09  nufacturerID);..
1e5b0 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  }..memcpy(pInfo-
1e5c0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
1e5d0 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c   cackey_slots[sl
1e5e0 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64 65  otID].pcsc_reade
1e5f0 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  r, bytes_to_copy
1e600 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  );...mutex_retva
1e610 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1e620 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
1e630 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1e640 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1e650 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1e660 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1e670 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
1e680 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1e690 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1e6a0 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74  OR);..}...memset
1e6b0 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73 63  (pInfo->slotDesc
1e6c0 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73 69  ription, ' ', si
1e6d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74  zeof(pInfo->slot
1e6e0 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a 09  Description));..
1e6f0 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73 6c  memcpy(pInfo->sl
1e700 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20 73  otDescription, s
1e710 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
1e720 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63 72  sizeof(slotDescr
1e730 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09  iption) - 1);...
1e740 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
1e750 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
1e760 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1e770 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1e780 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
1e790 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
1e7a0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
1e7b0 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
1e7c0 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
1e7d0 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
1e7e0 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
1e7f0 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1e800 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
1e810 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
1e820 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
1e830 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
1e840 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
1e850 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45 59  = 0x00;...CACKEY
1e860 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e870 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1e880 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1e890 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1e8a0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1e8b0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1e8c0 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28 43  _GetTokenInfo)(C
1e8d0 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1e8e0 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f 5f  , CK_TOKEN_INFO_
1e8f0 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
1e900 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1e910 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b   manufacturerID[
1e920 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e  ] = "U.S. Govern
1e930 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43  ment";..static C
1e940 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61 75  K_UTF8CHAR defau
1e950 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e 6b  ltLabel[] = "Unk
1e960 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73 74  nown Token";..st
1e970 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1e980 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43 20   model[] = "CAC 
1e990 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74 20  Token";..struct 
1e9a0 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
1e9b0 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e 74  tity *pcsc_ident
1e9c0 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65 64  ities;..unsigned
1e9d0 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73 3b   long num_certs;
1e9e0 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c 5f  ..ssize_t label_
1e9f0 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ret;..int mutex_
1ea00 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73 65  retval;..int use
1ea10 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b 0a  _default_label;.
1ea20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ea30 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1ea40 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
1ea50 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1ea60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ea70 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
1ea80 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1ea90 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1eaa0 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1eab0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1eac0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1ead0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1eae0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1eaf0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1eb00 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1eb10 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1eb20 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
1eb30 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
1eb40 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
1eb50 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1eb60 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1eb70 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
1eb80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eb90 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
1eba0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
1ebb0 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
1ebc0 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
1ebd0 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
1ebe0 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1ebf0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  LID);..}...mutex
1ec00 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1ec10 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1ec20 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1ec30 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1ec40 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1ec50 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ec60 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1ec70 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1ec80 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1ec90 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
1eca0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1ecb0 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
1ecc0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1ecd0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1ece0 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
1ecf0 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
1ed00 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
1ed10 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
1ed20 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
1ed30 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1ed40 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
1ed50 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1ed60 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1ed70 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f 6b  ..if (cackey_tok
1ed80 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63 6b  en_present(&cack
1ed90 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1eda0 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  ) != CACKEY_PCSC
1edb0 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
1edc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1edd0 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f 6b  G_PRINTF("No tok
1ede0 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  en is present in
1edf0 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c 20   slotID = %lu", 
1ee00 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
1ee10 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1ee20 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ee30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 54  ....return(CKR_T
1ee40 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e 54  OKEN_NOT_PRESENT
1ee50 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
1ee60 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1ee70 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1ee80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1ee90 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1eea0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1eeb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1eec0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1eed0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1eee0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1eef0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ERROR);..}.../* 
1ef00 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e 20  Determine token 
1ef10 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74 69  label from certi
1ef20 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d 73  ficates */..mems
1ef30 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c  et(pInfo->label,
1ef40 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1ef50 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75 73  fo->label));..us
1ef60 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20  e_default_label 
1ef70 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  = 1;...if (cacke
1ef80 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1ef90 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b  label == NULL) {
1efa0 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ...pcsc_identiti
1efb0 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64  es = cackey_read
1efc0 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f 73  _certs(&cackey_s
1efd0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e 55  lots[slotID], NU
1efe0 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29 3b  LL, &num_certs);
1eff0 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65 6e  ...if (pcsc_iden
1f000 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29 20  tities != NULL) 
1f010 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65 72  {....if (num_cer
1f020 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c 61  ts > 0) {.....la
1f030 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  bel_ret = cackey
1f040 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f 74  _pcsc_identity_t
1f050 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64 65  o_label(pcsc_ide
1f060 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d 3e  ntities, pInfo->
1f070 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49  label, sizeof(pI
1f080 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 09  nfo->label));...
1f090 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74 20  ..if (label_ret 
1f0a0 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65 5f  > 0) {......use_
1f0b0 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d 20  default_label = 
1f0c0 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f  0;.......cackey_
1f0d0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
1f0e0 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  bel = malloc(siz
1f0f0 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  eof(pInfo->label
1f100 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70 79  ));.......memcpy
1f110 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1f120 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49 6e  otID].label, pIn
1f130 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f  fo->label, sizeo
1f140 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29  f(pInfo->label))
1f150 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
1f160 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
1f170 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ts(pcsc_identiti
1f180 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31  es, num_certs, 1
1f190 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
1f1a0 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ...memcpy(pInfo-
1f1b0 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f 73  >label, cackey_s
1f1c0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62  lots[slotID].lab
1f1d0 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f  el, sizeof(pInfo
1f1e0 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75 73  ->label));....us
1f1f0 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20  e_default_label 
1f200 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73  = 0;..}...if (us
1f210 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 29  e_default_label)
1f220 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66   {...memcpy(pInf
1f230 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75 6c  o->label, defaul
1f240 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 64  tLabel, sizeof(d
1f250 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20 31  efaultLabel) - 1
1f260 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28 70  );..}...memset(p
1f270 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72  Info->manufactur
1f280 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65 6f  erID, ' ', sizeo
1f290 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  f(pInfo->manufac
1f2a0 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d 63  turerID));..memc
1f2b0 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  py(pInfo->manufa
1f2c0 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66 61  cturerID, manufa
1f2d0 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f 66  cturerID, sizeof
1f2e0 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  (manufacturerID)
1f2f0 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74 28   - 1);...memset(
1f300 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27 20  pInfo->model, ' 
1f310 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1f320 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63 70  >model));..memcp
1f330 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20  y(pInfo->model, 
1f340 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d 6f  model, sizeof(mo
1f350 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d  del) - 1);...mem
1f360 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69 61  set(pInfo->seria
1f370 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73 69  lNumber, ' ', si
1f380 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72 69  zeof(pInfo->seri
1f390 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d 65  alNumber));...me
1f3a0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63 54  mset(pInfo->utcT
1f3b0 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66  ime, ' ', sizeof
1f3c0 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65 29  (pInfo->utcTime)
1f3d0 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72 64  );...pInfo->hard
1f3e0 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f  wareVersion.majo
1f3f0 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74 76  r = (cackey_getv
1f400 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29 20  ersion() >> 16) 
1f410 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d 3e  & 0xff;..pInfo->
1f420 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e  hardwareVersion.
1f430 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f  minor = (cackey_
1f440 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20  getversion() >> 
1f450 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49 6e  8) & 0xff;...pIn
1f460 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72 73  fo->firmwareVers
1f470 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30 30  ion.major = 0x00
1f480 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61  ;..pInfo->firmwa
1f490 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  reVersion.minor 
1f4a0 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f 2d  = 0x00;...pInfo-
1f4b0 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52 49  >flags = CKF_WRI
1f4c0 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20 43  TE_PROTECTED | C
1f4d0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49 54  KF_USER_PIN_INIT
1f4e0 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54 4f  IALIZED | CKF_TO
1f4f0 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44 20  KEN_INITIALIZED 
1f500 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  | cackey_slots[s
1f510 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
1f520 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  gs;...pInfo->ulM
1f530 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  axSessionCount =
1f540 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1f550 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1f560 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1f570 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70 49  ns[0])) - 1;..pI
1f580 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43 6f  nfo->ulSessionCo
1f590 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  unt = CK_UNAVAIL
1f5a0 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
1f5b0 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78 52  ;..pInfo->ulMaxR
1f5c0 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20  wSessionCount = 
1f5d0 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77 53  0;..pInfo->ulRwS
1f5e0 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43 4b  essionCount = CK
1f5f0 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46  _UNAVAILABLE_INF
1f600 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f  ORMATION;..pInfo
1f610 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d 20  ->ulMaxPinLen = 
1f620 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  128;..pInfo->ulM
1f630 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09 70  inPinLen = 0;..p
1f640 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75 62  Info->ulTotalPub
1f650 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55  licMemory = CK_U
1f660 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52  NAVAILABLE_INFOR
1f670 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e  MATION;..pInfo->
1f680 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d 6f  ulFreePublicMemo
1f690 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41  ry = CK_UNAVAILA
1f6a0 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b  BLE_INFORMATION;
1f6b0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c  ..pInfo->ulTotal
1f6c0 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20  PrivateMemory = 
1f6d0 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49  CK_UNAVAILABLE_I
1f6e0 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e  NFORMATION;..pIn
1f6f0 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61 74  fo->ulFreePrivat
1f700 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41  eMemory = CK_UNA
1f710 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41  VAILABLE_INFORMA
1f720 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  TION;...CACKEY_D
1f730 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1f740 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1f750 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1f760 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1f770 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1f780 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 57  CTION(CK_RV, C_W
1f790 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 29  aitForSlotEvent)
1f7a0 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73 2c  (CK_FLAGS flags,
1f7b0 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52 20   CK_SLOT_ID_PTR 
1f7c0 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49 44  pSlotID, CK_VOID
1f7d0 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29 20  _PTR pReserved) 
1f7e0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
1f7f0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1f800 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72 76  );...if (pReserv
1f810 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ed != NULL) {...
1f820 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f830 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65 73  NTF("Error. pRes
1f840 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c  erved is not NUL
1f850 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
1f860 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
1f870 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
1f880 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1f890 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1f8a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1f8b0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1f8c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1f8d0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1f8e0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1f8f0 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f 44  .}.../* XXX: TOD
1f900 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68 69  O: Implement thi
1f910 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59 5f  s... */..CACKEY_
1f920 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1f930 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
1f940 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
1f950 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
1f960 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1f970 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
1f980 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
1f990 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
1f9a0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1f9b0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d  ON(CK_RV, C_GetM
1f9c0 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43 4b  echanismList)(CK
1f9d0 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c  _SLOT_ID slotID,
1f9e0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59   CK_MECHANISM_TY
1f9f0 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  PE_PTR pMechanis
1fa00 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  mList, CK_ULONG_
1fa10 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
1fa20 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fa30 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
1fa40 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1fa50 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1fa60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fa70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1fa80 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1fa90 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1faa0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1fab0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1fac0 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
1fad0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1fae0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1faf0 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20 69  ror.  pulCount i
1fb00 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
1fb10 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
1fb20 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
1fb30 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74   (pMechanismList
1fb40 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a 70   == NULL) {...*p
1fb50 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09 09  ulCount = 1;....
1fb60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fb70 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1fb80 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1fb90 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
1fba0 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
1fbb0 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31 29   (*pulCount < 1)
1fbc0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fbd0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fbe0 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d 61    Buffer too sma
1fbf0 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ll.");....return
1fc00 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f  (CKR_BUFFER_TOO_
1fc10 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d 65  SMALL);..}...pMe
1fc20 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20 3d  chanismList[0] =
1fc30 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a 09   CKM_RSA_PKCS;..
1fc40 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a  *pulCount = 1;..
1fc50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fc60 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1fc70 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1fc80 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
1fc90 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
1fca0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1fcb0 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68 61  K_RV, C_GetMecha
1fcc0 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f  nismInfo)(CK_SLO
1fcd0 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f  T_ID slotID, CK_
1fce0 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 74  MECHANISM_TYPE t
1fcf0 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ype, CK_MECHANIS
1fd00 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f  M_INFO_PTR pInfo
1fd10 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
1fd20 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f  etval;...CACKEY_
1fd30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
1fd40 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70  lled.");...if (p
1fd50 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Info == NULL) {.
1fd60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fd70 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 49  RINTF("Error. pI
1fd80 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  nfo is NULL.");.
1fd90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
1fda0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
1fdb0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
1fdc0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
1fdd0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1fde0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
1fdf0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
1fe00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
1fe10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
1fe20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
1fe30 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
1fe40 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
1fe50 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1fe60 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1fe70 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
1fe80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fe90 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1fea0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1feb0 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
1fec0 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
1fed0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1fee0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
1fef0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
1ff00 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
1ff10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
1ff20 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1ff30 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
1ff40 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
1ff50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ff60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
1ff70 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1ff80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1ff90 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1ffa0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1ffb0 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
1ffc0 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
1ffd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ffe0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1fff0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
20000 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
20010 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
20020 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
20030 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20040 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20050 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
20060 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
20070 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
20080 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
20090 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
200a0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
200b0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
200c0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
200d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
200e0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
200f0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
20100 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
20110 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
20120 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09 09  itch (type) {...
20130 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  case CKM_RSA_PKC
20140 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d  S:....pInfo->ulM
20150 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32 3b  inKeySize = 512;
20160 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  ....pInfo->ulMax
20170 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b 0a  KeySize = 8192;.
20180 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
20190 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f 45  = CKF_HW | CKF_E
201a0 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45 43  NCRYPT | CKF_DEC
201b0 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e 20  RYPT | CKF_SIGN 
201c0 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09 09  | CKF_VERIFY;...
201d0 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41 43  .break;..}...CAC
201e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
201f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20200 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
20210 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20220 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64 6f  OK);.}../* We do
20230 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69 73  n't support this
20240 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f 44   method. */.CK_D
20250 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
20260 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b 65  K_RV, C_InitToke
20270 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  n)(CK_SLOT_ID sl
20280 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48 41  otID, CK_UTF8CHA
20290 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55  R_PTR pPin, CK_U
202a0 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20 43  LONG ulPinLen, C
202b0 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20 70  K_UTF8CHAR_PTR p
202c0 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45 59  Label) {..CACKEY
202d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
202e0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
202f0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
20300 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
20310 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20320 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
20330 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
20340 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
20350 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
20360 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
20370 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
20380 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45 4e  urning CKR_TOKEN
20390 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44  _WRITE_PROTECTED
203a0 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b 45   (%i)", CKR_TOKE
203b0 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
203c0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
203d0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
203e0 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20 57  TECTED);.}../* W
203f0 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20  e don't support 
20400 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a  this method. */.
20410 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
20420 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74  ON(CK_RV, C_Init
20430 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  PIN)(CK_SESSION_
20440 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
20450 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
20460 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
20470 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41 43  ulPinLen) {..CAC
20480 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20490 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
204a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
204b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
204c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
204d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
204e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
204f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
20500 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
20510 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
20520 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20530 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f  Returning CKR_TO
20540 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
20550 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54  TED (%i)", CKR_T
20560 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
20570 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  CTED);...return(
20580 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
20590 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f  PROTECTED);.}../
205a0 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
205b0 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
205c0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
205d0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
205e0 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f  etPIN)(CK_SESSIO
205f0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
20600 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
20610 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f 55  TR pOldPin, CK_U
20620 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65 6e  LONG ulOldPinLen
20630 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
20640 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55 4c  R pNewPin, CK_UL
20650 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e 29  ONG ulNewPinLen)
20660 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
20670 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
20680 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20690 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
206a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
206b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
206c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
206d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
206e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
206f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20700 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20710 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
20720 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
20730 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
20740 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
20750 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
20760 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
20770 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
20780 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
20790 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
207a0 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e  V, C_OpenSession
207b0 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
207c0 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66 6c  tID, CK_FLAGS fl
207d0 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54 52  ags, CK_VOID_PTR
207e0 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20 43   pApplication, C
207f0 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79 2c  K_NOTIFY notify,
20800 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44   CK_SESSION_HAND
20810 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f 6e  LE_PTR phSession
20820 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f  ) {..unsigned lo
20830 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75 74  ng idx;..int mut
20840 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
20850 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20  found_session = 
20860 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  0;...CACKEY_DEBU
20870 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
20880 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61 67  .");...if ((flag
20890 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f 53  s & CKF_SERIAL_S
208a0 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f 53  ESSION) != CKF_S
208b0 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20 7b  ERIAL_SESSION) {
208c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
208d0 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f 4e  SSION_PARALLEL_N
208e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 09  OT_SUPPORTED);..
208f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
20900 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
20910 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20920 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
20930 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
20940 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20950 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
20960 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
20970 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
20980 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
20990 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
209a0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
209b0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
209c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
209d0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
209e0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
209f0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
20a00 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
20a10 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
20a20 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
20a30 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
20a40 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
20a50 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
20a60 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20a70 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
20a80 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
20a90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20aa0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
20ab0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
20ac0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
20ad0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
20ae0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
20af0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
20b00 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
20b10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
20b20 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
20b30 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
20b40 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
20b50 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
20b60 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
20b70 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
20b80 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20b90 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
20ba0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
20bb0 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65 72  ID);..}.../* Ver
20bc0 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61 72  ify that the car
20bd0 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 6e  d is actually in
20be0 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09 2f   the slot. */../
20bf0 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f 20  * XXX: Check to 
20c00 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69  make sure this i
20c10 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31 31  s in the PKCS#11
20c20 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 2a   specification *
20c30 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  /..if (cackey_to
20c40 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
20c50 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
20c60 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) != CACKEY_PCS
20c70 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
20c80 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
20c90 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
20ca0 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65 73  .  Card not pres
20cb0 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
20cc0 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
20cd0 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  ED");....cackey_
20ce0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20cf0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
20d00 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56 49  .return(CKR_DEVI
20d10 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d 0a  CE_REMOVED);..}.
20d20 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b 20  ..for (idx = 1; 
20d30 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
20d40 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
20d50 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
20d60 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
20d70 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63 61  x++) {...if (!ca
20d80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
20d90 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  x].active) {....
20da0 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d 20  found_session = 
20db0 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69 6f  1;.....*phSessio
20dc0 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61 63  n = idx;.....cac
20dd0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
20de0 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09  ].active = 1;...
20df0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20e00 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20 73  [idx].slotID = s
20e10 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65 79  lotID;....cackey
20e20 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
20e30 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55  tate = CKS_RO_PU
20e40 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 09  BLIC_SESSION;...
20e50 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
20e60 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66 6c  [idx].flags = fl
20e70 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ags;....cackey_s
20e80 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c 44  essions[idx].ulD
20e90 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b 0a  eviceError = 0;.
20ea0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
20eb0 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63 61  ns[idx].pApplica
20ec0 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61 74  tion = pApplicat
20ed0 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73  ion;....cackey_s
20ee0 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f 74  essions[idx].Not
20ef0 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a 09  ify = notify;...
20f00 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
20f10 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65  s[idx].identitie
20f20 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61 63  s = NULL;....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 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b  nt = 0;.....cack
20f60 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
20f70 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d  .search_active =
20f80 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73   0;.....cackey_s
20f90 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69 67  essions[idx].sig
20fa0 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  n_active = 0;...
20fb0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
20fc0 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f 61  s[idx].decrypt_a
20fd0 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09 63  ctive = 0;.....c
20fe0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
20ff0 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d  dx].identities =
21000 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65   cackey_read_ide
21010 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f  ntities(&cackey_
21020 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26  slots[slotID], &
21030 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
21040 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  idx].identities_
21050 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72 65  count);......bre
21060 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75 74  ak;...}..}...mut
21070 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
21080 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
21090 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
210a0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
210b0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
210c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
210d0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
210e0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
210f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
21100 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
21110 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65 73  ..if (!found_ses
21120 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45 59  sion) {...CACKEY
21130 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
21140 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45 53  eturning CKR_SES
21150 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29 22  SION_COUNT (%i)"
21160 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f  , CKR_SESSION_CO
21170 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  UNT);....return(
21180 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55 4e  CKR_SESSION_COUN
21190 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  T);..}...CACKEY_
211a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
211b0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
211c0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
211d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
211e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
211f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
21200 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43 4b  CloseSession)(CK
21210 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
21220 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e 74  hSession) {..int
21230 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
21240 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21250 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
21260 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
21270 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
21280 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21290 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
212a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
212b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
212c0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
212d0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
212e0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
212f0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
21300 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
21310 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
21320 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
21330 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
21340 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21350 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
21360 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
21370 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
21380 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
21390 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
213a0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
213b0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
213c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
213d0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
213e0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
213f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21400 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
21410 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
21420 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21430 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
21440 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
21450 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21460 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
21470 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
21480 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21490 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
214a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
214b0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
214c0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
214d0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
214e0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
214f0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
21500 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
21510 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61 63  active = 0;..cac
21520 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74  key_free_identit
21530 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ies(cackey_sessi
21540 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
21550 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65 79  entities, cackey
21560 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
21570 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63  on].identities_c
21580 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f 72  ount);...mutex_r
21590 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
215a0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
215b0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
215c0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
215d0 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
215e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
215f0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
21600 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21610 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21620 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
21630 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21640 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
21650 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
21660 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
21670 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
21680 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
21690 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73  V, C_CloseAllSes
216a0 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f 49  sions)(CK_SLOT_I
216b0 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69 6e  D slotID) {..uin
216c0 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74 20  t32_t idx;..int 
216d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
216e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
216f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
21700 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
21710 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
21720 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21730 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
21740 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
21750 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
21760 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
21770 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
21780 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20   (slotID < 0 || 
21790 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f  slotID >= (sizeo
217a0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
217b0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
217c0 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09  slots[0]))) {...
217d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
217e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
217f0 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
21800 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64  ed (%lu), outsid
21810 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65  e of valid range
21820 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72  ", slotID);....r
21830 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49  eturn(CKR_SLOT_I
21840 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  D_INVALID);..}..
21850 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
21860 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
21870 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
21880 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
21890 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
218a0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
218b0 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
218c0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
218d0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
218e0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
218f0 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
21900 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76  ts[slotID].activ
21910 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  e == 0) {...CACK
21920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21930 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
21940 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
21950 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63  %lu), slot not c
21960 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22  urrently active"
21970 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61  , slotID);....ca
21980 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
21990 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
219a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
219b0 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44  _SLOT_ID_INVALID
219c0 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  );..}...for (idx
219d0 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
219e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
219f0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
21a00 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
21a10 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
21a20 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
21a30 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20  ns[idx].active) 
21a40 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  {....if (cackey_
21a50 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 6c  sessions[idx].sl
21a60 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29 20  otID != slotID) 
21a70 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  {.....continue;.
21a80 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f  ...}.....cackey_
21a90 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21aa0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
21ab0 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28  .C_CloseSession(
21ac0 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f  idx);....cackey_
21ad0 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
21ae0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d 0a  y_biglock);...}.
21af0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
21b00 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
21b10 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
21b20 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21b30 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21b40 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21b50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21b60 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
21b70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21b80 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21b90 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
21ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
21bb0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
21bc0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
21bd0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
21be0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
21bf0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
21c00 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 29  _GetSessionInfo)
21c10 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
21c20 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
21c30 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54 52  SESSION_INFO_PTR
21c40 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d   pInfo) {..int m
21c50 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43  utex_retval;...C
21c60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
21c70 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
21c80 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55  .if (pInfo == NU
21c90 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
21ca0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21cb0 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c  or. pInfo is NUL
21cc0 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  L.");....return(
21cd0 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41  CKR_ARGUMENTS_BA
21ce0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
21cf0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
21d00 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21d10 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21d20 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
21d30 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21d40 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
21d50 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
21d60 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
21d70 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
21d80 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
21d90 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
21da0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
21db0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
21dc0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21dd0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
21de0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
21df0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
21e00 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
21e10 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
21e20 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
21e30 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
21e40 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
21e50 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
21e60 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
21e70 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
21e80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
21e90 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
21ea0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
21eb0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
21ec0 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
21ed0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21ee0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
21ef0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
21f00 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
21f10 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
21f20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21f30 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
21f40 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
21f50 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
21f60 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
21f70 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e 66  ALID);..}...pInf
21f80 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  o->slotID = cack
21f90 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21fa0 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09 70  sion].slotID;..p
21fb0 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63 61  Info->state = ca
21fc0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
21fd0 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a 09  ession].state;..
21fe0 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 63  pInfo->flags = c
21ff0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22000 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b 0a  Session].flags;.
22010 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63 65  .pInfo->ulDevice
22020 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f 73  Error = cackey_s
22030 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
22040 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b  ].ulDeviceError;
22050 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
22060 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
22070 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
22080 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
22090 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
220a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
220b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
220c0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
220d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
220e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
220f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
22100 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
22110 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
22120 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
22130 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
22140 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
22150 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
22160 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
22170 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
22180 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
22190 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72 61  _BYTE_PTR pOpera
221a0 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55 4c  tionState, CK_UL
221b0 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72 61  ONG_PTR pulOpera
221c0 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b 0a  tionStateLen) {.
221d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
221e0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
221f0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
22200 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
22210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22220 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
22230 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
22240 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
22250 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
22260 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
22270 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22280 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22290 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
222a0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
222b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
222c0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
222d0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
222e0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
222f0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
22300 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
22310 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
22320 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
22330 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
22340 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70   CK_BYTE_PTR pOp
22350 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b  erationState, CK
22360 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74 69  _ULONG ulOperati
22370 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f 4f  onStateLen, CK_O
22380 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45 6e  BJECT_HANDLE hEn
22390 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b 5f  cryptionKey, CK_
223a0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 41  OBJECT_HANDLE hA
223b0 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65 79  uthenticationKey
223c0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
223d0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
223e0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
223f0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
22400 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22410 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22420 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
22430 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
22440 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
22450 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
22460 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22470 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
22480 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
22490 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
224a0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
224b0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
224c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
224d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
224e0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
224f0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
22500 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b 5f  RV, C_Login)(CK_
22510 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
22520 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45 52  Session, CK_USER
22530 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c 20  _TYPE userType, 
22540 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
22550 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  pPin, CK_ULONG u
22560 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f 53  lPinLen) {..CK_S
22570 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
22580 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
22590 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
225a0 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f 67  aining;..int log
225b0 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59  in_ret;...CACKEY
225c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
225d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
225e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
225f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
22600 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
22610 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22620 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22630 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22640 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22650 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
22660 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
22670 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
22680 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22690 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
226a0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
226b0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
226c0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
226d0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
226e0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
226f0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
22700 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
22710 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73 65  D);..}...if (use
22720 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53 45  rType != CKU_USE
22730 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  R) {...CACKEY_DE
22740 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22750 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  r.  We only supp
22760 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20 61  ort USER mode, a
22770 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f 64  sked for %lu mod
22780 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  e.", (unsigned l
22790 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a 0a  ong) userType)..
227a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53 45  ..return(CKR_USE
227b0 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29 3b  R_TYPE_INVALID);
227c0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
227d0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
227e0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
227f0 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
22800 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
22810 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22820 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22830 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
22840 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22850 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22860 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
22870 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
22880 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
22890 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
228a0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
228b0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
228c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
228d0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
228e0 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
228f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
22900 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
22910 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  ALID);..}...slot
22920 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
22930 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22940 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
22950 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
22960 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
22970 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
22980 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
22990 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
229a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
229b0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
229c0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
229d0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
229e0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
229f0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
22a00 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
22a10 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
22a20 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
22a30 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
22a40 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
22a50 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22a60 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
22a70 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
22a80 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
22a90 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
22aa0 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
22ab0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
22ac0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
22ad0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
22ae0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c 6f  _ERROR);..}...lo
22af0 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  gin_ret = cackey
22b00 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f 73  _login(&cackey_s
22b10 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70 50  lots[slotID], pP
22b20 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26 74  in, ulPinLen, &t
22b30 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b  ries_remaining);
22b40 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  ..if (login_ret 
22b50 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
22b60 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  _OK) {...cackey_
22b70 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
22b80 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
22b90 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d  .if (login_ret =
22ba0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
22bb0 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41 43  LOCKED) {....CAC
22bc0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22bd0 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e 20  ("Error.  Token 
22be0 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a 09  is locked.");...
22bf0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
22c00 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
22c10 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50  gs |= CKF_USER_P
22c20 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09 72  IN_LOCKED;.....r
22c30 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c 4f  eturn(CKR_PIN_LO
22c40 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65 20  CKED);...} else 
22c50 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d 3d  if (login_ret ==
22c60 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 42   CACKEY_PCSC_E_B
22c70 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43 4b  ADPIN) {....CACK
22c80 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22c90 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69 64  "Error.  Invalid
22ca0 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61 63   PIN.");.....cac
22cb0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22cc0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
22cd0 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f   CKF_USER_PIN_CO
22ce0 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66 20  UNT_LOW;.....if 
22cf0 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  (tries_remaining
22d00 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61 63   == 1) {.....cac
22d10 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
22d20 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c 3d  ].token_flags |=
22d30 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49   CKF_USER_PIN_FI
22d40 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a 09  NAL_TRY;....}...
22d50 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e  ..return(CKR_PIN
22d60 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09 7d  _INCORRECT);...}
22d70 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
22d80 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
22d90 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20 72   Unknown error r
22da0 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61 63  eturned from cac
22db0 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69 29  key_login() (%i)
22dc0 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a 0a  ", login_ret);..
22dd0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
22de0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
22df0 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  ..cackey_slots[s
22e00 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61  lotID].token_fla
22e10 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45 52  gs &= ~(CKF_USER
22e20 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43 4b  _PIN_LOCKED | CK
22e30 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e 54  F_USER_PIN_COUNT
22e40 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49 4e  _LOW | CKF_LOGIN
22e50 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46 5f  _REQUIRED | CKF_
22e60 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f 54  USER_PIN_FINAL_T
22e70 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  RY);...cackey_se
22e80 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22e90 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
22ea0 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b 0a  USER_FUNCTIONS;.
22eb0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
22ec0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
22ed0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
22ee0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
22ef0 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
22f00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22f10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
22f20 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
22f30 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22f40 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22f50 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
22f60 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
22f70 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
22f80 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
22f90 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
22fa0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
22fb0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c 6f  TION(CK_RV, C_Lo
22fc0 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  gout)(CK_SESSION
22fd0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
22fe0 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20  ) {..CK_SLOT_ID 
22ff0 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75 74  slotID;..int mut
23000 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43  ex_retval;...CAC
23010 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23020 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
23030 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
23040 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
23050 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23060 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
23070 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
23080 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
23090 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
230a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
230b0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
230c0 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
230d0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
230e0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
230f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
23100 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
23110 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23120 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
23130 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
23140 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
23150 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
23160 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
23170 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
23180 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
23190 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
231a0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
231b0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
231c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
231d0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
231e0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
231f0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
23200 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
23210 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
23220 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
23230 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
23240 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
23250 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
23260 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23270 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
23280 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
23290 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
232a0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
232b0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
232c0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
232d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
232e0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
232f0 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
23300 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
23310 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
23320 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
23330 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
23340 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23350 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
23360 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
23370 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
23380 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
23390 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
233a0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
233b0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
233c0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
233d0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
233e0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
233f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23400 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
23410 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
23420 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
23430 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
23440 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
23450 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
23460 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
23470 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
23480 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
23490 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
234a0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74  ons[hSession].st
234b0 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55 42  ate = CKS_RO_PUB
234c0 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63 61  LIC_SESSION;..ca
234d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
234e0 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  D].token_flags =
234f0 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
23500 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74  RED;...mutex_ret
23510 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
23520 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23530 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
23540 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
23550 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23560 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23570 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
23580 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23590 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
235a0 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  RROR);..}...CACK
235b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
235c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
235d0 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
235e0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
235f0 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
23600 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23610 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74 29   C_CreateObject)
23620 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
23630 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
23640 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
23650 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
23660 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  G ulCount, CK_OB
23670 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
23680 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43  phObject) {..CAC
23690 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
236a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
236b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
236c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
236d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
236e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
236f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
23700 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
23710 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
23720 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
23730 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23740 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
23750 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23760 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
23770 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23780 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
23790 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
237a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
237b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
237c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43 6f  TION(CK_RV, C_Co
237d0 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45 53  pyObject)(CK_SES
237e0 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
237f0 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
23800 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20  HANDLE hObject, 
23810 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
23820 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
23830 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
23840 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
23850 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29 20  TR phNewObject) 
23860 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
23870 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
23880 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
23890 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
238a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
238b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
238c0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
238d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
238e0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
238f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
23900 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23910 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
23920 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23930 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
23940 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
23950 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
23960 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
23970 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23980 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
23990 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
239a0 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65 63  , C_DestroyObjec
239b0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
239c0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
239d0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
239e0 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43 4b  hObject) {..CACK
239f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
23a00 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
23a10 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
23a20 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
23a30 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23a40 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
23a50 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
23a60 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
23a70 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
23a80 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
23a90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
23aa0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
23ab0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
23ac0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
23ad0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
23ae0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
23af0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
23b00 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
23b10 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
23b20 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
23b30 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f 53  ObjectSize)(CK_S
23b40 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
23b50 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
23b60 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  T_HANDLE hObject
23b70 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
23b80 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b 45  ulSize) {..CACKE
23b90 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23ba0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
23bb0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
23bc0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
23bd0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
23be0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
23bf0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
23c00 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
23c10 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
23c20 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
23c30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
23c40 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
23c50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
23c60 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
23c70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23c80 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
23c90 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
23ca0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
23cb0 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
23cc0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 41  ON(CK_RV, C_GetA
23cd0 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28 43  ttributeValue)(C
23ce0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
23cf0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
23d00 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
23d10 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54  ect, CK_ATTRIBUT
23d20 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c  E_PTR pTemplate,
23d30 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e   CK_ULONG ulCoun
23d40 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42 55  t) {..CK_ATTRIBU
23d50 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09  TE *curr_attr;..
23d60 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
23d70 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
23d80 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
23d90 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20 61   identity_idx, a
23da0 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61 74  ttr_idx, sess_at
23db0 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73 3b  tr_idx, num_ids;
23dc0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
23dd0 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  al;..CK_RV retva
23de0 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b 5f  l = CKR_OK;..CK_
23df0 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
23e00 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
23e10 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ueLen;...CACKEY_
23e20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
23e30 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
23e40 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
23e50 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
23e60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23e70 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
23e80 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
23e90 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
23ea0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
23eb0 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73  ;..}...if (hSess
23ec0 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73  ion == 0 || hSes
23ed0 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28  sion >= (sizeof(
23ee0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29  cackey_sessions)
23ef0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
23f00 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20  _sessions[0]))) 
23f10 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23f20 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
23f30 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20   Session out of 
23f40 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
23f50 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
23f60 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
23f70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62 6a  );..}...if (hObj
23f80 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ect == 0) {...CA
23f90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23fa0 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65 63  F("Error.  Objec
23fb0 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  t handle out of 
23fc0 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72  range.");......r
23fd0 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
23fe0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
23ff0 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f 75  ;..}...if (ulCou
24000 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20  nt == 0) {.../* 
24010 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20 69  Short circuit, i
24020 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20 77  f zero objects w
24030 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72 65  ere specified re
24040 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73 20  turn zero items 
24050 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 09  immediately */..
24060 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24070 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24080 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
24090 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
240a0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
240b0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
240c0 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d 20  f (pTemplate == 
240d0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
240e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
240f0 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74 65  rror.  pTemplate
24100 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
24110 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
24120 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
24130 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 68  identity_idx = h
24140 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d 75  Object - 1;...mu
24150 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
24160 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
24170 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24180 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
24190 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
241a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
241b0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
241c0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
241d0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
241e0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
241f0 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
24200 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
24210 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
24220 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24230 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
24240 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24250 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
24260 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
24270 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
24280 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
24290 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
242a0 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63 61  }...num_ids = ca
242b0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
242c0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
242d0 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20 28  es_count;...if (
242e0 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d 20  identity_idx >= 
242f0 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61 63  num_ids) {...cac
24300 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24310 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24320 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
24330 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24340 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65 20    Object handle 
24350 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 69  out of range.  i
24360 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25 6c  dentity_idx = %l
24370 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c 75  u, num_ids = %lu
24380 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
24390 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ng) identity_idx
243a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
243b0 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09 72  ) num_ids);....r
243c0 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43 54  eturn(CKR_OBJECT
243d0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
243e0 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79 20  ;..}...identity 
243f0 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
24400 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
24410 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74 79  ntities[identity
24420 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61 74  _idx];...for (at
24430 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
24440 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b 20  _idx < ulCount; 
24450 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  attr_idx++) {...
24460 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54 65  curr_attr = &pTe
24470 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78 5d  mplate[attr_idx]
24480 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e 55  ;....pValue = NU
24490 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65 6e  LL;...ulValueLen
244a0 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b   = (CK_LONG) -1;
244b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
244c0 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e 67  _PRINTF("Looking
244d0 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20 30   for attribute 0
244e0 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74 79  x%08lx (identity
244f0 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  :%lu) ...", (uns
24500 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
24510 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75 6e  _attr->type, (un
24520 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64 65  signed long) ide
24530 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09 66  ntity_idx);....f
24540 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64  or (sess_attr_id
24550 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72  x = 0; sess_attr
24560 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79 2d  _idx < identity-
24570 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  >attributes_coun
24580 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  t; sess_attr_idx
24590 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64 65  ++) {....if (ide
245a0 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74 65  ntity->attribute
245b0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
245c0 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61 74  .type == curr_at
245d0 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09 09  tr->type) {.....
245e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
245f0 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64 20  NTF(" ... found 
24600 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70 2c  it, pValue = %p,
24610 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25 6c   ulValueLen = %l
24620 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  u", identity->at
24630 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
24640 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20  tr_idx].pValue, 
24650 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
24660 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
24670 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
24680 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75 65  ..........pValue
24690 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   = identity->att
246a0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
246b0 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a 09  r_idx].pValue;..
246c0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
246d0 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
246e0 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
246f0 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  dx].ulValueLen;.
24700 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
24710 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75  curr_attr->pValu
24720 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a 09  e && pValue) {..
24730 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 2d  ..if (curr_attr-
24740 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 75  >ulValueLen >= u
24750 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09  lValueLen) {....
24760 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74 74  .memcpy(curr_att
24770 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c 75  r->pValue, pValu
24780 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  e, ulValueLen);.
24790 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
247a0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b  ulValueLen = (CK
247b0 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09 09  _LONG) -1;......
247c0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
247d0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09  FER_TOO_SMALL;..
247e0 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72 5f  ..}...}....curr_
247f0 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  attr->ulValueLen
24800 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09   = ulValueLen;..
24810 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
24820 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
24830 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
24840 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
24850 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
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 45 72 72 6f 72 2e 20  _PRINTF("Error. 
24880 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
24890 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
248a0 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
248b0 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 74  R);..}...if (ret
248c0 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52 49  val == CKR_ATTRI
248d0 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
248e0 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  D) {...CACKEY_DE
248f0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
24900 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49 42  rning CKR_ATTRIB
24910 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44  UTE_TYPE_INVALID
24920 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72 65   (%i)", (int) re
24930 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tval);..} else i
24940 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52  f (retval == CKR
24950 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c  _BUFFER_TOO_SMAL
24960 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
24970 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
24980 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45 52  rning CKR_BUFFER
24990 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29 22  _TOO_SMALL (%i)"
249a0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
249b0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74  ..} else if (ret
249c0 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20 7b  val == CKR_OK) {
249d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
249e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
249f0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
24a00 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
24a10 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b 45  } else {...CACKE
24a20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24a30 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
24a40 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09 7d  int) retval);..}
24a50 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
24a60 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
24a70 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
24a80 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
24a90 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  lue)(CK_SESSION_
24aa0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
24ab0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
24ac0 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54  E hObject, CK_AT
24ad0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
24ae0 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
24af0 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43 4b  ulCount) {..CACK
24b00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
24b10 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
24b20 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
24b30 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
24b40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24b50 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
24b60 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
24b70 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
24b80 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
24b90 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
24ba0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
24bb0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
24bc0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
24bd0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
24be0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
24bf0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
24c00 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
24c10 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
24c20 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24c30 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
24c40 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43 4b  dObjectsInit)(CK
24c50 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
24c60 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54 54  hSession, CK_ATT
24c70 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70  RIBUTE_PTR pTemp
24c80 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
24c90 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53 4c  lCount) {..CK_SL
24ca0 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43  OT_ID slotID;..C
24cb0 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e  K_ULONG idx;..in
24cc0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
24cd0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24ce0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
24cf0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
24d00 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
24d10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24d20 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
24d30 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
24d40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24d50 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
24d60 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
24d70 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
24d80 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
24d90 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
24da0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
24db0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
24dc0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
24dd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
24de0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
24df0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
24e00 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
24e10 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
24e20 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
24e30 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
24e40 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
24e50 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
24e60 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
24e70 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
24e80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24e90 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
24ea0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
24eb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
24ec0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
24ed0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
24ee0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24ef0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
24f00 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
24f10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
24f20 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
24f30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
24f40 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
24f50 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
24f60 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
24f70 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
24f80 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
24f90 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24fa0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
24fb0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
24fc0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
24fd0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
24fe0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24ff0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
25000 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74 69  rch already acti
25010 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
25020 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
25030 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 73  _ACTIVE);..}...s
25040 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
25050 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25060 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
25070 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
25080 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
25090 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
250a0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
250b0 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
250c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
250d0 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
250e0 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
250f0 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
25100 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
25110 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
25120 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
25130 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
25140 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
25150 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
25160 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
25170 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
25180 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
25190 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
251a0 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
251b0 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
251c0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
251d0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
251e0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
251f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25200 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
25210 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
25220 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f 72  s[slotID].slot_r
25230 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45 59  eset) {...CACKEY
25240 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
25250 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65 6e  he slot has been
25260 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65 20   reset since we 
25270 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72 20  last looked for 
25280 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72 65  identities -- re
25290 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09 69  scanning");....i
252a0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
252b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
252c0 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
252d0 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65   {....cackey_fre
252e0 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61 63  e_identities(cac
252f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25300 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
25310 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  s, cackey_sessio
25320 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
25330 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a  ntities_count);.
25340 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
25350 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
25360 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c 3b  entities = NULL;
25370 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
25380 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
25390 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d  entities_count =
253a0 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63   0;...}....if (c
253b0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
253c0 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55 4c  ID].label != NUL
253d0 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63  L) {....free(cac
253e0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
253f0 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61 63  ].label);....cac
25400 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
25410 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a  ].label = NULL;.
25420 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 61  ..}....cackey_ma
25430 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63  rk_slot_reset(&c
25440 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
25450 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f 73  ID]);...cackey_s
25460 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f  lots[slotID].slo
25470 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d 0a  t_reset = 0;..}.
25480 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
25490 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
254a0 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55  identities == NU
254b0 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  LL) {...cackey_s
254c0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
254d0 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63  ].identities = c
254e0 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
254f0 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73 6c  ities(&cackey_sl
25500 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63 61  ots[slotID], &ca
25510 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
25520 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
25530 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09  es_count);..}...
25540 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21 3d  if (pTemplate !=
25550 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 75   NULL) {...if (u
25560 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a 09  lCount != 0) {..
25570 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
25580 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
25590 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
255a0 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61 63   ulCount;....cac
255b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
255c0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
255d0 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c 43  ery = malloc(ulC
255e0 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
255f0 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09 09  Template));.....
25600 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73 65  memcpy(cackey_se
25610 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25620 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20 70  .search_query, p
25630 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75 6e  Template, ulCoun
25640 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65 6d  t * sizeof(*pTem
25650 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72 20  plate));....for 
25660 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
25670 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  ulCount; idx++) 
25680 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70 6c  {.....if (pTempl
25690 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65  ate[idx].ulValue
256a0 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09 09  Len == 0) {.....
256b0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
256c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
256d0 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
256e0 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09  lue = NULL;.....
256f0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 09  ..continue;.....
25700 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65  }......cackey_se
25710 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25720 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64  .search_query[id
25730 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c 6c  x].pValue = mall
25740 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64 78  oc(pTemplate[idx
25750 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ].ulValueLen);..
25760 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73  ....if (cackey_s
25770 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25780 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
25790 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09  dx].pValue) {...
257a0 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
257b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
257c0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
257d0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70 54  [idx].pValue, pT
257e0 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56 61  emplate[idx].pVa
257f0 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b 69  lue, pTemplate[i
25800 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  dx].ulValueLen);
25810 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d 20  .....}....}...} 
25820 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65 79  else {....cackey
25830 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25840 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
25850 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09 63  _count = 0;....c
25860 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25870 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
25880 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  query = NULL;...
25890 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
258a0 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
258b0 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  {....cackey_mute
258c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
258d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43 41  biglock);.....CA
258e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
258f0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
25900 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69 65  h query specifie
25910 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20 6e  d as NULL, but n
25920 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20 74  umber of query t
25930 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66 69  erms not specifi
25940 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09 09  ed as 0.");.....
25950 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
25960 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a 0a  ENTS_BAD);...}..
25970 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
25980 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
25990 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20 3d  ch_query_count =
259a0 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65 73   0;...cackey_ses
259b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
259c0 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20 4e  search_query = N
259d0 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ULL;..}...cackey
259e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
259f0 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
25a00 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f 73  e = 1;..cackey_s
25a10 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25a20 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64  ].search_curr_id
25a30 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72 65   = 0;...mutex_re
25a40 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
25a50 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
25a60 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
25a70 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
25a80 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
25a90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
25aa0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
25ab0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
25ac0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
25ad0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
25ae0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25af0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
25b00 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
25b10 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
25b20 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OK);.}..static i
25b30 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31 31  nt cackey_pkcs11
25b40 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62 75  _compare_attribu
25b50 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54 45  tes(CK_ATTRIBUTE
25b60 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55 54   *a, CK_ATTRIBUT
25b70 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e 65  E *b) {..unsigne
25b80 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75 66  d char *smallbuf
25b90 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73 69  , *largebuf;..si
25ba0 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  ze_t smallbuf_le
25bb0 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 3b  n, largebuf_len;
25bc0 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20 21  ...if (a->type !
25bd0 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09 72  = b->type) {...r
25be0 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09 43  eturn(0);..}...C
25bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25c00 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75 6e  TF("    ... foun
25c10 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65 20  d matching type 
25c20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  ...");...CACKEY_
25c30 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22  DEBUG_PRINTBUF("
25c40 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c 75      ... our valu
25c50 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c 20  e:", a->pValue, 
25c60 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  a->ulValueLen);.
25c70 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65 20  ..if (b->pValue 
25c80 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
25c90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25ca0 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f 75  ("       ... fou
25cb0 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74 63  nd wildcard matc
25cc0 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  h");....return(1
25cd0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e 70  );..}...if (a->p
25ce0 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  Value == NULL) {
25cf0 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d  ...return(0);..}
25d00 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61 6c  .. .if (b->ulVal
25d10 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56 61  ueLen == a->ulVa
25d20 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d 70  lueLen && memcmp
25d30 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 70  (a->pValue, b->p
25d40 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c 75  Value, b->ulValu
25d50 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09  eLen) == 0) {...
25d60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25d70 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
25d80 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74 63  found exact matc
25d90 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 31  h");....return(1
25da0 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20 28  );..}...switch (
25db0 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61 73  a->type) {...cas
25dc0 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
25dd0 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65  ..if (a->ulValue
25de0 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c 75  Len == b->ulValu
25df0 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61  eLen) {.....brea
25e00 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  k;....}.....if (
25e10 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 20  a->ulValueLen > 
25e20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b  b->ulValueLen) {
25e30 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d 20  .....smallbuf = 
25e40 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 73  b->pValue;.....s
25e50 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62 2d  mallbuf_len = b-
25e60 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 09  >ulValueLen;....
25e70 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d 3e  ..largebuf = a->
25e80 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72 67  pValue;.....larg
25e90 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75 6c  ebuf_len = a->ul
25ea0 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20 65  ValueLen;....} e
25eb0 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62  lse {.....smallb
25ec0 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b 0a  uf = a->pValue;.
25ed0 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e  ....smallbuf_len
25ee0 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e   = a->ulValueLen
25ef0 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20  ;......largebuf 
25f00 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09  = b->pValue;....
25f10 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20  .largebuf_len = 
25f20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09  b->ulValueLen;..
25f30 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20 6c  ..}.....for (; l
25f40 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20 73  argebuf_len != s
25f50 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61 72  mallbuf_len; lar
25f60 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75 66  gebuf++,largebuf
25f70 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69 66  _len--) {.....if
25f80 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21 3d   (largebuf[0] !=
25f90 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61 6b   0) {......break
25fa0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
25fb0 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c 65  .if (largebuf_le
25fc0 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65  n != smallbuf_le
25fd0 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n) {.....break;.
25fe0 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65 6d  ...}.....if (mem
25ff0 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73 6d  cmp(largebuf, sm
26000 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75 66  allbuf, smallbuf
26010 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09 09  _len) == 0) {...
26020 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26030 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e  RINTF("       ..
26040 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69 6d  . found approxim
26050 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09 09  ate match");....
26060 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09 09  ..return(1);....
26070 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
26080 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
26090 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
260a0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
260b0 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53 53  Objects)(CK_SESS
260c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
260d0 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ion, CK_OBJECT_H
260e0 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a 65  ANDLE_PTR phObje
260f0 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4d  ct, CK_ULONG ulM
26100 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20 43  axObjectCount, C
26110 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f  K_ULONG_PTR pulO
26120 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09 73  bjectCount) {..s
26130 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
26140 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b 0a  ntity *curr_id;.
26150 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 63  .CK_ATTRIBUTE *c
26160 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55 4c  urr_attr;..CK_UL
26170 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78 2c  ONG curr_id_idx,
26180 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78   curr_out_id_idx
26190 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 2c  , curr_attr_idx,
261a0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b 0a   sess_attr_idx;.
261b0 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68 65  .CK_ULONG matche
261c0 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d 61  d_count, prev_ma
261d0 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69 6e  tched_count;..in
261e0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
261f0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
26200 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
26210 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69 6d  TEST..struct tim
26220 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64 3b  eval start, end;
26230 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72 74  ..uint64_t start
26240 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a 23  _int, end_int;.#
26250 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44  endif...CACKEY_D
26260 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
26270 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
26280 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
26290 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
262a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
262b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
262c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
262d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
262e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
262f0 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62 6a  ..}...if (pulObj
26300 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c 4c  ectCount == NULL
26310 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
26320 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26330 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e  .  pulObjectCoun
26340 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
26350 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
26360 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
26370 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d  .if (phObject ==
26380 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f 62   NULL && ulMaxOb
26390 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29 20  jectCount == 0) 
263a0 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69 72  {.../* Short cir
263b0 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f 62  cuit, if zero ob
263c0 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63 69  jects were speci
263d0 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72 6f  fied return zero
263e0 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74 65   items immediate
263f0 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a 65  ly */...*pulObje
26400 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09  ctCount = 0;....
26410 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26420 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
26430 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f 72  KR_OK (%i) (shor
26440 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b 52  t circuit)", CKR
26450 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  _OK);....return(
26460 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69 66  CKR_OK);..}...if
26470 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e 55   (phObject == NU
26480 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
26490 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
264a0 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69 73  or.  phObject is
264b0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
264c0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
264d0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
264e0 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e  (ulMaxObjectCoun
264f0 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  t == 0) {...CACK
26500 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26510 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75 6d  "Error.  Maximum
26520 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   number of objec
26530 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  ts specified as 
26540 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74 75  zero.");....retu
26550 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
26560 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
26570 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
26580 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
26590 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
265a0 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
265b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
265c0 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
265d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
265e0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
265f0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
26600 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
26610 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
26620 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
26630 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
26640 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
26650 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
26660 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
26670 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
26680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
26690 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
266a0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
266b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
266c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
266d0 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
266e0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
266f0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
26700 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
26710 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
26720 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26730 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
26740 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
26750 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
26760 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
26770 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
26780 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
26790 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
267a0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 29  ].search_active)
267b0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
267c0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
267d0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
267e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
267f0 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63 68  ("Error.  Search
26800 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
26810 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
26820 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
26830 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
26840 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
26850 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
26860 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64  TEST..gettimeofd
26870 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c 29  ay(&start, NULL)
26880 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72 5f  ;.#endif...curr_
26890 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b 0a  out_id_idx = 0;.
268a0 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69 64  .for (curr_id_id
268b0 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  x = cackey_sessi
268c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
268d0 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63 75  arch_curr_id; cu
268e0 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63 6b  rr_id_idx < cack
268f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
26900 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
26910 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78 4f  _count && ulMaxO
26920 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72 72  bjectCount; curr
26930 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 63  _id_idx++) {...c
26940 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65 79  urr_id = &cackey
26950 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26960 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b 63  on].identities[c
26970 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09 09  urr_id_idx];....
26980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26990 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67 20  NTF("Processing 
269a0 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20 28  identity:%lu", (
269b0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
269c0 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09 09  urr_id_idx);....
269d0 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d 20  matched_count = 
269e0 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72 5f  0;....for (curr_
269f0 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63 75  attr_idx = 0; cu
26a00 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63 61  rr_attr_idx < ca
26a10 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26a20 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
26a30 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72 72  uery_count; curr
26a40 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09  _attr_idx++) {..
26a50 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63  ..prev_matched_c
26a60 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f 63  ount = matched_c
26a70 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f 61  ount;.....curr_a
26a80 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73 65  ttr = &cackey_se
26a90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26aa0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63 75  .search_query[cu
26ab0 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a 09  rr_attr_idx];...
26ac0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26ad0 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69 6e  RINTF("  Checkin
26ae0 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
26af0 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e 20  %s (0x%08lx) in 
26b00 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22 2c  identity:%i...",
26b10 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
26b20 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f  NC_ATTRIBUTE_TO_
26b30 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e 74  STR(curr_attr->t
26b40 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64 20  ype), (unsigned 
26b50 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 2d  long) curr_attr-
26b60 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75 72  >type, (int) cur
26b70 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43 41  r_id_idx);....CA
26b80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26b90 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20 6c  BUF("    Value l
26ba0 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63 75  ooking for:", cu
26bb0 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c  rr_attr->pValue,
26bc0 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61   curr_attr->ulVa
26bd0 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f 72  lueLen);.....for
26be0 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78 20   (sess_attr_idx 
26bf0 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f 69  = 0; sess_attr_i
26c00 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61 74  dx < curr_id->at
26c10 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b 20  tributes_count; 
26c20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b 29  sess_attr_idx++)
26c30 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65   {.....if (cacke
26c40 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72 65  y_pkcs11_compare
26c50 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75 72  _attributes(&cur
26c60 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65 73  r_id->attributes
26c70 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d 2c  [sess_attr_idx],
26c80 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a 09   curr_attr)) {..
26c90 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e  ....matched_coun
26ca0 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t++;.......break
26cb0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
26cc0 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72 69  ./* If the attri
26cd0 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  bute could not b
26ce0 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e 6f  e matched, do no
26cf0 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20 61  t try to match a
26d00 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69 62  dditional attrib
26d10 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28 70  utes */....if (p
26d20 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e  rev_matched_coun
26d30 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f 75  t == matched_cou
26d40 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  nt) {.....break;
26d50 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
26d60 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  (matched_count =
26d70 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
26d80 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26d90 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29 20  ch_query_count) 
26da0 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
26db0 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20  G_PRINTF("  ... 
26dc0 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74 65  All %i attribute
26dd0 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
26de0 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65 6e  und, adding iden
26df0 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75 72  tity:%i to retur
26e00 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74 29  ned list", (int)
26e10 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
26e20 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
26e30 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20 28  h_query_count, (
26e40 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64 78  int) curr_id_idx
26e50 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74 5b  );.....phObject[
26e60 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 5d  curr_out_id_idx]
26e70 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20 2b   = curr_id_idx +
26e80 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62 6a   1;.....ulMaxObj
26e90 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09 09  ectCount--;.....
26ea0 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 2b  curr_out_id_idx+
26eb0 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  +;...} else {...
26ec0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26ed0 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74 20  INTF("  ... Not 
26ee0 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f 75  all %i (only fou
26ef0 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74 65  nd %i) attribute
26f00 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66 6f  s checked for fo
26f10 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67 20  und, not adding 
26f20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28 69  identity:%i", (i
26f30 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  nt) cackey_sessi
26f40 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
26f50 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
26f60 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64 5f  , (int) matched_
26f70 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75 72  count, (int) cur
26f80 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a 09  r_id_idx);...}..
26f90 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  }..cackey_sessio
26fa0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
26fb0 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63 75  rch_curr_id = cu
26fc0 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75 6c  rr_id_idx;..*pul
26fd0 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63 75  ObjectCount = cu
26fe0 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a 0a  rr_out_id_idx;..
26ff0 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
27000 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45 44  BUG_SEARCH_SPEED
27010 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66 64  TEST..gettimeofd
27020 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b 0a  ay(&end, NULL);.
27030 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73 74  .start_int = (st
27040 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30 30  art.tv_sec * 100
27050 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74 76  0000) + start.tv
27060 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74 20  _usec;..end_int 
27070 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a 20  = (end.tv_sec * 
27080 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e 74  1000000) + end.t
27090 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74 66  v_usec;..fprintf
270a0 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63 68  (stderr, "Search
270b0 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f 73   took %lu micros
270c0 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73 69  econds\n", (unsi
270d0 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64 5f  gned long) (end_
270e0 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74 29  int - start_int)
270f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74 65  );.#endif...mute
27100 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
27110 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27120 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27130 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27140 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
27150 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27160 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
27170 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
27180 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
27190 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
271a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
271b0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
271c0 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75 6d  CKR_OK (%i), num
271d0 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22 2c   objects = %lu",
271e0 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62 6a   CKR_OK, *pulObj
271f0 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65 74  ectCount);...ret
27200 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
27210 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
27220 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 64  ON(CK_RV, C_Find
27230 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43 4b  ObjectsFinal)(CK
27240 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
27250 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b 5f  hSession) {..CK_
27260 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74 20  ULONG idx;..int 
27270 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
27280 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27290 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
272a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
272b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
272c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
272d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
272e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
272f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27300 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27310 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
27320 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
27330 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
27340 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
27350 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
27360 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
27370 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
27380 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27390 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
273a0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
273b0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
273c0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
273d0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
273e0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
273f0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
27400 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27410 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
27420 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
27430 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27440 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
27450 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
27460 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
27470 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
27480 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
27490 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
274a0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
274b0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
274c0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
274d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
274e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
274f0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
27500 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
27510 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
27520 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
27530 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
27540 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
27550 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  on].search_activ
27560 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
27570 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
27580 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
27590 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
275a0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
275b0 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  ch not active.")
275c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
275d0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
275e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
275f0 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
27600 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
27610 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  rch_active = 0;.
27620 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
27630 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65 73  idx < cackey_ses
27640 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
27650 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75  search_query_cou
27660 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  nt; idx++) {...i
27670 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
27680 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
27690 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70  rch_query[idx].p
276a0 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65 65  Value) {....free
276b0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
276c0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
276d0 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56 61  h_query[idx].pVa
276e0 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  lue);...}..}...i
276f0 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f (cackey_sessio
27700 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
27710 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09 66  rch_query) {...f
27720 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
27730 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
27740 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d 0a  arch_query);..}.
27750 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
27760 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
27770 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
27780 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
27790 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
277a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
277b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
277c0 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
277d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
277e0 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
277f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
27800 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
27810 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
27820 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
27830 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
27840 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
27850 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
27860 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53 45  cryptInit)(CK_SE
27870 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
27880 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e  ssion, CK_MECHAN
27890 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  ISM_PTR pMechani
278a0 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  sm, CK_OBJECT_HA
278b0 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41  NDLE hKey) {..CA
278c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
278d0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
278e0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
278f0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
27900 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27910 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
27920 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
27930 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
27940 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
27950 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
27960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27970 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
27980 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27990 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
279a0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
279b0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
279c0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
279d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
279e0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
279f0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
27a00 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53 49  ncrypt)(CK_SESSI
27a10 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
27a20 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
27a30 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
27a40 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
27a50 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
27a60 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dData, CK_ULONG_
27a70 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
27a80 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  DataLen) {..CACK
27a90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27aa0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
27ab0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
27ac0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
27ad0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27ae0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
27af0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
27b00 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
27b10 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
27b20 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
27b30 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
27b40 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
27b50 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27b60 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
27b70 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
27b80 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
27b90 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
27ba0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
27bb0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
27bc0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e 63  ION(CK_RV, C_Enc
27bd0 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53  ryptUpdate)(CK_S
27be0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
27bf0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
27c00 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
27c10 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43  ONG ulPartLen, C
27c20 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
27c30 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
27c40 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79  ONG_PTR pulEncry
27c50 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09  ptedPartLen) {..
27c60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27c70 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
27c80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
27c90 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
27ca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27cb0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
27cc0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
27cd0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
27ce0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
27cf0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
27d00 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27d10 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
27d20 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
27d30 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
27d40 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
27d50 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
27d60 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
27d70 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
27d80 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
27d90 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
27da0 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _EncryptFinal)(C
27db0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
27dc0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
27dd0 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63 72  TE_PTR pLastEncr
27de0 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
27df0 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74 45  ONG_PTR pulLastE
27e00 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29  ncryptedPartLen)
27e10 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
27e20 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
27e30 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
27e40 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
27e50 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27e60 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
27e70 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
27e80 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27e90 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27ea0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27eb0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27ec0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
27ed0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
27ee0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
27ef0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
27f00 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
27f10 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
27f20 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
27f30 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
27f40 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
27f50 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69 74  V, C_DecryptInit
27f60 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27f70 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27f80 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
27f90 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
27fa0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
27fb0 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
27fc0 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b  etval;...hKey--;
27fd0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
27fe0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
27ff0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
28000 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
28010 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28020 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
28030 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
28040 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28050 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
28060 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28070 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20  .if (pMechanism 
28080 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
28090 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
280a0 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
280b0 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ism is NULL.");.
280c0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
280d0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
280e0 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
280f0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20  m->mechanism != 
28100 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a  CKM_RSA_PKCS) {.
28110 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28120 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
28130 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
28140 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65  ism not specifie
28150 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  d as CKM_RSA_PKC
28160 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  S");....return(C
28170 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52  KR_MECHANISM_PAR
28180 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  AM_INVALID);..}.
28190 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
281a0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
281b0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
281c0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
281d0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
281e0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
281f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28200 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
28210 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
28220 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
28230 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
28240 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
28250 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
28260 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
28270 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
28280 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
28290 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
282a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
282b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
282c0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
282d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
282e0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
282f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
28300 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
28310 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
28320 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
28330 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
28340 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
28350 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
28360 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
28370 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
28380 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
28390 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
283a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
283b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
283c0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
283d0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
283e0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
283f0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28400 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28410 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28420 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79 20  Decrypt already 
28430 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b 0a  in progress.");.
28440 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28450 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56 45  OPERATION_ACTIVE
28460 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65 79  );..}...if (hKey
28470 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69   >= cackey_sessi
28480 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
28490 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 20  entities_count) 
284a0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
284b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
284c0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
284d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
284e0 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61 6e  "Error.  Key han
284f0 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dle out of range
28500 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79 20   (requested key 
28510 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69 64  %lu, only %lu id
28520 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61 62  entities availab
28530 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  le).", (unsigned
28540 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75 6e   long) hKey, (un
28550 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61 63  signed long) cac
28560 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28570 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
28580 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74  s_count);....ret
28590 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e 44  urn(CKR_KEY_HAND
285a0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
285b0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
285c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
285d0 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b 0a  ypt_active = 1;.
285e0 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
285f0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
28600 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d 20  ypt_mechanism = 
28610 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68  pMechanism->mech
28620 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f 73  anism;..cackey_s
28630 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28640 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f 70  ].decrypt_mech_p
28650 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d  arm = pMechanism
28660 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09 63  ->pParameter;..c
28670 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28680 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
28690 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d 20  _mech_parmlen = 
286a0 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50 61  pMechanism->ulPa
286b0 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61 63  rameterLen;..cac
286c0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
286d0 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
286e0 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b 65  dentity = &cacke
286f0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28700 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
28710 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f 72  hKey];...mutex_r
28720 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
28730 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28740 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
28750 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28760 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28770 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28780 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
28790 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
287a0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
287b0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
287c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
287d0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
287e0 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
287f0 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
28800 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  _OK);.}..CK_DEFI
28810 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
28820 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43 4b  V, C_Decrypt)(CK
28830 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
28840 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
28850 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65 64  E_PTR pEncrypted
28860 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
28870 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65  lEncryptedDataLe
28880 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
28890 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
288a0 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b  TR pulDataLen) {
288b0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61 6c  ..CK_ULONG datal
288c0 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61 6c  en_update, datal
288d0 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52 56  en_final;..CK_RV
288e0 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09 69   decrypt_ret;..i
288f0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
28900 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28910 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
28920 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
28930 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
28940 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28950 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
28960 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
28970 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28980 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
28990 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
289a0 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e 20  .if (pulDataLen 
289b0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
289c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
289d0 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74 61  ("Error. pulData
289e0 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  Len is NULL.");.
289f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
28a00 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
28a10 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61 74  ...datalen_updat
28a20 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e 3b  e = *pulDataLen;
28a30 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20 3d  ...decrypt_ret =
28a40 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74 65   C_DecryptUpdate
28a50 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63 72  (hSession, pEncr
28a60 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e 63  yptedData, ulEnc
28a70 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20 70  ryptedDataLen, p
28a80 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f 75  Data, &datalen_u
28a90 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65 63  pdate);..if (dec
28aa0 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f  rypt_ret != CKR_
28ab0 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
28ac0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28ad0 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64 61  or.  DecryptUpda
28ae0 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  te() returned fa
28af0 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
28b00 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
28b10 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29  ng) decrypt_ret)
28b20 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70 74  ;....if (decrypt
28b30 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46 46  _ret != CKR_BUFF
28b40 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b 0a  ER_TOO_SMALL) {.
28b50 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65 20  .../* Terminate 
28b60 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72 61  decryption opera
28b70 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74 65  tion */.....mute
28b80 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
28b90 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
28ba0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
28bb0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
28bc0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  l != 0) {.....CA
28bd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28be0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
28bf0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
28c00 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
28c10 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
28c20 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
28c30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
28c40 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
28c50 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
28c60 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
28c70 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
28c80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28c90 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
28ca0 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
28cb0 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
28cc0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
28cd0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09  LE_INVALID);....
28ce0 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
28cf0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28d00 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
28d10 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b 65  ive) {.....cacke
28d20 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
28d30 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
28d40 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
28d50 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
28d60 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61 63    Decrypt not ac
28d70 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09 09  tive.");........
28d80 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
28d90 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
28da0 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09 09  IZED);....}.....
28db0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
28dc0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
28dd0 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  t_active = 0;...
28de0 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
28df0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
28e00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28e10 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75 74  ock);....if (mut
28e20 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
28e30 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
28e40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28e50 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
28e60 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65 74  led.");......ret
28e70 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28e80 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09 7d  ERROR);....}...}
28e90 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72 79  ....return(decry
28ea0 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69 66  pt_ret);..}...if
28eb0 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44 61   (pData) {...pDa
28ec0 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75 70  ta += datalen_up
28ed0 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c 65  date;..}..datale
28ee0 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44 61  n_final = *pulDa
28ef0 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e 5f  taLen - datalen_
28f00 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79 70  update;...decryp
28f10 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79 70  t_ret = C_Decryp
28f20 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c  tFinal(hSession,
28f30 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e   pData, &datalen
28f40 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64 65  _final);..if (de
28f50 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52  crypt_ret != CKR
28f60 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
28f70 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28f80 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69 6e  ror.  DecryptFin
28f90 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66 61  al() returned fa
28fa0 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29  ilure (rv = %lu)
28fb0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
28fc0 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74 29  ng) decrypt_ret)
28fd0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72  ;....return(decr
28fe0 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 2a  ypt_ret);..}...*
28ff0 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61 74  pulDataLen = dat
29000 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64 61  alen_update + da
29010 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09 43  talen_final;...C
29020 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29030 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
29040 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
29050 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
29060 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
29070 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29080 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70 64  RV, C_DecryptUpd
29090 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
290a0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
290b0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
290c0 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
290d0 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
290e0 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
290f0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
29100 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
29110 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63 20  tLen) {..static 
29120 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33 38  CK_BYTE buf[1638
29130 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75 66  4];..ssize_t buf
29140 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  len;..CK_SLOT_ID
29150 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20   slotID;..CK_RV 
29160 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
29170 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74  ERAL_ERROR;..int
29180 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
29190 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
291a0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
291b0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
291c0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
291d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
291e0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
291f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
29200 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
29210 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
29220 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
29230 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
29240 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
29250 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
29260 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
29270 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
29280 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
29290 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
292a0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
292b0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
292c0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
292d0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
292e0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
292f0 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50 61  if (pEncryptedPa
29300 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c  rt == NULL && ul
29310 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
29320 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
29330 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77  ort circuit if w
29340 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 64  e are asked to d
29350 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e 2e  ecrypt nothing..
29360 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  . */...CACKEY_DE
29370 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
29380 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
29390 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69 74  ) (short circuit
293a0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09  )", CKR_OK);....
293b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
293c0 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70  .}...if (pEncryp
293d0 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29  tedPart == NULL)
293e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
293f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29400 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 20   pEncryptedPart 
29410 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c 45  is NULL, but ulE
29420 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
29430 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09  is not 0.");....
29440 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
29450 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
29460 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64 50  if (ulEncryptedP
29470 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  artLen == 0) {..
29480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29490 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c 45  INTF("Error. ulE
294a0 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 20  ncryptedPartLen 
294b0 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20  is 0, but pPart 
294c0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
294d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
294e0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
294f0 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c 65  ...if (pulPartLe
29500 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  n == NULL) {...C
29510 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29520 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50 61  TF("Error. pulPa
29530 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29  rtLen is NULL.")
29540 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29550 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
29560 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
29570 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
29580 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
29590 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
295a0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
295b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
295c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
295d0 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
295e0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
295f0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
29600 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
29610 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29620 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09  ion].active) {..
29630 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
29640 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
29650 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
29660 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29670 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f  ror.  Session no
29680 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
29690 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
296a0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
296b0 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  LID);..}...if (!
296c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
296d0 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
296e0 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  t_active) {...ca
296f0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
29700 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
29710 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
29720 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29730 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
29740 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
29750 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
29760 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  ION_NOT_INITIALI
29770 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 49  ZED);..}...slotI
29780 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D = cackey_sessi
29790 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 6c  ons[hSession].sl
297a0 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  otID;...if (slot
297b0 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49 44  ID < 0 || slotID
297c0 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
297d0 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
297e0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
297f0 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
29800 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
29810 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
29820 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
29830 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20 76  u), outside of v
29840 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c 6f  alid range", slo
29850 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  tID);....return(
29860 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
29870 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  R);..}...if (cac
29880 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
29890 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b  ].active == 0) {
298a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
298b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
298c0 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
298d0 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f  ested (%lu), slo
298e0 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  t not currently 
298f0 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29  active", slotID)
29900 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  ;....cackey_mute
29910 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
29920 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74  biglock);....ret
29930 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
29940 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77 69  ERROR);..}...swi
29950 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73 73  tch (cackey_sess
29960 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
29970 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
29980 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
29990 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
299a0 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72 79  sk card to decry
299b0 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e 20  pt */....buflen 
299c0 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65 63  = cackey_signdec
299d0 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c 6f  rypt(&cackey_slo
299e0 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63 6b  ts[slotID], cack
299f0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29a00 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69 64  sion].decrypt_id
29a10 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70 74  entity, pEncrypt
29a20 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79 70  edPart, ulEncryp
29a30 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66 2c  tedPartLen, buf,
29a40 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30 2c   sizeof(buf), 0,
29a50 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75 66   1);.....if (buf
29a60 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09 2f  len < 0) {...../
29a70 2a 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61 69  * Decryption fai
29a80 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20 28  led. */.....if (
29a90 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59  buflen == CACKEY
29aa0 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47 49  _PCSC_E_NEEDLOGI
29ab0 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c  N) {......retval
29ac0 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54 5f   = CKR_USER_NOT_
29ad0 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09 7d  LOGGED_IN;.....}
29ae0 20 65 6c 73 65 20 69 66 20 28 62 75 66 6c 65 6e   else if (buflen
29af0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
29b00 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b  E_TOKENABSENT) {
29b10 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
29b20 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56 45  KR_DEVICE_REMOVE
29b30 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  D;.....} else {.
29b40 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
29b50 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b  R_GENERAL_ERROR;
29b60 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73 65  .....}....} else
29b70 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64 20   if (((unsigned 
29b80 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e 20  long) buflen) > 
29b90 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20 70  *pulPartLen && p
29ba0 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20 44  Part) {...../* D
29bb0 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74 6f  ecrypted data to
29bc0 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09 72  o large */.....r
29bd0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46 46  etval = CKR_BUFF
29be0 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09 09  ER_TOO_SMALL;...
29bf0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
29c00 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09 09   (pPart) {......
29c10 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62 75  memcpy(pPart, bu
29c20 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09 09  f, buflen);.....
29c30 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74 4c  }......*pulPartL
29c40 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09 09  en = buflen;....
29c50 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 4f  ..retval = CKR_O
29c60 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65 61  K;....}.....brea
29c70 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  k;..}...mutex_re
29c80 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
29c90 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29ca0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
29cb0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
29cc0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
29cd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
29ce0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
29cf0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
29d00 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
29d10 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
29d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29d30 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
29d40 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
29d50 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
29d60 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
29d70 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
29d80 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28 43  _DecryptFinal)(C
29d90 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
29da0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
29db0 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72 74  TE_PTR pLastPart
29dc0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
29dd0 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20 7b  ulLastPartLen) {
29de0 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
29df0 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e 61  al;..int termina
29e00 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b 0a  te_decrypt = 1;.
29e10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29e20 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
29e30 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
29e40 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
29e50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29e60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
29e70 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
29e80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29e90 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
29ea0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
29eb0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
29ec0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
29ed0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
29ee0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
29ef0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
29f00 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
29f10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
29f20 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
29f30 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
29f40 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
29f50 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
29f60 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29f70 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72 74  .if (pulLastPart
29f80 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Len == NULL) {..
29f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29fa0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c  INTF("Error. pul
29fb0 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20 4e  LastPartLen is N
29fc0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
29fd0 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
29fe0 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  BAD);..}...mutex
29ff0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
2a000 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
2a010 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
2a020 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2a030 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
2a040 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2a050 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
2a060 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
2a070 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
2a080 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
2a090 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
2a0a0 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76  [hSession].activ
2a0b0 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2a0c0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2a0d0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2a0e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a0f0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2a100 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
2a110 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
2a120 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
2a130 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
2a140 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2a150 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2a160 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29 20  decrypt_active) 
2a170 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
2a180 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2a190 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
2a1a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a1b0 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
2a1c0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2a1d0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2a1e0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2a1f0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a200 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  .*pulLastPartLen
2a210 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61 73   = 0;...if (pLas
2a220 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  tPart == NULL) {
2a230 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  ...terminate_dec
2a240 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69  rypt = 0;..}...i
2a250 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65 63  f (terminate_dec
2a260 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65 79  rypt) {...cackey
2a270 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2a280 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69  on].decrypt_acti
2a290 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75 74  ve = 0;..}...mut
2a2a0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
2a2b0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2a2c0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2a2d0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2a2e0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2a2f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a300 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2a310 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2a320 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2a330 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2a340 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a350 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2a360 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
2a370 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
2a380 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
2a390 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2a3a0 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 49  CK_RV, C_DigestI
2a3b0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
2a3c0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2a3d0 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2a3e0 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b 0a  R pMechanism) {.
2a3f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a400 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2a410 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2a420 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2a430 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a440 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2a450 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2a460 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2a470 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2a480 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2a490 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a4a0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2a4b0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2a4c0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2a4d0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2a4e0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2a4f0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2a500 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a510 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2a520 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2a530 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45 53  C_Digest)(CK_SES
2a540 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2a550 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2a560 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2a570 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f  G ulDataLen, CK_
2a580 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73 74  BYTE_PTR pDigest
2a590 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
2a5a0 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a 09  ulDigestLen) {..
2a5b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a5c0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2a5d0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2a5e0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2a5f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a600 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2a610 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2a620 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2a630 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2a640 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2a650 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2a660 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2a670 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2a680 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2a690 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2a6a0 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2a6b0 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2a6c0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2a6d0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2a6e0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2a6f0 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28 43  _DigestUpdate)(C
2a700 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2a710 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2a720 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
2a730 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
2a740 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2a750 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2a760 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2a770 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2a780 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a790 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a7a0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2a7b0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2a7c0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2a7d0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2a7e0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a7f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2a800 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2a810 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2a820 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2a830 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2a840 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2a850 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2a860 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2a870 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2a880 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79 29  RV, C_DigestKey)
2a890 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2a8a0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2a8b0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2a8c0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2a8d0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2a8e0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2a8f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2a900 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2a910 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a920 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2a930 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2a940 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2a950 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2a960 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2a970 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2a980 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2a990 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2a9a0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2a9b0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2a9c0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2a9d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2a9e0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2a9f0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2aa00 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46 69  K_RV, C_DigestFi
2aa10 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nal)(CK_SESSION_
2aa20 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2aa30 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69   CK_BYTE_PTR pDi
2aa40 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  gest, CK_ULONG_P
2aa50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29  TR pulDigestLen)
2aa60 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2aa70 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2aa80 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2aa90 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2aaa0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2aab0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2aac0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2aad0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2aae0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2aaf0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2ab00 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ab10 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2ab20 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2ab30 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2ab40 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2ab50 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2ab60 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2ab70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2ab80 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2ab90 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2aba0 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28 43  V, C_SignInit)(C
2abb0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2abc0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2abd0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2abe0 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
2abf0 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
2ac00 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
2ac10 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a 09  al;...hKey--;...
2ac20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ac30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2ac40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2ac50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2ac60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ac70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2ac80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2ac90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2aca0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2acb0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2acc0 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d 20   (pMechanism == 
2acd0 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2ace0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2acf0 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73 6d  rror. pMechanism
2ad00 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
2ad10 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2ad20 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2ad30 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  if (pMechanism->
2ad40 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b 4d  mechanism != CKM
2ad50 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09 43  _RSA_PKCS) {...C
2ad60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ad70 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68  TF("Error. pMech
2ad80 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d  anism->mechanism
2ad90 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
2ada0 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22 29  s CKM_RSA_PKCS")
2adb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2adc0 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d 5f  MECHANISM_PARAM_
2add0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2ade0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2adf0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2ae00 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2ae10 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2ae20 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2ae30 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2ae40 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2ae50 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2ae60 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2ae70 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2ae80 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2ae90 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2aea0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2aeb0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2aec0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2aed0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2aee0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2aef0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2af00 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2af10 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2af20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2af30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2af40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2af50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2af60 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2af70 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2af80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2af90 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2afa0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2afb0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2afc0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2afd0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2afe0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2aff0 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
2b000 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b010 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
2b020 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2b030 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2b040 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2b050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2b060 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 61  ("Error.  Sign a
2b070 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72 65  lready in progre
2b080 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ss.");......retu
2b090 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e  rn(CKR_OPERATION
2b0a0 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09 69  _ACTIVE);..}...i
2b0b0 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b 65  f (hKey >= cacke
2b0c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b0d0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
2b0e0 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b 65  count) {...cacke
2b0f0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2b100 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2b110 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b120 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2b130 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  Key handle out o
2b140 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73 74  f range (request
2b150 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c 79  ed key %lu, only
2b160 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73 20   %lu identities 
2b170 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28 75  available).", (u
2b180 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68 4b  nsigned long) hK
2b190 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ey, (unsigned lo
2b1a0 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ng) cackey_sessi
2b1b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2b1c0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
2b1d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4b  ....return(CKR_K
2b1e0 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  EY_HANDLE_INVALI
2b1f0 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
2b200 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b210 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d  n].sign_active =
2b220 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73   1;...cackey_ses
2b230 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b240 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  sign_mechanism =
2b250 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
2b260 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65 79  hanism;...cackey
2b270 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b280 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 20  on].sign_buflen 
2b290 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f 73  = 128;..cackey_s
2b2a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b2b0 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20 3d  ].sign_bufused =
2b2c0 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73 73   0;..cackey_sess
2b2d0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b2e0 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f 63  ign_buf = malloc
2b2f0 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
2b300 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b310 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20 63  n].sign_buf) * c
2b320 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b330 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b340 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59 5f  flen);...CACKEY_
2b350 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 65  DEBUG_PRINTF("Se
2b360 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f 69  ssion %lu sign_i
2b370 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28 69  dentity is %p (i
2b380 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c 20  dentity #%lu)", 
2b390 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2b3a0 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64 20  hSession, (void 
2b3b0 2a 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69  *) &cackey_sessi
2b3c0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
2b3d0 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c 20  entities[hKey], 
2b3e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2b3f0 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f 73  hKey);..cackey_s
2b400 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2b410 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 20  ].sign_identity 
2b420 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  = &cackey_sessio
2b430 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65  ns[hSession].ide
2b440 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a 0a  ntities[hKey];..
2b450 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2b460 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
2b470 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2b480 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2b490 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2b4a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b4b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
2b4c0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
2b4d0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2b4e0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
2b4f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2b500 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2b510 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2b520 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2b530 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2b540 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2b550 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2b560 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  n)(CK_SESSION_HA
2b570 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2b580 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2b590 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
2b5a0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
2b5b0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2b5c0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
2b5d0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 75  gnatureLen) {..u
2b5e0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74 61  nsigned long sta
2b5f0 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64 3b  rt_sign_bufused;
2b600 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65 74  ..CK_RV sign_ret
2b610 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
2b620 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
2b630 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2b640 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2b650 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2b660 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2b670 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b680 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2b690 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2b6a0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2b6b0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2b6c0 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
2b6d0 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
2b6e0 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
2b6f0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
2b700 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2b710 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
2b720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b730 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2b740 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
2b750 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
2b760 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2b770 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2b780 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67 6e  ..}...start_sign
2b790 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b 65  _bufused = cacke
2b7a0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b7b0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2b7c0 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20  d;...sign_ret = 
2b7d0 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53 65  C_SignUpdate(hSe
2b7e0 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75 6c  ssion, pData, ul
2b7f0 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28 73  DataLen);..if (s
2b800 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f 4f  ign_ret != CKR_O
2b810 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
2b820 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b830 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28 29  r.  SignUpdate()
2b840 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72   returned failur
2b850 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20  e (rv = %lu).", 
2b860 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2b870 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69 66  sign_ret);....if
2b880 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b   (sign_ret != CK
2b890 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
2b8a0 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f 72  LL) {....mutex_r
2b8b0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2b8c0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
2b8d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
2b8e0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2b8f0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
2b900 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b910 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
2b920 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
2b930 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2b940 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
2b950 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
2b960 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b970 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09  n].active) {....
2b980 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
2b990 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2b9a0 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  ock);......CACKE
2b9b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2b9c0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2b9d0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2b9e0 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2b9f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2ba00 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a 0a  INVALID);....}..
2ba10 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2ba20 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2ba30 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20 7b  ].sign_active) {
2ba40 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
2ba50 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2ba60 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
2ba70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ba80 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
2ba90 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2baa0 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
2bab0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
2bac0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 09  INITIALIZED);...
2bad0 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  .}.....cackey_se
2bae0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2baf0 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30  .sign_active = 0
2bb00 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76  ;.....mutex_retv
2bb10 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2bb20 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2bb30 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20  biglock);....if 
2bb40 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2bb50 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59   0) {.....CACKEY
2bb60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2bb70 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
2bb80 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
2bb90 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2bba0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
2bbb0 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 73  ...}....return(s
2bbc0 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 73  ign_ret);..}...s
2bbd0 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67 6e  ign_ret = C_Sign
2bbe0 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c 20  Final(hSession, 
2bbf0 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c 53  pSignature, pulS
2bc00 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09 69  ignatureLen);..i
2bc10 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43  f (sign_ret != C
2bc20 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28 73  KR_OK) {...if (s
2bc30 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f 42  ign_ret == CKR_B
2bc40 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
2bc50 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
2bc60 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e 46  UG_PRINTF("SignF
2bc70 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20  inal() returned 
2bc80 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2bc90 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29 2c  MALL (rv = %lu),
2bca0 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55   undoing C_SignU
2bcb0 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69 67  pdate()", (unsig
2bcc0 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f 72  ned long) sign_r
2bcd0 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  et);.....cackey_
2bce0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2bcf0 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
2bd00 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66  = start_sign_buf
2bd10 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72 6e  used;.....return
2bd20 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d 0a  (sign_ret);...}.
2bd30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2bd40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2bd50 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75  SignFinal() retu
2bd60 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72 76  rned failure (rv
2bd70 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
2bd80 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
2bd90 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ret);....return(
2bda0 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
2bdb0 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20 3d  if (pSignature =
2bdc0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
2bdd0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2bde0 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65 63  "pSignature spec
2bdf0 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 75  ified as NULL, u
2be00 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70 64  ndoing C_SignUpd
2be10 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63 6b  ate()");....cack
2be20 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2be30 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
2be40 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f  ed = start_sign_
2be50 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74 75  bufused;....retu
2be60 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d  rn(sign_ret);..}
2be70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2be80 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2be90 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
2bea0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
2beb0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
2bec0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2bed0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55 70  (CK_RV, C_SignUp
2bee0 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
2bef0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2bf00 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 50  , CK_BYTE_PTR pP
2bf10 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  art, CK_ULONG ul
2bf20 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74 20  PartLen) {..int 
2bf30 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
2bf40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bf50 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2bf60 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2bf70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2bf80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2bf90 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2bfa0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2bfb0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2bfc0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2bfd0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
2bfe0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2bff0 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2c000 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2c010 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2c020 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2c030 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2c040 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c050 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2c060 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2c070 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c080 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2c090 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69  INVALID);..}...i
2c0a0 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (pPart == NULL
2c0b0 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d 3d   && ulPartLen ==
2c0c0 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74   0) {.../* Short
2c0d0 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20 61   circuit if we a
2c0e0 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67 6e  re asked to sign
2c0f0 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a 09   nothing... */..
2c100 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c110 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2c120 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
2c130 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
2c140 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
2c150 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
2c160 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  f (pPart == NULL
2c170 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c180 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c190 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c 2c  . pPart is NULL,
2c1a0 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20 69   but ulPartLen i
2c1b0 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09 72  s not 0.");....r
2c1c0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2c1d0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2c1e0 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d 20  f (ulPartLen == 
2c1f0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2c200 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2c210 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73 20  r. ulPartLen is 
2c220 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73 20  0, but pPart is 
2c230 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09  not NULL.");....
2c240 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2c250 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2c260 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2c270 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2c280 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2c290 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2c2a0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2c2b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c2c0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2c2d0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2c2e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2c2f0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2c300 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2c310 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c320 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2c330 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2c340 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c350 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c360 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c370 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2c380 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
2c390 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
2c3a0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
2c3b0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2c3c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c3d0 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
2c3e0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2c3f0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2c400 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2c410 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2c420 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
2c430 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2c440 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2c450 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2c460 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2c470 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
2c480 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c490 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d  ].sign_mechanism
2c4a0 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52  ) {...case CKM_R
2c4b0 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20 41  SA_PKCS:..../* A
2c4c0 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63 74  ccumulate direct
2c4d0 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63 61  ly */....if ((ca
2c4e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c4f0 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2c500 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65 6e  used + ulPartLen
2c510 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) > cackey_sessi
2c520 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2c530 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09 09  gn_buflen) {....
2c540 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
2c550 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2c560 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09 09  buflen *= 2;....
2c570 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2c580 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2c590 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28 63  _buf = realloc(c
2c5a0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c5b0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2c5c0 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65  f, sizeof(*cacke
2c5d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c5e0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a  ion].sign_buf) *
2c5f0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2c600 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2c610 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a 09  buflen);....}...
2c620 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f  ..memcpy(cackey_
2c630 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c640 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63 61  n].sign_buf + ca
2c650 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c660 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2c670 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c 50  used, pPart, ulP
2c680 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61 63  artLen);.....cac
2c690 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2c6a0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2c6b0 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65 6e  sed += ulPartLen
2c6c0 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  ;.....break;..}.
2c6d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2c6e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
2c6f0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2c700 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2c710 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2c720 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c730 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2c740 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2c750 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c760 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2c770 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2c780 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2c790 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2c7a0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2c7b0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2c7c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2c7d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
2c7e0 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53  gnFinal)(CK_SESS
2c7f0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2c800 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2c810 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2c820 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67  ULONG_PTR pulSig
2c830 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73 74  natureLen) {..st
2c840 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69 67  atic CK_BYTE sig
2c850 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69 7a  buf[1024];..ssiz
2c860 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a 09  e_t sigbuflen;..
2c870 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
2c880 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61 6c  D;..CK_RV retval
2c890 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45   = CKR_GENERAL_E
2c8a0 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d 69  RROR;..int termi
2c8b0 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09  nate_sign = 1;..
2c8c0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
2c8d0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
2c8e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2c8f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2c900 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2c910 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c920 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2c930 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2c940 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2c950 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2c960 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2c970 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74 75  ..if (pulSignatu
2c980 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b  reLen == NULL) {
2c990 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c9a0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
2c9b0 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 69  ulSignatureLen i
2c9c0 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
2c9d0 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
2c9e0 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
2c9f0 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
2ca00 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
2ca10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
2ca20 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
2ca30 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2ca40 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
2ca50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2ca60 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
2ca70 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
2ca80 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2ca90 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
2caa0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
2cab0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
2cac0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
2cad0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2cae0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
2caf0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
2cb00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cb10 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
2cb20 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2cb30 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2cb40 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2cb50 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
2cb60 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
2cb70 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
2cb80 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
2cb90 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
2cba0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2cbb0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2cbc0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
2cbd0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
2cbe0 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
2cbf0 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
2cc00 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
2cc10 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2cc20 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29  on].sign_active)
2cc30 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
2cc40 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2cc50 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
2cc60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cc70 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20 6e  ("Error.  Sign n
2cc80 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
2cc90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
2cca0 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
2ccb0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73  IALIZED);..}...s
2ccc0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
2ccd0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2cce0 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
2ccf0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
2cd00 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
2cd10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
2cd20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
2cd30 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
2cd40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cd50 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
2cd60 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
2cd70 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
2cd80 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
2cd90 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
2cda0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2cdb0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
2cdc0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
2cdd0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
2cde0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
2cdf0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ce00 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
2ce10 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
2ce20 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
2ce30 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
2ce40 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
2ce50 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2ce60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2ce70 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2ce80 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2ce90 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
2cea0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2ceb0 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
2cec0 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
2ced0 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
2cee0 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67 6e  Ask card to sign
2cef0 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44 45   */....CACKEY_DE
2cf00 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b 69  BUG_PRINTF("Aski
2cf10 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d 20  ng to sign from 
2cf20 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20 73  identity %p in s
2cf30 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76 6f  ession %lu", (vo
2cf40 69 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65 73  id *) cackey_ses
2cf50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2cf60 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 28  sign_identity, (
2cf70 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
2cf80 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69 67  Session);....sig
2cf90 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79 5f  buflen = cackey_
2cfa0 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61 63  signdecrypt(&cac
2cfb0 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
2cfc0 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ], cackey_sessio
2cfd0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2cfe0 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63 6b  n_identity, cack
2cff0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2d000 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c 20  sion].sign_buf, 
2d010 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2d020 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2d030 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c 20  ufused, sigbuf, 
2d040 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c 20  sizeof(sigbuf), 
2d050 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28 73  1, 0);.....if (s
2d060 69 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a  igbuflen < 0) {.
2d070 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20 66  ..../* Signing f
2d080 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66  ailed. */.....if
2d090 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43   (sigbuflen == C
2d0a0 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45  ACKEY_PCSC_E_NEE
2d0b0 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72  DLOGIN) {......r
2d0c0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52  etval = CKR_USER
2d0d0 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a  _NOT_LOGGED_IN;.
2d0e0 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 73  ....} else if (s
2d0f0 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b  igbuflen == CACK
2d100 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
2d110 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72 65  BSENT) {......re
2d120 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49 43  tval = CKR_DEVIC
2d130 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09 7d  E_REMOVED;.....}
2d140 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65 74   else {......ret
2d150 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
2d160 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a 09  L_ERROR;.....}..
2d170 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28 75  ..} else if (((u
2d180 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
2d190 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c 53  gbuflen) > *pulS
2d1a0 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20 70  ignatureLen && p
2d1b0 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09 09  Signature) {....
2d1c0 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61 20  ./* Signed data 
2d1d0 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09  too large */....
2d1e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d1f0 49 4e 54 46 28 22 72 65 74 76 61 6c 20 3d 20 43  INTF("retval = C
2d200 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2d210 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e 20  ALL;  sigbuflen 
2d220 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61 74  = %lu, pulSignat
2d230 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20 28  ureLen = %lu", (
2d240 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
2d250 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69 67  igbuflen, (unsig
2d260 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53 69  ned long) *pulSi
2d270 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09 09  gnatureLen);....
2d280 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
2d290 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
2d2a0 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65 5f  ......terminate_
2d2b0 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20 65  sign = 0;....} e
2d2c0 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69 6e  lse {.....termin
2d2d0 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a 09  ate_sign = 0;...
2d2e0 09 09 09 69 66 20 28 70 53 69 67 6e 61 74 75 72  ...if (pSignatur
2d2f0 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70 79  e) {......memcpy
2d300 28 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69 67  (pSignature, sig
2d310 62 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29 3b  buf, sigbuflen);
2d320 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74 65  .......terminate
2d330 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09 7d  _sign = 1;.....}
2d340 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61 74  ......*pulSignat
2d350 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66 6c  ureLen = sigbufl
2d360 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c 20  en;......retval 
2d370 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a  = CKR_OK;....}..
2d380 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 69  ...break;..}...i
2d390 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 69 67  f (terminate_sig
2d3a0 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  n) {...if (cacke
2d3b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2d3c0 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 7b  ion].sign_buf) {
2d3d0 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f  ....free(cackey_
2d3e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2d3f0 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09 09  n].sign_buf);...
2d400 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  }....cackey_sess
2d410 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2d420 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a  ign_active = 0;.
2d430 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2d440 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2d450 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2d460 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2d470 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2d480 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2d490 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2d4a0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2d4b0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2d4c0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2d4d0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2d4e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d4f0 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28 69  eturning %i", (i
2d500 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72  nt) retval);...r
2d510 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
2d520 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2d530 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
2d540 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 28 43  gnRecoverInit)(C
2d550 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2d560 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2d570 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2d580 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43  hanism, CK_OBJEC
2d590 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b  T_HANDLE hKey) {
2d5a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d5b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2d5c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2d5d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2d5e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d5f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2d600 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2d610 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d620 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2d630 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2d640 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d650 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d660 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d670 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2d680 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2d690 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2d6a0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2d6b0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d6c0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2d6d0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2d6e0 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 29 28   C_SignRecover)(
2d6f0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2d700 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2d710 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20 43  YTE_PTR pData, C
2d720 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65  K_ULONG ulDataLe
2d730 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2d740 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2d750 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e 61  ONG_PTR pulSigna
2d760 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
2d770 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d780 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d790 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d7a0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d7b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d7c0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d7d0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d7e0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d7f0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d800 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2d810 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d820 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2d830 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d840 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2d850 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2d860 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2d870 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2d880 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2d890 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2d8a0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2d8b0 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 53 53  ifyInit)(CK_SESS
2d8c0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d8d0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2d8e0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2d8f0 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
2d900 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  LE hKey) {..CACK
2d910 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d920 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2d930 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2d940 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2d950 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d960 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2d970 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2d980 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2d990 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2d9a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2d9b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2d9c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2d9d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d9e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2d9f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2da00 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2da10 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2da20 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2da30 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2da40 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2da50 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ify)(CK_SESSION_
2da60 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2da70 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61   CK_BYTE_PTR pDa
2da80 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44  ta, CK_ULONG ulD
2da90 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  ataLen, CK_BYTE_
2daa0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
2dab0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61  CK_ULONG ulSigna
2dac0 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  tureLen) {..CACK
2dad0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2dae0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2daf0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2db00 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2db10 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2db20 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2db30 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2db40 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2db50 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2db60 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2db70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2db80 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2db90 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2dba0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2dbb0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2dbc0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2dbd0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2dbe0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2dbf0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2dc00 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72  ION(CK_RV, C_Ver
2dc10 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53 45  ifyUpdate)(CK_SE
2dc20 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2dc30 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2dc40 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2dc50 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a  NG ulPartLen) {.
2dc60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2dc70 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2dc80 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2dc90 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2dca0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dcb0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2dcc0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2dcd0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2dce0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2dcf0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2dd00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2dd10 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2dd20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2dd30 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2dd40 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2dd50 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2dd60 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2dd70 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2dd80 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2dd90 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2dda0 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 28 43  C_VerifyFinal)(C
2ddb0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2ddc0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
2ddd0 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
2dde0 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
2ddf0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
2de00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2de10 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2de20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2de30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2de40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2de50 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2de60 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2de70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2de80 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2de90 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2dea0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2deb0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2dec0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ded0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2dee0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2def0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2df00 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2df10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2df20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2df30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2df40 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
2df50 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
2df60 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2df70 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2df80 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2df90 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
2dfa0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2dfb0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2dfc0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2dfd0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2dfe0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2dff0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e000 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2e010 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2e020 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2e030 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2e040 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2e050 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2e060 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2e070 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2e080 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2e090 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e0a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2e0b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e0c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2e0d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e0e0 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65 63  _RV, C_VerifyRec
2e0f0 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e  over)(CK_SESSION
2e100 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2e110 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 53  , CK_BYTE_PTR pS
2e120 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c 4f  ignature, CK_ULO
2e130 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  NG ulSignatureLe
2e140 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2e150 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  Data, CK_ULONG_P
2e160 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20 7b  TR pulDataLen) {
2e170 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e180 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2e190 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2e1a0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2e1b0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e1c0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2e1d0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2e1e0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e1f0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2e200 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2e210 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e220 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2e230 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e240 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2e250 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e260 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2e270 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2e280 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e290 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2e2a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2e2b0 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74   C_DigestEncrypt
2e2c0 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
2e2d0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2e2e0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2e2f0 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pPart, CK_ULONG 
2e300 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  ulPartLen, CK_BY
2e310 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
2e320 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  dPart, CK_ULONG_
2e330 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65 64  PTR pulEncrypted
2e340 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b  PartLen) {..CACK
2e350 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e360 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2e370 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2e380 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2e390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2e3a0 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2e3b0 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2e3c0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2e3d0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2e3e0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2e3f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2e400 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2e410 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e420 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2e430 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e440 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2e450 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2e460 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2e470 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2e480 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65 63  ION(CK_RV, C_Dec
2e490 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65  ryptDigestUpdate
2e4a0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2e4b0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2e4c0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2e4d0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2e4e0 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61  NG ulEncryptedPa
2e4f0 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  rtLen, CK_BYTE_P
2e500 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2e510 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c 65  NG_PTR pulPartLe
2e520 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2e530 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2e540 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2e550 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2e560 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e570 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e580 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2e590 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2e5a0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2e5b0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2e5c0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2e5d0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2e5e0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2e5f0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2e600 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2e610 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e620 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2e630 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e640 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2e650 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e660 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72 79  _RV, C_SignEncry
2e670 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53  ptUpdate)(CK_SES
2e680 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2e690 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2e6a0 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  R pPart, CK_ULON
2e6b0 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  G ulPartLen, CK_
2e6c0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
2e6d0 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e  tedPart, CK_ULON
2e6e0 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74  G_PTR pulEncrypt
2e6f0 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41  edPartLen) {..CA
2e700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e710 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2e720 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2e730 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2e740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e750 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2e760 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2e770 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2e780 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2e790 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2e7a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e7b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2e7c0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e7d0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2e7e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e7f0 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2e800 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2e810 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2e820 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2e830 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44  CTION(CK_RV, C_D
2e840 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61  ecryptVerifyUpda
2e850 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  te)(CK_SESSION_H
2e860 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2e870 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
2e880 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2e890 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64  LONG ulEncrypted
2e8a0 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  PartLen, CK_BYTE
2e8b0 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2e8c0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74  LONG_PTR pulPart
2e8d0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2e8e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2e8f0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2e900 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2e910 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2e920 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2e930 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2e940 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2e950 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2e960 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2e970 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2e980 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2e990 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2e9a0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2e9b0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2e9c0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e9d0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2e9e0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e9f0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2ea00 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2ea10 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61 74  CK_RV, C_Generat
2ea20 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  eKey)(CK_SESSION
2ea30 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2ea40 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2ea50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2ea60 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20  K_ATTRIBUTE_PTR 
2ea70 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c  pTemplate, CK_UL
2ea80 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f  ONG ulCount, CK_
2ea90 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
2eaa0 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
2eab0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2eac0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2ead0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2eae0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2eaf0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2eb00 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2eb10 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2eb20 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2eb30 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2eb40 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2eb50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2eb60 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2eb70 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2eb80 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2eb90 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2eba0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2ebb0 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2ebc0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2ebd0 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2ebe0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e  ION(CK_RV, C_Gen
2ebf0 65 72 61 74 65 4b 65 79 50 61 69 72 29 28 43 4b  erateKeyPair)(CK
2ec00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2ec10 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2ec20 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2ec30 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49 42  anism, CK_ATTRIB
2ec40 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69 63 4b  UTE_PTR pPublicK
2ec50 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55  eyTemplate, CK_U
2ec60 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65 79  LONG ulPublicKey
2ec70 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
2ec80 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
2ec90 20 70 50 72 69 76 61 74 65 4b 65 79 54 65 6d 70   pPrivateKeyTemp
2eca0 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  late, CK_ULONG u
2ecb0 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74 72 69  lPrivateKeyAttri
2ecc0 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42  buteCount, CK_OB
2ecd0 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20  JECT_HANDLE_PTR 
2ece0 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b 5f  phPublicKey, CK_
2ecf0 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
2ed00 52 20 70 68 50 72 69 76 61 74 65 4b 65 79 29 20  R phPrivateKey) 
2ed10 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2ed20 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2ed30 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2ed40 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2ed50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ed60 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2ed70 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2ed80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2ed90 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2eda0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2edb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2edc0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2edd0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ede0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2edf0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2ee00 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2ee10 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2ee20 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ee30 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2ee40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2ee50 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b 5f  , C_WrapKey)(CK_
2ee60 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2ee70 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48  Session, CK_MECH
2ee80 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61  ANISM_PTR pMecha
2ee90 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  nism, CK_OBJECT_
2eea0 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69 6e 67  HANDLE hWrapping
2eeb0 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  Key, CK_OBJECT_H
2eec0 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f 42  ANDLE hKey, CK_B
2eed0 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65 64  YTE_PTR pWrapped
2eee0 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  Key, CK_ULONG_PT
2eef0 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65 79 4c  R pulWrappedKeyL
2ef00 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2ef10 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2ef20 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2ef30 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2ef40 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2ef50 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2ef60 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2ef70 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2ef80 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2ef90 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2efa0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2efb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2efc0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2efd0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2efe0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2eff0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2f000 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2f010 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f020 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2f030 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2f040 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b 65  K_RV, C_UnwrapKe
2f050 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
2f060 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2f070 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2f080 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2f090 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 55 6e  BJECT_HANDLE hUn
2f0a0 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b 5f  wrappingKey, CK_
2f0b0 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65  BYTE_PTR pWrappe
2f0c0 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  dKey, CK_ULONG u
2f0d0 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c 20  lWrappedKeyLen, 
2f0e0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
2f0f0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
2f100 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74 65  LONG ulAttribute
2f110 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43 54  Count, CK_OBJECT
2f120 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b 65  _HANDLE_PTR phKe
2f130 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2f140 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2f150 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2f160 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2f170 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2f180 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2f190 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2f1a0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2f1b0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2f1c0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2f1d0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2f1e0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2f1f0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2f200 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2f210 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2f220 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2f230 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2f240 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f250 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2f260 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2f270 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b 65 79  _RV, C_DeriveKey
2f280 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2f290 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2f2a0 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2f2b0 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
2f2c0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 61 73  JECT_HANDLE hBas
2f2d0 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 42 55  eKey, CK_ATTRIBU
2f2e0 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
2f2f0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74  , CK_ULONG ulAtt
2f300 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f  ributeCount, CK_
2f310 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54  OBJECT_HANDLE_PT
2f320 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b  R phKey) {..CACK
2f330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f340 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
2f350 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
2f360 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
2f370 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f380 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
2f390 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
2f3a0 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
2f3b0 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
2f3c0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
2f3d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2f3e0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
2f3f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2f400 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
2f410 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f420 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
2f430 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
2f440 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
2f450 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2f460 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65 65  ION(CK_RV, C_See
2f470 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53 53  dRandom)(CK_SESS
2f480 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2f490 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2f4a0 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e 47   pSeed, CK_ULONG
2f4b0 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09 43   ulSeedLen) {..C
2f4c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2f4d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2f4e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2f4f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2f500 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f510 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2f520 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2f530 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2f540 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2f550 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2f560 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f570 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2f580 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2f590 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2f5a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2f5b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2f5c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2f5d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2f5e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2f5f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2f600 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29 28  GenerateRandom)(
2f610 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2f620 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2f630 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d 44  YTE_PTR pRandomD
2f640 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2f650 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43 41  RandomLen) {..CA
2f660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2f670 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2f680 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
2f690 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
2f6a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f6b0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
2f6c0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
2f6d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
2f6e0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
2f6f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
2f700 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2f710 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
2f720 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2f730 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
2f740 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2f750 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
2f760 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2f770 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2f780 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64  }../* Deprecated
2f790 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f   Function */.CK_
2f7a0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2f7b0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e 63  CK_RV, C_GetFunc
2f7c0 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f 53  tionStatus)(CK_S
2f7d0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2f7e0 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b 45  ession) {..CACKE
2f7f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2f800 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43  Called.");...CAC
2f810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2f820 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2f830 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52  FUNCTION_NOT_PAR
2f840 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b 52  ALLEL (%i)", CKR
2f850 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
2f860 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75 72  RALLEL);...retur
2f870 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2f880 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09  OT_PARALLEL);...
2f890 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73 73  hSession = hSess
2f8a0 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73 20  ion; /* Supress 
2f8b0 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20  unused variable 
2f8c0 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a  warning */.}../*
2f8d0 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e 63   Deprecated Func
2f8e0 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e  tion */.CK_DEFIN
2f8f0 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2f900 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74 69  , C_CancelFuncti
2f910 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  on)(CK_SESSION_H
2f920 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29 20  ANDLE hSession) 
2f930 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2f940 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2f950 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  );...CACKEY_DEBU
2f960 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2f970 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2f980 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28 25  _NOT_PARALLEL (%
2f990 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2f9a0 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
2f9b0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2f9c0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c  NCTION_NOT_PARAL
2f9d0 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f 6e  LEL);...hSession
2f9e0 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a 20   = hSession; /* 
2f9f0 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20 76  Supress unused v
2fa00 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67 20  ariable warning 
2fa10 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  */.}..CK_DEFINE_
2fa20 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2fa30 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
2fa40 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c  t)(CK_FUNCTION_L
2fa50 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70 46 75  IST_PTR_PTR ppFu
2fa60 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09 43  nctionList) {..C
2fa70 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54 5f  K_FUNCTION_LIST_
2fa80 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  PTR pFunctionLis
2fa90 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
2faa0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2fab0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75 6e  .");...if (ppFun
2fac0 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55 4c  ctionList == NUL
2fad0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2fae0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2faf0 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  r. ppFunctionLis
2fb00 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
2fb10 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2fb20 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2fb30 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d  .pFunctionList =
2fb40 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
2fb50 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29 3b  pFunctionList));
2fb60 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ...pFunctionList
2fb70 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20  ->version.major 
2fb80 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
2fb90 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
2fba0 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
2fbb0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2fbc0 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d  >version.minor =
2fbd0 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
2fbe0 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
2fbf0 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a   >> 8) & 0xff;..
2fc00 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2fc10 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20 43  C_Initialize = C
2fc20 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70 46  _Initialize;..pF
2fc30 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
2fc40 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e 61  inalize = C_Fina
2fc50 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  lize;..pFunction
2fc60 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f 20  List->C_GetInfo 
2fc70 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70 46  = C_GetInfo;..pF
2fc80 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2fc90 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f 47  etSlotList = C_G
2fca0 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46 75  etSlotList;..pFu
2fcb0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2fcc0 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47 65  tSlotInfo = C_Ge
2fcd0 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75 6e  tSlotInfo;..pFun
2fce0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
2fcf0 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47 65  TokenInfo = C_Ge
2fd00 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46 75  tTokenInfo;..pFu
2fd10 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 61  nctionList->C_Wa
2fd20 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20 3d  itForSlotEvent =
2fd30 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76   C_WaitForSlotEv
2fd40 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ent;..pFunctionL
2fd50 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61 6e  ist->C_GetMechan
2fd60 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74 4d  ismList = C_GetM
2fd70 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09 70  echanismList;..p
2fd80 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2fd90 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66 6f  GetMechanismInfo
2fda0 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69 73   = C_GetMechanis
2fdb0 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69 6f  mInfo;..pFunctio
2fdc0 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f 6b  nList->C_InitTok
2fdd0 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65 6e  en = C_InitToken
2fde0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2fdf0 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43 5f  ->C_InitPIN = C_
2fe00 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63 74  InitPIN;..pFunct
2fe10 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50 49  ionList->C_SetPI
2fe20 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09 70  N = C_SetPIN;..p
2fe30 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2fe40 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43 5f  OpenSession = C_
2fe50 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70 46  OpenSession;..pF
2fe60 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
2fe70 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43 5f  loseSession = C_
2fe80 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09 70  CloseSession;..p
2fe90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2fea0 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e 73  CloseAllSessions
2feb0 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73   = C_CloseAllSes
2fec0 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69 6f  sions;..pFunctio
2fed0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73 73  nList->C_GetSess
2fee0 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74 53  ionInfo = C_GetS
2fef0 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46 75  essionInfo;..pFu
2ff00 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2ff10 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20  tOperationState 
2ff20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e  = C_GetOperation
2ff30 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  State;..pFunctio
2ff40 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65 72  nList->C_SetOper
2ff50 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f 53  ationState = C_S
2ff60 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
2ff70 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2ff80 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c 6f  ->C_Login = C_Lo
2ff90 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  gin;..pFunctionL
2ffa0 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d 20  ist->C_Logout = 
2ffb0 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e 63  C_Logout;..pFunc
2ffc0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65 61  tionList->C_Crea
2ffd0 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72 65  teObject = C_Cre
2ffe0 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  ateObject;..pFun
2fff0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f 70  ctionList->C_Cop
30000 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70 79  yObject = C_Copy
30010 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74 69  Object;..pFuncti
30020 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72 6f  onList->C_Destro
30030 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73 74  yObject = C_Dest
30040 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  royObject;..pFun
30050 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74  ctionList->C_Get
30060 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f 47  ObjectSize = C_G
30070 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09 70  etObjectSize;..p
30080 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30090 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75  GetAttributeValu
300a0 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62 75  e = C_GetAttribu
300b0 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74  teValue;..pFunct
300c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41 74  ionList->C_SetAt
300d0 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20 43  tributeValue = C
300e0 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _SetAttributeVal
300f0 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ue;..pFunctionLi
30100 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63 74  st->C_FindObject
30110 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f 62  sInit = C_FindOb
30120 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75 6e  jectsInit;..pFun
30130 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
30140 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69 6e  dObjects = C_Fin
30150 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e 63  dObjects;..pFunc
30160 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64  tionList->C_Find
30170 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20 43  ObjectsFinal = C
30180 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61  _FindObjectsFina
30190 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  l;..pFunctionLis
301a0 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69 74  t->C_EncryptInit
301b0 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69 74   = C_EncryptInit
301c0 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
301d0 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43 5f  ->C_Encrypt = C_
301e0 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63 74  Encrypt;..pFunct
301f0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79  ionList->C_Encry
30200 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e 63  ptUpdate = C_Enc
30210 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
30220 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
30230 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f 45  cryptFinal = C_E
30240 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46  ncryptFinal;..pF
30250 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
30260 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f 44  ecryptInit = C_D
30270 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46 75  ecryptInit;..pFu
30280 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
30290 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79 70  crypt = C_Decryp
302a0 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
302b0 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64 61  t->C_DecryptUpda
302c0 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70  te = C_DecryptUp
302d0 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
302e0 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 46  List->C_DecryptF
302f0 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70 74  inal = C_Decrypt
30300 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
30310 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 49  nList->C_DigestI
30320 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49 6e  nit = C_DigestIn
30330 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  it;..pFunctionLi
30340 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20 43  st->C_Digest = C
30350 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63 74  _Digest;..pFunct
30360 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73  ionList->C_Diges
30370 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67 65  tUpdate = C_Dige
30380 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  stUpdate;..pFunc
30390 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
303a0 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73 74  stKey = C_Digest
303b0 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  Key;..pFunctionL
303c0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69 6e  ist->C_DigestFin
303d0 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69 6e  al = C_DigestFin
303e0 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
303f0 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20 3d  st->C_SignInit =
30400 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70 46   C_SignInit;..pF
30410 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
30420 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09 70  ign = C_Sign;..p
30430 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30440 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f 53  SignUpdate = C_S
30450 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  ignUpdate;..pFun
30460 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
30470 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e 46  nFinal = C_SignF
30480 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
30490 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63 6f  List->C_SignReco
304a0 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67 6e  verInit = C_Sign
304b0 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46  RecoverInit;..pF
304c0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
304d0 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f 53  ignRecover = C_S
304e0 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46 75  ignRecover;..pFu
304f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
30500 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65 72  rifyInit = C_Ver
30510 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  ifyInit;..pFunct
30520 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
30530 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09 70  y = C_Verify;..p
30540 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
30550 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43  VerifyUpdate = C
30560 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a 09  _VerifyUpdate;..
30570 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
30580 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20 43  _VerifyFinal = C
30590 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09 70  _VerifyFinal;..p
305a0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
305b0 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e 69  VerifyRecoverIni
305c0 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63 6f  t = C_VerifyReco
305d0 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74  verInit;..pFunct
305e0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69 66  ionList->C_Verif
305f0 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65 72  yRecover = C_Ver
30600 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46 75  ifyRecover;..pFu
30610 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
30620 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61 74  gestEncryptUpdat
30630 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63 72  e = C_DigestEncr
30640 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  yptUpdate;..pFun
30650 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63  ctionList->C_Dec
30660 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74 65  ryptDigestUpdate
30670 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67 65   = C_DecryptDige
30680 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63  stUpdate;..pFunc
30690 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e  tionList->C_Sign
306a0 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d 20  EncryptUpdate = 
306b0 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70 64  C_SignEncryptUpd
306c0 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
306d0 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56 65  ist->C_DecryptVe
306e0 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f 44  rifyUpdate = C_D
306f0 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64 61  ecryptVerifyUpda
30700 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  te;..pFunctionLi
30710 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65  st->C_GenerateKe
30720 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b 65  y = C_GenerateKe
30730 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  y;..pFunctionLis
30740 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65 79  t->C_GenerateKey
30750 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61 74  Pair = C_Generat
30760 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e 63  eKeyPair;..pFunc
30770 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61 70  tionList->C_Wrap
30780 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79 3b  Key = C_WrapKey;
30790 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
307a0 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20 43  >C_UnwrapKey = C
307b0 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46 75  _UnwrapKey;..pFu
307c0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
307d0 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72 69  riveKey = C_Deri
307e0 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f  veKey;..pFunctio
307f0 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61 6e  nList->C_SeedRan
30800 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e 64  dom = C_SeedRand
30810 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  om;..pFunctionLi
30820 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52 61  st->C_GenerateRa
30830 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61 74  ndom = C_Generat
30840 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74  eRandom;..pFunct
30850 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75  ionList->C_GetFu
30860 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20 43  nctionStatus = C
30870 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61 74  _GetFunctionStat
30880 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  us;..pFunctionLi
30890 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e 63  st->C_CancelFunc
308a0 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c 46  tion = C_CancelF
308b0 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63 74  unction;..pFunct
308c0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46 75  ionList->C_GetFu
308d0 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f 47  nctionList = C_G
308e0 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b 0a  etFunctionList;.
308f0 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ..*ppFunctionLis
30900 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t = pFunctionLis
30910 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
30920 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
30930 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
30940 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
30950 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..