Hex Artifact Content

Artifact 77eca6ccdaff986b2a3f76c7ec857127f3a53222:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23  ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74    include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a  define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e  #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72  E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65  urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f  fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69  nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55  ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72  NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e   returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f  ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f  CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28  me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20  * name).#ifndef 
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69  NULL_PTR.#  defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65  ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75  pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23  de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20   "md5.h"../*. * 
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f  Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68  urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75  is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75  an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20  nctions and not 
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62  include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61  . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63  sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69  lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a  nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20   0x58../*** PIV 
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69  Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49   0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37  TR_GENAUTH  0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e  xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20  _PIV_AID        
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78  , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20  00, 0x00, 0x10, 
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30  0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a  ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69  /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31  -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23  PIVAUTH   0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54  _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65  URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  KEY_KEYMGT    0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41  P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a  RDAUTH  0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e  * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50  tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65   800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78  ALGO_RSA1024  0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a  SA2048  0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66  * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54  0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66  able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20  _3_OID_PIVAUTH  
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43  NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20  1, 0x0A.#define 
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35  ID_KEYMGT    0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64  F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54  73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  H  0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x01../* Maximum 
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a           250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69   ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64   MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49  efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a  ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e  E_TIME_H.#    in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63  tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 23 20 20 20 20 64  time = 0;.#    d
1760: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
1770: 55 47 5f 50 52 49 4e 54 54 49 4d 45 20 7b 20 69  UG_PRINTTIME { i
1780: 66 20 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  f (cackey_debug_
1790: 73 74 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29  start_time == 0)
17a0: 20 7b 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f   { cackey_debug_
17b0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17c0: 65 28 4e 55 4c 4c 29 3b 20 7d 3b 20 66 70 72 69  e(NULL); }; fpri
17d0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
17e0: 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20 22  _fd(), "[%lu]: "
17f0: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
1800: 29 20 28 74 69 6d 65 28 4e 55 4c 4c 29 20 2d 20  ) (time(NULL) - 
1810: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74 61  cackey_debug_sta
1820: 72 74 5f 74 69 6d 65 29 29 3b 20 7d 0a 23 20 20  rt_time)); }.#  
1830: 65 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65  else.#    define
1840: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1850: 49 4e 54 54 49 4d 45 20 2f 2a 2a 2f 0a 23 20 20  INTTIME /**/.#  
1860: 65 6e 64 69 66 0a 0a 23 20 20 64 65 66 69 6e 65  endif..#  define
1870: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1880: 49 4e 54 46 28 78 2e 2e 2e 29 20 7b 20 43 41 43  INTF(x...) { CAC
1890: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
18a0: 49 4d 45 3b 20 66 70 72 69 6e 74 66 28 63 61 63  IME; fprintf(cac
18b0: 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20  key_debug_fd(), 
18c0: 22 25 73 28 29 3a 25 69 3a 20 22 2c 20 5f 5f 66  "%s():%i: ", __f
18d0: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
18e0: 3b 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ; fprintf(cackey
18f0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 78 29 3b  _debug_fd(), x);
1900: 20 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f   fprintf(cackey_
1910: 64 65 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22  debug_fd(), "\n"
1920: 29 3b 20 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ); fflush(cackey
1930: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a  _debug_fd()); }.
1940: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1950: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
1960: 66 2c 20 78 2c 20 79 29 20 7b 20 75 6e 73 69 67  f, x, y) { unsig
1970: 6e 65 64 20 63 68 61 72 20 2a 54 4d 50 42 55 46  ned char *TMPBUF
1980: 3b 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ; unsigned long 
1990: 69 64 78 3b 20 54 4d 50 42 55 46 20 3d 20 28 75  idx; TMPBUF = (u
19a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
19b0: 28 78 29 3b 20 43 41 43 4b 45 59 5f 44 45 42 55  (x); CACKEY_DEBU
19c0: 47 5f 50 52 49 4e 54 54 49 4d 45 3b 20 66 70 72  G_PRINTTIME; fpr
19d0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
19e0: 67 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69  g_fd(), "%s():%i
19f0: 3a 20 25 73 20 20 28 25 73 2f 25 6c 75 20 3d 20  : %s  (%s/%lu = 
1a00: 7b 25 30 32 78 22 2c 20 5f 5f 66 75 6e 63 5f 5f  {%02x", __func__
1a10: 2c 20 5f 5f 4c 49 4e 45 5f 5f 2c 20 66 2c 20 23  , __LINE__, f, #
1a20: 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
1a30: 67 29 20 28 79 29 2c 20 54 4d 50 42 55 46 5b 30  g) (y), TMPBUF[0
1a40: 5d 29 3b 20 66 6f 72 20 28 69 64 78 20 3d 20 31  ]); for (idx = 1
1a50: 3b 20 69 64 78 20 3c 20 28 79 29 3b 20 69 64 78  ; idx < (y); idx
1a60: 2b 2b 29 20 7b 20 66 70 72 69 6e 74 66 28 63 61  ++) { fprintf(ca
1a70: 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c  ckey_debug_fd(),
1a80: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1a90: 46 5b 69 64 78 5d 29 3b 20 7d 3b 20 66 70 72 69  F[idx]); }; fpri
1aa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1ab0: 5f 66 64 28 29 2c 20 22 7d 29 5c 6e 22 29 3b 20  _fd(), "})\n"); 
1ac0: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1ad0: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1ae0: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
1af0: 42 55 47 5f 50 45 52 52 4f 52 28 78 29 20 7b 20  BUG_PERROR(x) { 
1b00: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
1b10: 65 62 75 67 5f 66 64 28 29 2c 20 22 25 73 28 29  ebug_fd(), "%s()
1b20: 3a 25 69 3a 20 22 2c 20 5f 5f 66 75 6e 63 5f 5f  :%i: ", __func__
1b30: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 20 43 41 43  , __LINE__); CAC
1b40: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 54  KEY_DEBUG_PRINTT
1b50: 49 4d 45 3b 20 70 65 72 72 6f 72 28 78 29 3b 20  IME; perror(x); 
1b60: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
1b70: 62 75 67 5f 66 64 28 29 29 3b 20 7d 0a 23 20 20  bug_fd()); }.#  
1b80: 64 65 66 69 6e 65 20 66 72 65 65 28 78 29 20 7b  define free(x) {
1b90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
1ba0: 49 4e 54 46 28 22 46 52 45 45 28 25 70 29 20 28  INTF("FREE(%p) (
1bb0: 25 73 29 22 2c 20 28 76 6f 69 64 20 2a 29 20 78  %s)", (void *) x
1bc0: 2c 20 23 78 29 3b 20 66 72 65 65 28 78 29 3b 20  , #x); free(x); 
1bd0: 7d 0a 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  }..static FILE *
1be0: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
1bf0: 76 6f 69 64 29 20 7b 0a 09 73 74 61 74 69 63 20  void) {..static 
1c00: 46 49 4c 45 20 2a 66 64 20 3d 20 4e 55 4c 4c 3b  FILE *fd = NULL;
1c10: 0a 09 63 68 61 72 20 2a 6c 6f 67 66 69 6c 65 3b  ..char *logfile;
1c20: 0a 0a 09 69 66 20 28 66 64 20 21 3d 20 4e 55 4c  ...if (fd != NUL
1c30: 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 66 64  L) {...return(fd
1c40: 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4c  );..}.../*.. * L
1c50: 6f 67 20 74 6f 20 73 74 64 65 72 72 20 69 6e 69  og to stderr ini
1c60: 74 69 61 6c 6c 79 20 73 6f 20 77 65 20 63 61 6e  tially so we can
1c70: 20 75 73 65 20 64 65 62 75 67 67 69 6e 67 20 77   use debugging w
1c80: 69 74 68 69 6e 0a 09 20 2a 20 74 68 69 73 20 66  ithin.. * this f
1c90: 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20  unction without 
1ca0: 67 65 74 74 69 6e 67 20 69 6e 74 6f 20 61 6e 20  getting into an 
1cb0: 69 6e 66 69 6e 69 74 65 20 6c 6f 6f 70 0a 09 20  infinite loop.. 
1cc0: 2a 2f 0a 09 66 64 20 3d 20 73 74 64 65 72 72 3b  */..fd = stderr;
1cd0: 0a 0a 09 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74  ...logfile = get
1ce0: 65 6e 76 28 22 43 41 43 4b 45 59 5f 44 45 42 55  env("CACKEY_DEBU
1cf0: 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a 09 69 66  G_LOGFILE");..if
1d00: 20 28 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c   (logfile != NUL
1d10: 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1d20: 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1d30: 64 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76 61  d environment va
1d40: 72 69 61 62 6c 65 3a 20 25 73 22 2c 20 6c 6f 67  riable: %s", log
1d50: 66 69 6c 65 29 3b 0a 0a 09 09 6c 6f 67 66 69 6c  file);....logfil
1d60: 65 20 3d 20 73 74 72 63 68 72 28 6c 6f 67 66 69  e = strchr(logfi
1d70: 6c 65 2c 20 27 3d 27 29 3b 0a 09 09 69 66 20 28  le, '=');...if (
1d80: 6c 6f 67 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29  logfile == NULL)
1d90: 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 20 3d 20   {....logfile = 
1da0: 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 44  getenv("CACKEY_D
1db0: 45 42 55 47 5f 4c 4f 47 46 49 4c 45 22 29 3b 0a  EBUG_LOGFILE");.
1dc0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 6c 6f  ..} else {....lo
1dd0: 67 66 69 6c 65 2b 2b 3b 0a 09 09 7d 0a 09 7d 0a  gfile++;...}..}.
1de0: 0a 09 69 66 20 28 6c 6f 67 66 69 6c 65 20 21 3d  ..if (logfile !=
1df0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1e00: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e10: 46 6f 75 6e 64 20 6c 6f 67 20 66 69 6c 65 3a 20  Found log file: 
1e20: 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b 0a 0a  %s", logfile);..
1e30: 09 09 66 64 20 3d 20 66 6f 70 65 6e 28 6c 6f 67  ..fd = fopen(log
1e40: 66 69 6c 65 2c 20 22 61 22 29 3b 0a 09 7d 0a 0a  file, "a");..}..
1e50: 09 69 66 20 28 66 64 20 3d 3d 20 4e 55 4c 4c 29  .if (fd == NULL)
1e60: 20 7b 0a 09 09 66 64 20 3d 20 73 74 64 65 72 72   {...fd = stderr
1e70: 3b 0a 09 7d 0a 0a 09 69 66 20 28 66 64 20 3d 3d  ;..}...if (fd ==
1e80: 20 73 74 64 65 72 72 29 20 7b 0a 09 09 43 41 43   stderr) {...CAC
1e90: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ea0: 28 22 52 65 74 75 72 6e 69 6e 67 20 73 74 64 65  ("Returning stde
1eb0: 72 72 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  rr");..} else {.
1ec0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ed0: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1ee0: 20 25 70 22 2c 20 28 76 6f 69 64 20 2a 29 20 66   %p", (void *) f
1ef0: 64 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  d);..}...return(
1f00: 66 64 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  fd);.}..static v
1f10: 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  oid *CACKEY_DEBU
1f20: 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 73 69  G_FUNC_MALLOC(si
1f30: 7a 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74  ze_t size, const
1f40: 20 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74   char *func, int
1f50: 20 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a   line) {..void *
1f60: 72 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c  retval;...retval
1f70: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 29 3b   = malloc(size);
1f80: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f90: 50 52 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69  PRINTTIME;..fpri
1fa0: 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67  ntf(cackey_debug
1fb0: 5f 66 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a  _fd(), "%s():%i:
1fc0: 20 22 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b   ", func, line);
1fd0: 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79  ..fprintf(cackey
1fe0: 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22 4d 41  _debug_fd(), "MA
1ff0: 4c 4c 4f 43 28 29 20 3d 20 25 70 22 2c 20 72 65  LLOC() = %p", re
2000: 74 76 61 6c 29 3b 0a 09 66 70 72 69 6e 74 66 28  tval);..fprintf(
2010: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2020: 29 2c 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73  ), "\n");..fflus
2030: 68 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  h(cackey_debug_f
2040: 64 28 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  d());...return(r
2050: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69  etval);.}..stati
2060: 63 20 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44  c void *CACKEY_D
2070: 45 42 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f  EBUG_FUNC_REALLO
2080: 43 28 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a  C(void *ptr, siz
2090: 65 5f 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20  e_t size, const 
20a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
20b0: 6c 69 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72  line) {..void *r
20c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
20d0: 3d 20 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73  = realloc(ptr, s
20e0: 69 7a 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76  ize);...if (retv
20f0: 61 6c 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 43  al != ptr) {...C
2100: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2110: 54 54 49 4d 45 3b 0a 09 09 66 70 72 69 6e 74 66  TTIME;...fprintf
2120: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64  (cackey_debug_fd
2130: 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22 2c  (), "%s():%i: ",
2140: 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09 09   func, line);...
2150: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2160: 65 62 75 67 5f 66 64 28 29 2c 20 22 52 45 41 4c  ebug_fd(), "REAL
2170: 4c 4f 43 28 25 70 29 20 3d 20 25 70 22 2c 20 70  LOC(%p) = %p", p
2180: 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a 09 09 66  tr, retval);...f
2190: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
21a0: 62 75 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b  bug_fd(), "\n");
21b0: 0a 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ...fflush(cackey
21c0: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d  _debug_fd());..}
21d0: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d  ...if (retval ==
21e0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
21f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2200: 20 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72   *** ERROR *** r
2210: 65 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20  ealloc returned 
2220: 4e 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75  NULL (size = %lu
2230: 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
2240: 6e 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09  ng) size);..}...
2250: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2260: 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  }..static char *
2270: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
2280: 43 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63  C_STRDUP(const c
2290: 68 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20  har *ptr, const 
22a0: 63 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20  char *func, int 
22b0: 6c 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72  line) {..char *r
22c0: 65 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20  etval;...retval 
22d0: 3d 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a  = strdup(ptr);..
22e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
22f0: 49 4e 54 54 49 4d 45 3b 0a 09 66 70 72 69 6e 74  INTTIME;..fprint
2300: 66 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66  f(cackey_debug_f
2310: 64 28 29 2c 20 22 25 73 28 29 3a 25 69 3a 20 22  d(), "%s():%i: "
2320: 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 29 3b 0a 09  , func, line);..
2330: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
2340: 65 62 75 67 5f 66 64 28 29 2c 20 22 53 54 52 44  ebug_fd(), "STRD
2350: 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  UP_MALLOC() = %p
2360: 22 2c 20 72 65 74 76 61 6c 29 3b 0a 09 66 70 72  ", retval);..fpr
2370: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
2380: 67 5f 66 64 28 29 2c 20 22 5c 6e 22 29 3b 0a 09  g_fd(), "\n");..
2390: 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64 65  fflush(cackey_de
23a0: 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09 72 65 74  bug_fd());...ret
23b0: 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a  urn(retval);.}..
23c0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
23d0: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
23e0: 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
23f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 61  unsigned char ta
2400: 67 29 20 7b 0a 09 73 77 69 74 63 68 20 28 74 61  g) {..switch (ta
2410: 67 29 20 7b 0a 09 09 63 61 73 65 20 47 53 43 49  g) {...case GSCI
2420: 53 5f 54 41 47 5f 43 41 52 44 49 44 3a 0a 09 09  S_TAG_CARDID:...
2430: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2440: 41 47 5f 43 41 52 44 49 44 22 29 3b 0a 09 09 63  AG_CARDID");...c
2450: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 43  ase GSCIS_TAG_CC
2460: 43 5f 56 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  C_VER:....return
2470: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 43 43 5f  ("GSCIS_TAG_CCC_
2480: 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53  VER");...case GS
2490: 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 3a  CIS_TAG_CCG_VER:
24a0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
24b0: 53 5f 54 41 47 5f 43 43 47 5f 56 45 52 22 29 3b  S_TAG_CCG_VER");
24c0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
24d0: 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09 09 72 65  G_CARDURL:....re
24e0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
24f0: 43 41 52 44 55 52 4c 22 29 3b 0a 09 09 63 61 73  CARDURL");...cas
2500: 65 20 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  e GSCIS_TAG_PKCS
2510: 31 35 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  15:....return("G
2520: 53 43 49 53 5f 54 41 47 5f 50 4b 43 53 31 35 22  SCIS_TAG_PKCS15"
2530: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2540: 54 41 47 5f 52 45 47 5f 44 41 54 41 5f 4d 4f 44  TAG_REG_DATA_MOD
2550: 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  EL:....return("G
2560: 53 43 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54  SCIS_TAG_REG_DAT
2570: 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09 63 61 73  A_MODEL");...cas
2580: 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  e GSCIS_TAG_ACR_
2590: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
25a0: 28 22 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f  ("GSCIS_TAG_ACR_
25b0: 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20  TABLE");...case 
25c0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25d0: 50 44 55 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  PDU:....return("
25e0: 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44 5f 41  GSCIS_TAG_CARD_A
25f0: 50 44 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  PDU");...case GS
2600: 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45 43 54  CIS_TAG_REDIRECT
2610: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
2620: 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52 45  GSCIS_TAG_REDIRE
2630: 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20  CTION");...case 
2640: 47 53 43 49 53 5f 54 41 47 5f 43 54 3a 0a 09 09  GSCIS_TAG_CT:...
2650: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2660: 41 47 5f 43 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_CT");...case 
2670: 47 53 43 49 53 5f 54 41 47 5f 53 54 3a 0a 09 09  GSCIS_TAG_ST:...
2680: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2690: 41 47 5f 53 54 22 29 3b 0a 09 09 63 61 73 65 20  AG_ST");...case 
26a0: 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43  GSCIS_TAG_NEXTCC
26b0: 43 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  C:....return("GS
26c0: 43 49 53 5f 54 41 47 5f 4e 45 58 54 43 43 43 22  CIS_TAG_NEXTCCC"
26d0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
26e0: 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09 09 72 65  TAG_FNAME:....re
26f0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2700: 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20  FNAME");...case 
2710: 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 3a  GSCIS_TAG_MNAME:
2720: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2730: 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29 3b 0a 09  S_TAG_MNAME");..
2740: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2750: 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e  LNAME:....return
2760: 28 22 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  ("GSCIS_TAG_LNAM
2770: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2780: 53 5f 54 41 47 5f 53 55 46 46 49 58 3a 0a 09 09  S_TAG_SUFFIX:...
2790: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
27a0: 41 47 5f 53 55 46 46 49 58 22 29 3b 0a 09 09 63  AG_SUFFIX");...c
27b0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 47 4f  ase GSCIS_TAG_GO
27c0: 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09 09 72 65  VT_AGENCY:....re
27d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
27e0: 47 4f 56 54 5f 41 47 45 4e 43 59 22 29 3b 0a 09  GOVT_AGENCY");..
27f0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2800: 42 55 52 45 41 55 3a 0a 09 09 09 72 65 74 75 72  BUREAU:....retur
2810: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52  n("GSCIS_TAG_BUR
2820: 45 41 55 22 29 3b 0a 09 09 63 61 73 65 20 47 53  EAU");...case GS
2830: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
2840: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2850: 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55  GSCIS_TAG_BUREAU
2860: 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20  _CODE");...case 
2870: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
2880: 4f 44 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ODE:....return("
2890: 47 53 43 49 53 5f 54 41 47 5f 44 45 50 54 5f 43  GSCIS_TAG_DEPT_C
28a0: 4f 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ODE");...case GS
28b0: 43 49 53 5f 54 41 47 5f 54 49 54 4c 45 3a 0a 09  CIS_TAG_TITLE:..
28c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
28d0: 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a 09 09 63  TAG_TITLE");...c
28e0: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55  ase GSCIS_TAG_BU
28f0: 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65 74 75 72  ILDING:....retur
2900: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 49  n("GSCIS_TAG_BUI
2910: 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61 73 65 20  LDING");...case 
2920: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2930: 5f 41 44 44 52 31 3a 0a 09 09 09 72 65 74 75 72  _ADDR1:....retur
2940: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2950: 49 43 45 5f 41 44 44 52 31 22 29 3b 0a 09 09 63  ICE_ADDR1");...c
2960: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46  ase GSCIS_TAG_OF
2970: 46 49 43 45 5f 41 44 44 52 32 3a 0a 09 09 09 72  FICE_ADDR2:....r
2980: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2990: 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 22 29 3b  _OFFICE_ADDR2");
29a0: 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
29b0: 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 3a 0a 09  G_OFFICE_CITY:..
29c0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
29d0: 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59 22  TAG_OFFICE_CITY"
29e0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
29f0: 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54 45  TAG_OFFICE_STATE
2a00: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2a10: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54  IS_TAG_OFFICE_ST
2a20: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ATE");...case GS
2a30: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 5a  CIS_TAG_OFFICE_Z
2a40: 49 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  IP:....return("G
2a50: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2a60: 5a 49 50 22 29 3b 0a 09 09 63 61 73 65 20 47 53  ZIP");...case GS
2a70: 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43  CIS_TAG_OFFICE_C
2a80: 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65 74 75 72  OUNTRY:....retur
2a90: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  n("GSCIS_TAG_OFF
2aa0: 49 43 45 5f 43 4f 55 4e 54 52 59 22 29 3b 0a 09  ICE_COUNTRY");..
2ab0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ac0: 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a 0a 09 09  OFFICE_PHONE:...
2ad0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2ae0: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 22  AG_OFFICE_PHONE"
2af0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2b00: 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45  TAG_OFFICE_PHONE
2b10: 5f 45 58 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  _EXT:....return(
2b20: 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43  "GSCIS_TAG_OFFIC
2b30: 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29 3b 0a 09  E_PHONE_EXT");..
2b40: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b50: 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09 09 09 72  OFFICE_FAX:....r
2b60: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2b70: 5f 4f 46 46 49 43 45 5f 46 41 58 22 29 3b 0a 09  _OFFICE_FAX");..
2b80: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2b90: 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a 0a 09 09  OFFICE_EMAIL:...
2ba0: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2bb0: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 22  AG_OFFICE_EMAIL"
2bc0: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2bd0: 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 3a  TAG_OFFICE_ROOM:
2be0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2bf0: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f 4f  S_TAG_OFFICE_ROO
2c00: 4d 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  M");...case GSCI
2c10: 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f 41 47 45  S_TAG_NONGOV_AGE
2c20: 4e 43 59 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  NCY:....return("
2c30: 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56  GSCIS_TAG_NONGOV
2c40: 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09 63 61 73  _AGENCY");...cas
2c50: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 5f  e GSCIS_TAG_SSN_
2c60: 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09 09 09 72  DESIGNATOR:....r
2c70: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2c80: 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 22  _SSN_DESIGNATOR"
2c90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2ca0: 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72 65 74 75  TAG_SSN:....retu
2cb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 53 53  rn("GSCIS_TAG_SS
2cc0: 4e 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  N");...case GSCI
2cd0: 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09 09 72 65  S_TAG_DOB:....re
2ce0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2cf0: 44 4f 42 22 29 3b 0a 09 09 63 61 73 65 20 47 53  DOB");...case GS
2d00: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 3a 0a  CIS_TAG_GENDER:.
2d10: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d20: 5f 54 41 47 5f 47 45 4e 44 45 52 22 29 3b 0a 09  _TAG_GENDER");..
2d30: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2d40: 55 53 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72  USERID:....retur
2d50: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 55 53 45  n("GSCIS_TAG_USE
2d60: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2d70: 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 3a 0a  CIS_TAG_DOMAIN:.
2d80: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2d90: 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29 3b 0a 09  _TAG_DOMAIN");..
2da0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2db0: 50 41 53 53 57 4f 52 44 3a 0a 09 09 09 72 65 74  PASSWORD:....ret
2dc0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 50  urn("GSCIS_TAG_P
2dd0: 41 53 53 57 4f 52 44 22 29 3b 0a 09 09 63 61 73  ASSWORD");...cas
2de0: 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55  e GSCIS_TAG_ISSU
2df0: 45 52 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  ERID:....return(
2e00: 22 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45  "GSCIS_TAG_ISSUE
2e10: 52 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53  RID");...case GS
2e20: 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f 3a 0a 09  CIS_TAG_SERNO:..
2e30: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2e40: 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a 09 09 63  TAG_SERNO");...c
2e50: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49 53  ase GSCIS_TAG_IS
2e60: 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  SUE_DATE:....ret
2e70: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49  urn("GSCIS_TAG_I
2e80: 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09 09 63  SSUE_DATE");...c
2e90: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58  ase GSCIS_TAG_EX
2ea0: 50 49 52 45 5f 44 41 54 45 3a 0a 09 09 09 72 65  PIRE_DATE:....re
2eb0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2ec0: 45 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09  EXPIRE_DATE");..
2ed0: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
2ee0: 43 41 52 44 5f 54 59 50 45 3a 0a 09 09 09 72 65  CARD_TYPE:....re
2ef0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2f00: 43 41 52 44 5f 54 59 50 45 22 29 3b 0a 09 09 63  CARD_TYPE");...c
2f10: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 45  ase GSCIS_TAG_SE
2f20: 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a 09 09 09  CURITY_CODE:....
2f30: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f40: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 22  G_SECURITY_CODE"
2f50: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2f60: 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 3a 0a  TAG_CARDID_AID:.
2f70: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2f80: 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49 44 22  _TAG_CARDID_AID"
2f90: 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f  );...case GSCIS_
2fa0: 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a  TAG_CERTIFICATE:
2fb0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2fc0: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
2fd0: 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49  E");...case GSCI
2fe0: 53 5f 54 41 47 5f 43 45 52 54 5f 49 53 53 55 45  S_TAG_CERT_ISSUE
2ff0: 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e  _DATE:....return
3000: 28 22 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54  ("GSCIS_TAG_CERT
3010: 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a 09  _ISSUE_DATE");..
3020: 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f  .case GSCIS_TAG_
3030: 43 45 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45  CERT_EXPIRE_DATE
3040: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
3050: 49 53 5f 54 41 47 5f 43 45 52 54 5f 45 58 50 49  IS_TAG_CERT_EXPI
3060: 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d 0a 0a 09  RE_DATE");..}...
3070: 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22  return("UNKNOWN"
3080: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e  );.}..static con
3090: 73 74 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f  st char *CACKEY_
30a0: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
30b0: 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f 4e 47 20  ERR_TO_STR(LONG 
30c0: 72 65 74 63 6f 64 65 29 20 7b 0a 09 73 77 69 74  retcode) {..swit
30d0: 63 68 20 28 72 65 74 63 6f 64 65 29 20 7b 0a 09  ch (retcode) {..
30e0: 09 63 61 73 65 20 53 43 41 52 44 5f 53 5f 53 55  .case SCARD_S_SU
30f0: 43 43 45 53 53 3a 0a 09 09 09 72 65 74 75 72 6e  CCESS:....return
3100: 28 22 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  ("SCARD_S_SUCCES
3110: 53 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  S");...case SCAR
3120: 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09  D_E_CANCELLED:..
3130: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3140: 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29 3b 0a 09  E_CANCELLED");..
3150: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41  .case SCARD_E_CA
3160: 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09 09 09 72  NT_DISPOSE:....r
3170: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3180: 41 4e 54 5f 44 49 53 50 4f 53 45 22 29 3b 0a 09  ANT_DISPOSE");..
3190: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
31a0: 53 55 46 46 49 43 49 45 4e 54 5f 42 55 46 46 45  SUFFICIENT_BUFFE
31b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  R:....return("SC
31c0: 41 52 44 5f 45 5f 49 4e 53 55 46 46 49 43 49 45  ARD_E_INSUFFICIE
31d0: 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a 09 09 63  NT_BUFFER");...c
31e0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
31f0: 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72 65 74 75  LID_ATR:....retu
3200: 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41  rn("SCARD_E_INVA
3210: 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09 63 61 73  LID_ATR");...cas
3220: 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49  e SCARD_E_INVALI
3230: 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09 72 65 74  D_HANDLE:....ret
3240: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56  urn("SCARD_E_INV
3250: 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29 3b 0a 09  ALID_HANDLE");..
3260: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e  .case SCARD_E_IN
3270: 56 41 4c 49 44 5f 50 41 52 41 4d 45 54 45 52 3a  VALID_PARAMETER:
3280: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3290: 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41  D_E_INVALID_PARA
32a0: 4d 45 54 45 52 22 29 3b 0a 09 09 63 61 73 65 20  METER");...case 
32b0: 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
32c0: 54 41 52 47 45 54 3a 0a 09 09 09 72 65 74 75 72  TARGET:....retur
32d0: 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  n("SCARD_E_INVAL
32e0: 49 44 5f 54 41 52 47 45 54 22 29 3b 0a 09 09 63  ID_TARGET");...c
32f0: 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41  ase SCARD_E_INVA
3300: 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65  LID_VALUE:....re
3310: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3320: 56 41 4c 49 44 5f 56 41 4c 55 45 22 29 3b 0a 09  VALID_VALUE");..
3330: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f  .case SCARD_E_NO
3340: 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72 65 74 75  _MEMORY:....retu
3350: 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f 4d  rn("SCARD_E_NO_M
3360: 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61 73 65 20  EMORY");...case 
3370: 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f 57 4e 5f  SCARD_E_UNKNOWN_
3380: 52 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72  READER:....retur
3390: 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  n("SCARD_E_UNKNO
33a0: 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63  WN_READER");...c
33b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 54 49 4d 45  ase SCARD_E_TIME
33c0: 4f 55 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  OUT:....return("
33d0: 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f 55 54 22  SCARD_E_TIMEOUT"
33e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
33f0: 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54  E_SHARING_VIOLAT
3400: 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ION:....return("
3410: 53 43 41 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f  SCARD_E_SHARING_
3420: 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a 09 09 63  VIOLATION");...c
3430: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 53  ase SCARD_E_NO_S
3440: 4d 41 52 54 43 41 52 44 3a 0a 09 09 09 72 65 74  MARTCARD:....ret
3450: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f 5f  urn("SCARD_E_NO_
3460: 53 4d 41 52 54 43 41 52 44 22 29 3b 0a 09 09 63  SMARTCARD");...c
3470: 61 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e  ase SCARD_E_UNKN
3480: 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09 72 65 74  OWN_CARD:....ret
3490: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 4b  urn("SCARD_E_UNK
34a0: 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a 09 09 63  NOWN_CARD");...c
34b0: 61 73 65 20 53 43 41 52 44 5f 45 5f 50 52 4f 54  ase SCARD_E_PROT
34c0: 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09 09 09 72  O_MISMATCH:....r
34d0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 50  eturn("SCARD_E_P
34e0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 22 29 3b  ROTO_MISMATCH");
34f0: 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f  ...case SCARD_E_
3500: 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09 09 72 65  NOT_READY:....re
3510: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e 4f  turn("SCARD_E_NO
3520: 54 5f 52 45 41 44 59 22 29 3b 0a 09 09 63 61 73  T_READY");...cas
3530: 65 20 53 43 41 52 44 5f 45 5f 53 59 53 54 45 4d  e SCARD_E_SYSTEM
3540: 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09 09 09 72  _CANCELLED:....r
3550: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 53  eturn("SCARD_E_S
3560: 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 22  YSTEM_CANCELLED"
3570: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3580: 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43 54 45 44  E_NOT_TRANSACTED
3590: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
35a0: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
35b0: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43  TED");...case SC
35c0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 41  ARD_E_READER_UNA
35d0: 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09 72 65 74  VAILABLE:....ret
35e0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
35f0: 44 45 52 5f 55 4e 41 56 41 49 4c 41 42 4c 45 22  DER_UNAVAILABLE"
3600: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3610: 57 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f 43 41  W_UNSUPPORTED_CA
3620: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3630: 43 41 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54  CARD_W_UNSUPPORT
3640: 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73  ED_CARD");...cas
3650: 65 20 53 43 41 52 44 5f 57 5f 55 4e 52 45 53 50  e SCARD_W_UNRESP
3660: 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a 09 09 09  ONSIVE_CARD:....
3670: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57 5f  return("SCARD_W_
3680: 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f 43 41 52  UNRESPONSIVE_CAR
3690: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
36a0: 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41  D_W_UNPOWERED_CA
36b0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
36c0: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
36d0: 5f 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20  _CARD");...case 
36e0: 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41  SCARD_W_RESET_CA
36f0: 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  RD:....return("S
3700: 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
3710: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3720: 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52 44  D_W_REMOVED_CARD
3730: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3740: 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43 41 52  RD_W_REMOVED_CAR
3750: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3760: 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d 41 4c  D_E_PCI_TOO_SMAL
3770: 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43  L:....return("SC
3780: 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53 4d  ARD_E_PCI_TOO_SM
3790: 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65 20 53 43  ALL");...case SC
37a0: 41 52 44 5f 45 5f 52 45 41 44 45 52 5f 55 4e 53  ARD_E_READER_UNS
37b0: 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72 65 74  UPPORTED:....ret
37c0: 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 52 45 41  urn("SCARD_E_REA
37d0: 44 45 52 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  DER_UNSUPPORTED"
37e0: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
37f0: 45 5f 44 55 50 4c 49 43 41 54 45 5f 52 45 41 44  E_DUPLICATE_READ
3800: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
3810: 43 41 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45  CARD_E_DUPLICATE
3820: 5f 52 45 41 44 45 52 22 29 3b 0a 09 09 63 61 73  _READER");...cas
3830: 65 20 53 43 41 52 44 5f 45 5f 43 41 52 44 5f 55  e SCARD_E_CARD_U
3840: 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09 72  NSUPPORTED:....r
3850: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 43  eturn("SCARD_E_C
3860: 41 52 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 22  ARD_UNSUPPORTED"
3870: 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  );...case SCARD_
3880: 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a 0a 09 09  E_NO_SERVICE:...
3890: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
38a0: 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29 3b 0a 09  _NO_SERVICE");..
38b0: 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 45  .case SCARD_E_SE
38c0: 52 56 49 43 45 5f 53 54 4f 50 50 45 44 3a 0a 09  RVICE_STOPPED:..
38d0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38e0: 45 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45  E_SERVICE_STOPPE
38f0: 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52  D");...case SCAR
3900: 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54 45 44 5f  D_E_UNSUPPORTED_
3910: 46 45 41 54 55 52 45 3a 0a 09 09 09 72 65 74 75  FEATURE:....retu
3920: 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e 53 55  rn("SCARD_E_UNSU
3930: 50 50 4f 52 54 45 44 5f 46 45 41 54 55 52 45 22  PPORTED_FEATURE"
3940: 29 3b 0a 23 69 66 64 65 66 20 53 43 41 52 44 5f  );.#ifdef SCARD_
3950: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 0a  W_INSERTED_CARD.
3960: 09 09 63 61 73 65 20 53 43 41 52 44 5f 57 5f 49  ..case SCARD_W_I
3970: 4e 53 45 52 54 45 44 5f 43 41 52 44 3a 0a 09 09  NSERTED_CARD:...
3980: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 57  .return("SCARD_W
3990: 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 22 29  _INSERTED_CARD")
39a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
39b0: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45  SCARD_E_NO_READE
39c0: 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a 09 09 63  RS_AVAILABLE...c
39d0: 61 73 65 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52  ase SCARD_E_NO_R
39e0: 45 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45  EADERS_AVAILABLE
39f0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3a00: 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45 52 53 5f  RD_E_NO_READERS_
3a10: 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a 23 65 6e  AVAILABLE");.#en
3a20: 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  dif..}...return(
3a30: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 73  "UNKNOWN");.}..s
3a40: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
3a50: 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46   *CACKEY_DEBUG_F
3a60: 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
3a70: 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a 69 64 29  (uint16_t objid)
3a80: 20 7b 0a 09 73 77 69 74 63 68 20 28 6f 62 6a 69   {..switch (obji
3a90: 64 29 20 7b 0a 09 09 63 61 73 65 20 30 78 32 30  d) {...case 0x20
3aa0: 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  00:....return("C
3ab0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
3ac0: 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29 3b 0a 09  GENERALINFO");..
3ad0: 09 63 61 73 65 20 30 78 32 31 30 30 3a 0a 09 09  .case 0x2100:...
3ae0: 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f  .return("CACKEY_
3af0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
3b00: 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a 09 09 63  SONALINFO");...c
3b10: 61 73 65 20 30 78 33 30 30 30 3a 0a 09 09 09 72  ase 0x3000:....r
3b20: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3b30: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
3b40: 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61 73 65 20  NTROL");...case 
3b50: 30 78 34 30 30 30 3a 0a 09 09 09 72 65 74 75 72  0x4000:....retur
3b60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  n("CACKEY_TLV_OB
3b70: 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a 09 09 63  JID_LOGIN");...c
3b80: 61 73 65 20 30 78 35 30 30 30 3a 0a 09 09 09 72  ase 0x5000:....r
3b90: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3ba0: 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f  V_OBJID_CARDINFO
3bb0: 22 29 3b 0a 09 09 63 61 73 65 20 30 78 36 30 30  ");...case 0x600
3bc0: 30 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41  0:....return("CA
3bd0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 42  CKEY_TLV_OBJID_B
3be0: 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a 09 09 63  IOMETRICS");...c
3bf0: 61 73 65 20 30 78 37 30 30 30 3a 0a 09 09 09 72  ase 0x7000:....r
3c00: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3c10: 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54 41 4c 53  V_OBJID_DIGITALS
3c20: 49 47 43 45 52 54 22 29 3b 0a 09 09 63 61 73 65  IGCERT");...case
3c30: 20 30 78 30 32 30 30 3a 0a 09 09 09 72 65 74 75   0x0200:....retu
3c40: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3c50: 42 4a 49 44 5f 43 41 43 5f 50 45 52 53 4f 4e 22  BJID_CAC_PERSON"
3c60: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 32 30 32  );...case 0x0202
3c70: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3c80: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
3c90: 43 5f 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  C_BENEFITS");...
3ca0: 63 61 73 65 20 30 78 30 32 30 33 3a 0a 09 09 09  case 0x0203:....
3cb0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3cc0: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54 48  LV_OBJID_CAC_OTH
3cd0: 45 52 42 45 4e 45 46 49 54 53 22 29 3b 0a 09 09  ERBENEFITS");...
3ce0: 63 61 73 65 20 30 78 30 32 30 31 3a 0a 09 09 09  case 0x0201:....
3cf0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3d00: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
3d10: 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63 61 73 65  SONNEL");...case
3d20: 20 30 78 30 32 46 45 3a 0a 09 09 09 72 65 74 75   0x02FE:....retu
3d30: 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  rn("CACKEY_TLV_O
3d40: 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52 54  BJID_CAC_PKICERT
3d50: 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74 75 72 6e  ");..}....return
3d60: 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a  ("UNKNOWN");.}..
3d70: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
3d80: 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  r *CACKEY_DEBUG_
3d90: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
3da0: 53 54 52 28 75 69 6e 74 38 5f 74 20 61 70 70 74  STR(uint8_t appt
3db0: 79 70 65 29 20 7b 0a 09 73 77 69 74 63 68 20 28  ype) {..switch (
3dc0: 61 70 70 74 79 70 65 29 20 7b 0a 09 09 63 61 73  apptype) {...cas
3dd0: 65 20 30 78 30 30 3a 0a 09 09 09 72 65 74 75 72  e 0x00:....retur
3de0: 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09 63 61 73  n("NONE");...cas
3df0: 65 20 30 78 30 31 3a 0a 09 09 09 72 65 74 75 72  e 0x01:....retur
3e00: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e10: 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a 09 09 63  P_GENERIC");...c
3e20: 61 73 65 20 30 78 30 32 3a 0a 09 09 09 72 65 74  ase 0x02:....ret
3e30: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
3e40: 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09 63 61 73  APP_SKI");...cas
3e50: 65 20 30 78 30 33 3a 0a 09 09 09 72 65 74 75 72  e 0x03:....retur
3e60: 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  n("CACKEY_TLV_AP
3e70: 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b  P_GENERIC | CACK
3e80: 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 22 29  EY_TLV_APP_SKI")
3e90: 3b 0a 09 09 63 61 73 65 20 30 78 30 34 3a 0a 09  ;...case 0x04:..
3ea0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3eb0: 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a  _TLV_APP_PKI");.
3ec0: 09 09 63 61 73 65 20 30 78 30 35 3a 0a 09 09 09  ..case 0x05:....
3ed0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3ee0: 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c  LV_APP_GENERIC |
3ef0: 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f   CACKEY_TLV_APP_
3f00: 50 4b 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78  PKI");...case 0x
3f10: 30 36 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  06:....return("C
3f20: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
3f30: 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  I | CACKEY_TLV_A
3f40: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_PKI");...case
3f50: 20 30 78 30 37 3a 0a 09 09 09 72 65 74 75 72 6e   0x07:....return
3f60: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3f70: 5f 47 45 4e 45 52 49 43 20 7c 20 43 41 43 4b 45  _GENERIC | CACKE
3f80: 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49 20 7c 20  Y_TLV_APP_SKI | 
3f90: 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50  CACKEY_TLV_APP_P
3fa0: 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72  KI");..}...retur
3fb0: 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b 0a 7d 0a  n("INVALID");.}.
3fc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
3fd0: 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55 47  ar *CACKEY_DEBUG
3fe0: 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f  _FUNC_ATTRIBUTE_
3ff0: 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54 52 49 42  TO_STR(CK_ATTRIB
4000: 55 54 45 5f 54 59 50 45 20 61 74 74 72 29 20 7b  UTE_TYPE attr) {
4010: 0a 09 73 77 69 74 63 68 20 28 61 74 74 72 29 20  ..switch (attr) 
4020: 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 4c 41  {...case CKA_CLA
4030: 53 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  SS:....return("C
4040: 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09 09 63 61  KA_CLASS");...ca
4050: 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09  se CKA_TOKEN:...
4060: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 4f 4b  .return("CKA_TOK
4070: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
4080: 5f 50 52 49 56 41 54 45 3a 0a 09 09 09 72 65 74  _PRIVATE:....ret
4090: 75 72 6e 28 22 43 4b 41 5f 50 52 49 56 41 54 45  urn("CKA_PRIVATE
40a0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4c  ");...case CKA_L
40b0: 41 42 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  ABEL:....return(
40c0: 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b 0a 09 09  "CKA_LABEL");...
40d0: 63 61 73 65 20 43 4b 41 5f 41 50 50 4c 49 43 41  case CKA_APPLICA
40e0: 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28  TION:....return(
40f0: 22 43 4b 41 5f 41 50 50 4c 49 43 41 54 49 4f 4e  "CKA_APPLICATION
4100: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4110: 41 4c 55 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  ALUE:....return(
4120: 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b 0a 09 09  "CKA_VALUE");...
4130: 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45 43 54 5f  case CKA_OBJECT_
4140: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ID:....return("C
4150: 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22 29 3b 0a  KA_OBJECT_ID");.
4160: 09 09 63 61 73 65 20 43 4b 41 5f 43 45 52 54 49  ..case CKA_CERTI
4170: 46 49 43 41 54 45 5f 54 59 50 45 3a 0a 09 09 09  FICATE_TYPE:....
4180: 72 65 74 75 72 6e 28 22 43 4b 41 5f 43 45 52 54  return("CKA_CERT
4190: 49 46 49 43 41 54 45 5f 54 59 50 45 22 29 3b 0a  IFICATE_TYPE");.
41a0: 09 09 63 61 73 65 20 43 4b 41 5f 49 53 53 55 45  ..case CKA_ISSUE
41b0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  R:....return("CK
41c0: 41 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61  A_ISSUER");...ca
41d0: 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  se CKA_SERIAL_NU
41e0: 4d 42 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  MBER:....return(
41f0: 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d 42  "CKA_SERIAL_NUMB
4200: 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ER");...case CKA
4210: 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09 09 09 72  _AC_ISSUER:....r
4220: 65 74 75 72 6e 28 22 43 4b 41 5f 41 43 5f 49 53  eturn("CKA_AC_IS
4230: 53 55 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  SUER");...case C
4240: 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09 72 65 74  KA_OWNER:....ret
4250: 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45 52 22 29  urn("CKA_OWNER")
4260: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 54 54  ;...case CKA_ATT
4270: 52 5f 54 59 50 45 53 3a 0a 09 09 09 72 65 74 75  R_TYPES:....retu
4280: 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f 54 59 50  rn("CKA_ATTR_TYP
4290: 45 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ES");...case CKA
42a0: 5f 54 52 55 53 54 45 44 3a 0a 09 09 09 72 65 74  _TRUSTED:....ret
42b0: 75 72 6e 28 22 43 4b 41 5f 54 52 55 53 54 45 44  urn("CKA_TRUSTED
42c0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4b  ");...case CKA_K
42d0: 45 59 5f 54 59 50 45 3a 0a 09 09 09 72 65 74 75  EY_TYPE:....retu
42e0: 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54 59 50 45  rn("CKA_KEY_TYPE
42f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4300: 55 42 4a 45 43 54 3a 0a 09 09 09 72 65 74 75 72  UBJECT:....retur
4310: 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43 54 22 29  n("CKA_SUBJECT")
4320: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a  ;...case CKA_ID:
4330: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4340: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  ID");...case CKA
4350: 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09 72  _SENSITIVE:....r
4360: 65 74 75 72 6e 28 22 43 4b 41 5f 53 45 4e 53 49  eturn("CKA_SENSI
4370: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
4380: 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09 09 09 72  KA_ENCRYPT:....r
4390: 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e 43 52 59  eturn("CKA_ENCRY
43a0: 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  PT");...case CKA
43b0: 5f 44 45 43 52 59 50 54 3a 0a 09 09 09 72 65 74  _DECRYPT:....ret
43c0: 75 72 6e 28 22 43 4b 41 5f 44 45 43 52 59 50 54  urn("CKA_DECRYPT
43d0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 57  ");...case CKA_W
43e0: 52 41 50 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  RAP:....return("
43f0: 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09 09 63 61  CKA_WRAP");...ca
4400: 73 65 20 43 4b 41 5f 55 4e 57 52 41 50 3a 0a 09  se CKA_UNWRAP:..
4410: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 55 4e  ..return("CKA_UN
4420: 57 52 41 50 22 29 3b 0a 09 09 63 61 73 65 20 43  WRAP");...case C
4430: 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72 65 74 75  KA_SIGN:....retu
4440: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22 29 3b 0a  rn("CKA_SIGN");.
4450: 09 09 63 61 73 65 20 43 4b 41 5f 53 49 47 4e 5f  ..case CKA_SIGN_
4460: 52 45 43 4f 56 45 52 3a 0a 09 09 09 72 65 74 75  RECOVER:....retu
4470: 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f 52 45 43  rn("CKA_SIGN_REC
4480: 4f 56 45 52 22 29 3b 0a 09 09 63 61 73 65 20 43  OVER");...case C
4490: 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09 09 72 65  KA_VERIFY:....re
44a0: 74 75 72 6e 28 22 43 4b 41 5f 56 45 52 49 46 59  turn("CKA_VERIFY
44b0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
44c0: 45 52 49 46 59 5f 52 45 43 4f 56 45 52 3a 0a 09  ERIFY_RECOVER:..
44d0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45  ..return("CKA_VE
44e0: 52 49 46 59 5f 52 45 43 4f 56 45 52 22 29 3b 0a  RIFY_RECOVER");.
44f0: 09 09 63 61 73 65 20 43 4b 41 5f 44 45 52 49 56  ..case CKA_DERIV
4500: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4510: 41 5f 44 45 52 49 56 45 22 29 3b 0a 09 09 63 61  A_DERIVE");...ca
4520: 73 65 20 43 4b 41 5f 53 54 41 52 54 5f 44 41 54  se CKA_START_DAT
4530: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4540: 41 5f 53 54 41 52 54 5f 44 41 54 45 22 29 3b 0a  A_START_DATE");.
4550: 09 09 63 61 73 65 20 43 4b 41 5f 45 4e 44 5f 44  ..case CKA_END_D
4560: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
4570: 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22 29 3b 0a  CKA_END_DATE");.
4580: 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c  ..case CKA_MODUL
4590: 55 53 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  US:....return("C
45a0: 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b 0a 09 09  KA_MODULUS");...
45b0: 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
45c0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
45d0: 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 5f 42 49  ("CKA_MODULUS_BI
45e0: 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  TS");...case CKA
45f0: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4600: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4610: 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e 45 4e 54  _PUBLIC_EXPONENT
4620: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4630: 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54 3a  RIVATE_EXPONENT:
4640: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4650: 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45 4e 54  PRIVATE_EXPONENT
4660: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50  ");...case CKA_P
4670: 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65 74 75 72  RIME_1:....retur
4680: 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 31 22 29  n("CKA_PRIME_1")
4690: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49  ;...case CKA_PRI
46a0: 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75 72 6e 28  ME_2:....return(
46b0: 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22 29 3b 0a  "CKA_PRIME_2");.
46c0: 09 09 63 61 73 65 20 43 4b 41 5f 45 58 50 4f 4e  ..case CKA_EXPON
46d0: 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74 75 72 6e  ENT_1:....return
46e0: 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e 54 5f 31  ("CKA_EXPONENT_1
46f0: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45  ");...case CKA_E
4700: 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09 09 72 65  XPONENT_2:....re
4710: 74 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45  turn("CKA_EXPONE
4720: 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73 65 20 43  NT_2");...case C
4730: 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 3a 0a  KA_COEFFICIENT:.
4740: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43  ...return("CKA_C
4750: 4f 45 46 46 49 43 49 45 4e 54 22 29 3b 0a 09 09  OEFFICIENT");...
4760: 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45 3a 0a  case CKA_PRIME:.
4770: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 50  ...return("CKA_P
4780: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
4790: 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a 09 09 09  KA_SUBPRIME:....
47a0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 50  return("CKA_SUBP
47b0: 52 49 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 43  RIME");...case C
47c0: 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72 65 74 75  KA_BASE:....retu
47d0: 72 6e 28 22 43 4b 41 5f 42 41 53 45 22 29 3b 0a  rn("CKA_BASE");.
47e0: 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d 45  ..case CKA_PRIME
47f0: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4800: 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42 49 54 53  ("CKA_PRIME_BITS
4810: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53  ");...case CKA_S
4820: 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 3a 0a 09  UB_PRIME_BITS:..
4830: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 55  ..return("CKA_SU
4840: 42 5f 50 52 49 4d 45 5f 42 49 54 53 22 29 3b 0a  B_PRIME_BITS");.
4850: 09 09 63 61 73 65 20 43 4b 41 5f 56 41 4c 55 45  ..case CKA_VALUE
4860: 5f 42 49 54 53 3a 0a 09 09 09 72 65 74 75 72 6e  _BITS:....return
4870: 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42 49 54 53  ("CKA_VALUE_BITS
4880: 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56  ");...case CKA_V
4890: 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09 72 65 74  ALUE_LEN:....ret
48a0: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 4c  urn("CKA_VALUE_L
48b0: 45 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  EN");...case CKA
48c0: 5f 45 58 54 52 41 43 54 41 42 4c 45 3a 0a 09 09  _EXTRACTABLE:...
48d0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 54  .return("CKA_EXT
48e0: 52 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  RACTABLE");...ca
48f0: 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a 0a 09 09  se CKA_LOCAL:...
4900: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 4c 4f 43  .return("CKA_LOC
4910: 41 4c 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  AL");...case CKA
4920: 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54 41 42  _NEVER_EXTRACTAB
4930: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  LE:....return("C
4940: 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43 54  KA_NEVER_EXTRACT
4950: 41 42 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 43  ABLE");...case C
4960: 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49 54  KA_ALWAYS_SENSIT
4970: 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  IVE:....return("
4980: 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e 53 49  CKA_ALWAYS_SENSI
4990: 54 49 56 45 22 29 3b 0a 09 09 63 61 73 65 20 43  TIVE");...case C
49a0: 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43 48 41  KA_KEY_GEN_MECHA
49b0: 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28  NISM:....return(
49c0: 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45 43  "CKA_KEY_GEN_MEC
49d0: 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63 61 73 65  HANISM");...case
49e0: 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 3a   CKA_MODIFIABLE:
49f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4a00: 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b 0a 09 09  MODIFIABLE");...
4a10: 63 61 73 65 20 43 4b 41 5f 45 43 44 53 41 5f 50  case CKA_ECDSA_P
4a20: 41 52 41 4d 53 3a 0a 09 09 09 72 65 74 75 72 6e  ARAMS:....return
4a30: 28 22 43 4b 41 5f 45 43 44 53 41 5f 50 41 52 41  ("CKA_ECDSA_PARA
4a40: 4d 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  MS");...case CKA
4a50: 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09 09 72 65  _EC_POINT:....re
4a60: 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f 50 4f 49  turn("CKA_EC_POI
4a70: 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  NT");...case CKA
4a80: 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 3a  _SECONDARY_AUTH:
4a90: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4aa0: 53 45 43 4f 4e 44 41 52 59 5f 41 55 54 48 22 29  SECONDARY_AUTH")
4ab0: 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 55 54  ;...case CKA_AUT
4ac0: 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a 09 09 09  H_PIN_FLAGS:....
4ad0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 55 54 48  return("CKA_AUTH
4ae0: 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b 0a 09 09  _PIN_FLAGS");...
4af0: 63 61 73 65 20 43 4b 41 5f 48 57 5f 46 45 41 54  case CKA_HW_FEAT
4b00: 55 52 45 5f 54 59 50 45 3a 0a 09 09 09 72 65 74  URE_TYPE:....ret
4b10: 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46 45 41 54  urn("CKA_HW_FEAT
4b20: 55 52 45 5f 54 59 50 45 22 29 3b 0a 09 09 63 61  URE_TYPE");...ca
4b30: 73 65 20 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f  se CKA_RESET_ON_
4b40: 49 4e 49 54 3a 0a 09 09 09 72 65 74 75 72 6e 28  INIT:....return(
4b50: 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e 5f 49 4e  "CKA_RESET_ON_IN
4b60: 49 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41  IT");...case CKA
4b70: 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09 09 09 72  _HAS_RESET:....r
4b80: 65 74 75 72 6e 28 22 43 4b 41 5f 48 41 53 5f 52  eturn("CKA_HAS_R
4b90: 45 53 45 54 22 29 3b 0a 09 09 63 61 73 65 20 43  ESET");...case C
4ba0: 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45  KA_VENDOR_DEFINE
4bb0: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  D:....return("CK
4bc0: 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49 4e 45 44  A_VENDOR_DEFINED
4bd0: 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28  ");..}...return(
4be0: 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d 0a 0a 23  "UNKNOWN");.}..#
4bf0: 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c 6f 63 28    define malloc(
4c00: 78 29 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  x) CACKEY_DEBUG_
4c10: 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78 2c 20 5f  FUNC_MALLOC(x, _
4c20: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
4c30: 5f 29 0a 23 20 20 64 65 66 69 6e 65 20 72 65 61  _).#  define rea
4c40: 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41 43 4b 45  lloc(x, y) CACKE
4c50: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 52 45 41  Y_DEBUG_FUNC_REA
4c60: 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f 66 75 6e  LLOC(x, y, __fun
4c70: 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23  c__, __LINE__).#
4c80: 20 20 69 66 64 65 66 20 73 74 72 64 75 70 0a 23    ifdef strdup.#
4c90: 20 20 20 20 75 6e 64 65 66 20 73 74 72 64 75 70      undef strdup
4ca0: 0a 23 20 20 65 6e 64 69 66 0a 23 20 20 64 65 66  .#  endif.#  def
4cb0: 69 6e 65 20 73 74 72 64 75 70 28 78 29 20 43 41  ine strdup(x) CA
4cc0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4cd0: 53 54 52 44 55 50 28 78 2c 20 5f 5f 66 75 6e 63  STRDUP(x, __func
4ce0: 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65  __, __LINE__).#e
4cf0: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 43 41  lse.#  define CA
4d00: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
4d10: 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a 23 20 20  F(x...) /**/.#  
4d20: 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45  define CACKEY_DE
4d30: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 66 2c 20  BUG_PRINTBUF(f, 
4d40: 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20 20 64 65  x, y) /**/.#  de
4d50: 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55  fine CACKEY_DEBU
4d60: 47 5f 50 45 52 52 4f 52 28 78 29 20 2f 2a 2a 2f  G_PERROR(x) /**/
4d70: 0a 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45  .#  define CACKE
4d80: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
4d90: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4da0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4db0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4dc0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
4dd0: 5f 54 4f 5f 53 54 52 28 78 29 20 22 44 45 42 55  _TO_STR(x) "DEBU
4de0: 47 5f 44 49 53 41 42 4c 45 44 22 0a 23 20 20 64  G_DISABLED".#  d
4df0: 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44 45 42  efine CACKEY_DEB
4e00: 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f  UG_FUNC_OBJID_TO
4e10: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e20: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e30: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e40: 46 55 4e 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f  FUNC_APPTYPE_TO_
4e50: 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44 49  STR(x) "DEBUG_DI
4e60: 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e  SABLED".#  defin
4e70: 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  e CACKEY_DEBUG_F
4e80: 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
4e90: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4ea0: 49 53 41 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a  ISABLED".#endif.
4eb0: 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
4ec0: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  csc_identity {..
4ed0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 70  unsigned char ap
4ee0: 70 6c 65 74 5b 37 5d 3b 0a 09 75 69 6e 74 31 36  plet[7];..uint16
4ef0: 5f 74 20 66 69 6c 65 3b 0a 0a 09 73 69 7a 65 5f  _t file;...size_
4f00: 74 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  t certificate_le
4f10: 6e 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  n;..unsigned cha
4f20: 72 20 2a 63 65 72 74 69 66 69 63 61 74 65 3b 0a  r *certificate;.
4f30: 0a 09 73 73 69 7a 65 5f 74 20 6b 65 79 73 69 7a  ..ssize_t keysiz
4f40: 65 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61  e;.};..struct ca
4f50: 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a  ckey_identity {.
4f60: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  .struct cackey_p
4f70: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63  csc_identity *pc
4f80: 73 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43  sc_identity;...C
4f90: 4b 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74  K_ATTRIBUTE *att
4fa0: 72 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f  ributes;..CK_ULO
4fb0: 4e 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f  NG attributes_co
4fc0: 75 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  unt;.};..struct 
4fd0: 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b  cackey_session {
4fe0: 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09  ..int active;...
4ff0: 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
5000: 44 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74  D;...CK_STATE st
5010: 61 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66  ate;..CK_FLAGS f
5020: 6c 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20  lags;..CK_ULONG 
5030: 75 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09  ulDeviceError;..
5040: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70  CK_VOID_PTR pApp
5050: 6c 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f  lication;..CK_NO
5060: 54 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73  TIFY Notify;...s
5070: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
5080: 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
5090: 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  s;..unsigned lon
50a0: 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  g identities_cou
50b0: 6e 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68  nt;...int search
50c0: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54  _active;..CK_ATT
50d0: 52 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63  RIBUTE_PTR searc
50e0: 68 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f  h_query;..CK_ULO
50f0: 4e 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f  NG search_query_
5100: 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64  count;..unsigned
5110: 20 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72   long search_cur
5120: 72 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e  r_id;...int sign
5130: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
5140: 48 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e  HANISM_TYPE sign
5150: 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f  _mechanism;..CK_
5160: 42 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75  BYTE_PTR sign_bu
5170: 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  f;..unsigned lon
5180: 67 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09  g sign_buflen;..
5190: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69  unsigned long si
51a0: 67 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72  gn_bufused;..str
51b0: 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
51c0: 69 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69  ity *sign_identi
51d0: 74 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70  ty;...int decryp
51e0: 74 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45  t_active;..CK_ME
51f0: 43 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63  CHANISM_TYPE dec
5200: 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a  rypt_mechanism;.
5210: 09 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63  .CK_VOID_PTR dec
5220: 72 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a  rypt_mech_parm;.
5230: 09 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70  .CK_ULONG decryp
5240: 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a  t_mech_parmlen;.
5250: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
5260: 64 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74  dentity *decrypt
5270: 5f 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73  _identity;.};..s
5280: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
5290: 74 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b  t {..int active;
52a0: 0a 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a  ..int internal;.
52b0: 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61  ..char *pcsc_rea
52c0: 64 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f  der;...int pcsc_
52d0: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a  card_connected;.
52e0: 09 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73  .SCARDHANDLE pcs
52f0: 63 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72  c_card;...int tr
5300: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b  ansaction_depth;
5310: 0a 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ..int transactio
5320: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a  n_need_hw_lock;.
5330: 0a 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74  ..int slot_reset
5340: 3b 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b  ;...CK_FLAGS tok
5350: 65 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69  en_flags;...unsi
5360: 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
5370: 3b 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  ;...DWORD protoc
5380: 6f 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69  ol;...unsigned i
5390: 6e 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f  nt cached_certs_
53a0: 63 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63  count;..struct c
53b0: 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74  ackey_pcsc_ident
53c0: 69 74 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74  ity *cached_cert
53d0: 73 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65  s;.};..typedef e
53e0: 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c  num {..CACKEY_TL
53f0: 56 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20  V_APP_GENERIC = 
5400: 30 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x01,..CACKEY_TL
5410: 56 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20  V_APP_SKI     = 
5420: 30 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0x02,..CACKEY_TL
5430: 56 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20  V_APP_PKI     = 
5440: 30 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c  0x04.} cackey_tl
5450: 76 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65  v_apptype;..type
5460: 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b  def enum {..CACK
5470: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e  EY_TLV_OBJID_GEN
5480: 45 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d  ERALINFO       =
5490: 20 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59   0x2000,..CACKEY
54a0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45  _TLV_OBJID_PROPE
54b0: 52 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30  RSONALINFO   = 0
54c0: 78 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54  x2100,..CACKEY_T
54d0: 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43  LV_OBJID_ACCESSC
54e0: 4f 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33  ONTROL     = 0x3
54f0: 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  000,..CACKEY_TLV
5500: 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20  _OBJID_LOGIN    
5510: 20 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30           = 0x400
5520: 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f  0,..CACKEY_TLV_O
5530: 42 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20  BJID_CARDINFO   
5540: 20 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c         = 0x5000,
5550: 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ..CACKEY_TLV_OBJ
5560: 49 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20  ID_BIOMETRICS   
5570: 20 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09       = 0x6000,..
5580: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
5590: 5f 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20  _DIGITALSIGCERT 
55a0: 20 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41     = 0x7000,..CA
55b0: 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43  CKEY_TLV_OBJID_C
55c0: 41 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20  AC_PERSON       
55d0: 20 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b   = 0x0200,..CACK
55e0: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43  EY_TLV_OBJID_CAC
55f0: 5f 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d  _BENEFITS      =
5600: 20 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59   0x0202,..CACKEY
5610: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f  _TLV_OBJID_CAC_O
5620: 54 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30  THERBENEFITS = 0
5630: 78 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54  x0203,..CACKEY_T
5640: 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52  LV_OBJID_CAC_PER
5650: 53 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30  SONNEL     = 0x0
5660: 32 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  201,..CACKEY_TLV
5670: 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45  _OBJID_CAC_PKICE
5680: 52 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46  RT       = 0x02F
5690: 45 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f  E.} cackey_tlv_o
56a0: 62 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65  bjectid;..typede
56b0: 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59  f enum {..CACKEY
56c0: 5f 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45  _PCSC_S_TOKENPRE
56d0: 53 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41  SENT    = 1,..CA
56e0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c              = 0,
5700: 0a 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  ..CACKEY_PCSC_E_
5710: 47 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20  GENERIC         
5720: 3d 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43  = -1,..CACKEY_PC
5730: 53 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20  SC_E_BADPIN     
5740: 20 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b       = -2,..CACK
5750: 45 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44  EY_PCSC_E_LOCKED
5760: 20 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a            = -3,.
5770: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e  .CACKEY_PCSC_E_N
5780: 45 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d  EEDLOGIN       =
5790: 20 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -4,..CACKEY_PCS
57a0: 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20  C_E_TOKENABSENT 
57b0: 20 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45      = -6,..CACKE
57c0: 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20  Y_PCSC_E_RETRY  
57d0: 20 20 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20           = -7.} 
57e0: 63 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72  cackey_ret;..str
57f0: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63  uct cackey_tlv_c
5800: 61 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e  ardurl {..unsign
5810: 65 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72  ed char        r
5820: 69 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74  id[5];..cackey_t
5830: 6c 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70  lv_apptype   app
5840: 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  type;..cackey_tl
5850: 76 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65  v_objectid  obje
5860: 63 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  ctid;..cackey_tl
5870: 76 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69  v_objectid  appi
5880: 64 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  d;..unsigned cha
5890: 72 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a  r        pinid;.
58a0: 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65  };..struct cacke
58b0: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74  y_tlv_entity;.st
58c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
58d0: 65 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f  entity {..uint8_
58e0: 74 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c  t tag;..size_t l
58f0: 65 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b  ength;...union {
5900: 0a 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a  ...void *value;.
5910: 09 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
5920: 74 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c  tlv_cardurl *val
5930: 75 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69  ue_cardurl;...ui
5940: 6e 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65  nt8_t value_byte
5950: 3b 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63  ;..};...struct c
5960: 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79  ackey_tlv_entity
5970: 20 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20   *_next;.};../* 
5980: 43 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61  CACKEY Global Ha
5990: 6e 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  ndles */.static 
59a0: 76 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67  void *cackey_big
59b0: 6c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  lock = NULL;.sta
59c0: 74 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65  tic struct cacke
59d0: 79 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79  y_session cackey
59e0: 5f 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a  _sessions[128];.
59f0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
5a00: 63 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79  ckey_slot cackey
5a10: 5f 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61  _slots[128];.sta
5a20: 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69  tic int cackey_i
5a30: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
5a40: 73 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65  static int cacke
5a50: 79 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d  y_biglock_init =
5a60: 20 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c   0;.CK_C_INITIAL
5a70: 49 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f  IZE_ARGS cackey_
5a80: 61 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61  args;../** Extra
5a90: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f   certificates to
5aa0: 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65   include in toke
5ab0: 6e 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63  n **/.struct cac
5ac0: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
5ad0: 79 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20  y extra_certs[] 
5ae0: 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61  = {.#include "ca
5af0: 63 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72  ckey_builtin_cer
5b00: 74 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53  ts.h".};../* PCS
5b10: 43 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73  C Global Handles
5b20: 20 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41   */.static LPSCA
5b30: 52 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79  RDCONTEXT cackey
5b40: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
5b50: 55 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73  ULL;..static uns
5b60: 69 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65  igned long cacke
5b70: 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69  y_getversion(voi
5b80: 64 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73  d) {..static uns
5b90: 69 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61  igned long retva
5ba0: 6c 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e  l = 255;..unsign
5bb0: 65 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20  ed long major = 
5bc0: 30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  0;..unsigned lon
5bd0: 67 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68  g minor = 0;..ch
5be0: 61 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20  ar *major_str = 
5bf0: 4e 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e  NULL;..char *min
5c00: 6f 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a  or_str = NULL;..
5c10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
5c20: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
5c30: 0a 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d  ...if (retval !=
5c40: 20 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59   255) {...CACKEY
5c50: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
5c60: 65 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28  eturning 0x%lx (
5c70: 63 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61  cached).", retva
5c80: 6c 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65  l);....return(re
5c90: 74 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76  tval);..}...retv
5ca0: 61 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20  al = 0;..#ifdef 
5cb0: 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a  PACKAGE_VERSION.
5cc0: 20 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74          major_st
5cd0: 72 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53  r = PACKAGE_VERS
5ce0: 49 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f  ION;..if (major_
5cf0: 73 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20  str) {..        
5d00: 6d 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28  major = strtoul(
5d10: 6d 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f  major_str, &mino
5d20: 72 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69  r_str, 10);....i
5d30: 66 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a  f (minor_str) {.
5d40: 09 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f  ...minor = strto
5d50: 75 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31  ul(minor_str + 1
5d60: 2c 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d  , NULL, 10);...}
5d70: 0a 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28  ..}...retval = (
5d80: 6d 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28  major << 16) | (
5d90: 6d 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e  minor << 8);.#en
5da0: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
5db0: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
5dc0: 6e 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74  ning 0x%lx", ret
5dd0: 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72  val);...return(r
5de0: 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43  etval);.}../* PC
5df0: 2f 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63  /SC Related Func
5e00: 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53  tions */./*. * S
5e10: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76  YNPOSIS. *     v
5e20: 6f 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  oid cackey_slots
5e30: 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28  _disconnect_all(
5e40: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
5e50: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
5e60: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
5e70: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e  VALUE. *     Non
5e80: 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  e. *. * NOTES. *
5e90: 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69       This functi
5ea0: 6f 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66  on disconnects f
5eb0: 72 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20  rom all cards.. 
5ec0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  *. */.static voi
5ed0: 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  d cackey_slots_d
5ee0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f  isconnect_all(vo
5ef0: 69 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20  id) {..uint32_t 
5f00: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
5f10: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
5f20: 65 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64  ed.");...for (id
5f30: 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
5f40: 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
5f50: 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
5f60: 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69  ey_slots[0])); i
5f70: 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61  dx++) {...if (ca
5f80: 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
5f90: 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f  internal) {..../
5fa0: 2a 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20  * Skip internal 
5fb0: 73 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74  slots */....cont
5fc0: 69 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  inue;...}....if 
5fd0: 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
5fe0: 78 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  x].pcsc_card_con
5ff0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43  nected) {....CAC
6000: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6010: 28 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63  ("SCardDisconnec
6020: 74 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20  t(%lu) called", 
6030: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
6040: 69 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44  idx);.....SCardD
6050: 69 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79  isconnect(cackey
6060: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63  _slots[idx].pcsc
6070: 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41  _card, SCARD_LEA
6080: 56 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09  VE_CARD);...}...
6090: 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
60a0: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a  s[idx].label) {.
60b0: 09 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73  ...free(cackey_s
60c0: 6c 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29  lots[idx].label)
60d0: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
60e0: 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
60f0: 4e 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63  NULL;...}....cac
6100: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70  key_slots[idx].p
6110: 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74  csc_card_connect
6120: 65 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79  ed = 0;...cackey
6130: 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e  _slots[idx].tran
6140: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20  saction_depth = 
6150: 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  0;...cackey_slot
6160: 73 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69  s[idx].transacti
6170: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
6180: 3d 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b  = 0;....if (cack
6190: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63  ey_slots[idx].ac
61a0: 74 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45  tive) {....CACKE
61b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
61c0: 4d 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73  Marking active s
61d0: 6c 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67  lot %lu as being
61e0: 20 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e   reset", (unsign
61f0: 65 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09  ed long) idx);..
6200: 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  .}....cackey_slo
6210: 74 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73  ts[idx].slot_res
6220: 65 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43  et = 1;..}...CAC
6230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6240: 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a  ("Returning");..
6250: 09 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20  .return;.}../*. 
6260: 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
6270: 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63    cackey_ret cac
6280: 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
6290: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
62a0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
62b0: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
62c0: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
62d0: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
62e0: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
62f0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
6300: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
6310: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
6320: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
6330: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e  is function conn
6340: 65 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53  ects to the PC/S
6350: 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e  C Connection Man
6360: 61 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73  ager and updates
6370: 20 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62   the. *     glob
6380: 61 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a  al handle.. *. *
6390: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
63a0: 72 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  ret cackey_pcsc_
63b0: 63 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a  connect(void) {.
63c0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f  .LONG scard_est_
63d0: 63 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66  context_ret;.#if
63e0: 64 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53  def HAVE_SCARDIS
63f0: 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f  VALIDCONTEXT..LO
6400: 4e 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64  NG scard_isvalid
6410: 5f 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43  _ret;.#endif...C
6420: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
6430: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
6440: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6450: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
6460: 20 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63   {...cackey_pcsc
6470: 5f 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63  _handle = malloc
6480: 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f  (sizeof(*cackey_
6490: 70 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09  pcsc_handle));..
64a0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
64b0: 5f 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29  _handle == NULL)
64c0: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
64d0: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20  UG_PRINTF("Call 
64e0: 74 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  to malloc() fail
64f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
6500: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09   failure");.....
6510: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73  cackey_slots_dis
6520: 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a  connect_all();..
6530: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
6540: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
6550: 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f  ;...}....CACKEY_
6560: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
6570: 61 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74  ardEstablishCont
6580: 65 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a  ext() called");.
6590: 09 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74  ..scard_est_cont
65a0: 65 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45  ext_ret = SCardE
65b0: 73 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28  stablishContext(
65c0: 53 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54  SCARD_SCOPE_SYST
65d0: 45 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  EM, NULL, NULL, 
65e0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
65f0: 6c 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64  le);...if (scard
6600: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6610: 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43   != SCARD_S_SUCC
6620: 45 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ESS) {....CACKEY
6630: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
6640: 61 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61  all to SCardEsta
6650: 62 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69  blishContext fai
6660: 6c 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73  led (returned %s
6670: 2f 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67  /%li), returning
6680: 20 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41   in failure", CA
6690: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
66a0: 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
66b0: 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78  scard_est_contex
66c0: 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73  t_ret), (long) s
66d0: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
66e0: 5f 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28  _ret);.....free(
66f0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6700: 6c 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70  le);....cackey_p
6710: 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c  csc_handle = NUL
6720: 4c 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c  L;.....cackey_sl
6730: 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61  ots_disconnect_a
6740: 6c 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  ll();.....return
6750: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
6760: 45 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a  ENERIC);...}..}.
6770: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41  .#ifdef HAVE_SCA
6780: 52 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54  RDISVALIDCONTEXT
6790: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
67a0: 52 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61  RINTF("SCardIsVa
67b0: 6c 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c  lidContext() cal
67c0: 6c 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73  led");..scard_is
67d0: 76 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72  valid_ret = SCar
67e0: 64 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28  dIsValidContext(
67f0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
6800: 64 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64  dle);..if (scard
6810: 5f 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20  _isvalid_ret != 
6820: 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
6830: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
6840: 47 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65  G_PRINTF("Handle
6850: 20 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61   has become inva
6860: 6c 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69  lid (SCardIsVali
6870: 64 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c  dContext = %s/%l
6880: 69 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65  i), trying to re
6890: 2d 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20  -establish...", 
68a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
68b0: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
68c0: 52 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  R(scard_isvalid_
68d0: 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61  ret), (long) sca
68e0: 72 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b  rd_isvalid_ret);
68f0: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6900: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73  _PRINTF("SCardEs
6910: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29  tablishContext()
6920: 20 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61   called");...sca
6930: 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72  rd_est_context_r
6940: 65 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c  et = SCardEstabl
6950: 69 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44  ishContext(SCARD
6960: 5f 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e  _SCOPE_SYSTEM, N
6970: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65  ULL, NULL, cacke
6980: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6990: 09 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f  ..if (scard_est_
69a0: 63 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53  context_ret != S
69b0: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
69c0: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
69d0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
69e0: 6f 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68  o SCardEstablish
69f0: 43 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28  Context failed (
6a00: 72 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29  returned %s/%li)
6a10: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
6a20: 61 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f  ailure", CACKEY_
6a30: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
6a40: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
6a50: 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74  _est_context_ret
6a60: 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f  ), (long) scard_
6a70: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6a80: 3b 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65  ;.....free(cacke
6a90: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a  y_pcsc_handle);.
6aa0: 09 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  ...cackey_pcsc_h
6ab0: 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  andle = NULL;...
6ac0: 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64  ..cackey_slots_d
6ad0: 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b  isconnect_all();
6ae0: 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
6af0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
6b00: 43 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  C);...}....CACKE
6b10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
6b20: 48 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20  Handle has been 
6b30: 72 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29  re-established")
6b40: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ;..}.#endif...CA
6b50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6b60: 46 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63  F("Sucessfully c
6b70: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53  onnected to PC/S
6b80: 43 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  C, returning in 
6b90: 73 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74  success");...ret
6ba0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6bb0: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
6bc0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
6bd0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
6be0: 79 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63  y_pcsc_disconnec
6bf0: 74 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41  t(void);. *. * A
6c00: 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20  RGUMENTS. *     
6c10: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52  None. *. * RETUR
6c20: 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43  N VALUE. *     C
6c30: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20  ACKEY_PCSC_S_OK 
6c40: 20 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65          On succe
6c50: 73 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  ss. *     CACKEY
6c60: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20  _PCSC_E_GENERIC 
6c70: 20 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20     On error. *. 
6c80: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54  * NOTES. *     T
6c90: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73  his function dis
6ca0: 63 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68  connects from th
6cb0: 65 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69  e PC/SC Connecti
6cc0: 6f 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75  on manager and u
6cd0: 70 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68  pdates. *     th
6ce0: 65 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e  e global handle.
6cf0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
6d00: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
6d10: 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
6d20: 28 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73  (void) {..LONG s
6d30: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
6d40: 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  _ret;...CACKEY_D
6d50: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
6d60: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61  led.");...if (ca
6d70: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
6d80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
6d90: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
6da0: 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61  _S_OK);..}...sca
6db0: 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72  rd_rel_context_r
6dc0: 65 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73  et = SCardReleas
6dd0: 65 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79  eContext(*cackey
6de0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a  _pcsc_handle);..
6df0: 09 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63  .if (cackey_pcsc
6e00: 5f 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65  _handle) {...fre
6e10: 65 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  e(cackey_pcsc_ha
6e20: 6e 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65  ndle);.....cacke
6e30: 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20  y_pcsc_handle = 
6e40: 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  NULL;..}...if (s
6e50: 63 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74  card_rel_context
6e60: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
6e70: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74  SUCCESS) {...ret
6e80: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6e90: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
6ea0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
6eb0: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
6ec0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
6ed0: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
6ee0: 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28  mark_slot_reset(
6ef0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
6f00: 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a  ot *slot);. *. *
6f10: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
6f20: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54    None. *. * RET
6f30: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
6f40: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45   None. *. * NOTE
6f50: 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75  S. *     This fu
6f60: 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73  nction marks a s
6f70: 6c 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20 62  lot has having b
6f80: 65 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61  een reset, to la
6f90: 74 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75  ter be cleaned u
6fa0: 70 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75  p.. *     Cleanu
6fb0: 70 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  p only happens w
6fc0: 68 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c  hen a PKCS#11 cl
6fd0: 69 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e  ient calls C_Fin
6fe0: 64 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a  dObjectsInit.. *
6ff0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
7000: 20 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f   cackey_mark_slo
7010: 74 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63  t_reset(struct c
7020: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7030: 29 20 7b 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d  ) {..if (slot ==
7040: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
7050: 6e 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  n;..}...CACKEY_D
7060: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
7070: 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c  led.");...if (sl
7080: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f  ot->pcsc_card_co
7090: 6e 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43 61  nnected) {...SCa
70a0: 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f  rdDisconnect(slo
70b0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
70c0: 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b  ARD_LEAVE_CARD);
70d0: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74  ..}...slot->slot
70e0: 5f 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c 6f  _reset = 1;..slo
70f0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
7100: 6e 65 63 74 65 64 20 3d 20 30 3b 0a 09 73 6c 6f  nected = 0;..slo
7110: 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  t->token_flags =
7120: 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49   CKF_LOGIN_REQUI
7130: 52 45 44 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  RED;...CACKEY_DE
7140: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
7150: 72 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75  rning.");...retu
7160: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  rn;.}../*. * SYN
7170: 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e  POSIS. *     LON
7180: 47 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65  G cackey_reconne
7190: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
71a0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
71b0: 2c 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f  , DWORD default_
71c0: 70 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52  protocol, LPDWOR
71d0: 44 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  D selected_proto
71e0: 63 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  col);. *. * ARGU
71f0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63  MENTS. *     cac
7200: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
7210: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
7220: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
7230: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44 57 4f  to. *. *     DWO
7240: 52 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f  RD default_proto
7250: 63 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 50  col. *         P
7260: 72 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74 65 6d  rotocol to attem
7270: 70 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a 20 20  pt first. *. *  
7280: 20 20 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63     LPDWORD selec
7290: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20  ted_protocol. * 
72a0: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 72          [OUT] Pr
72b0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 0a  otocol selected.
72c0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
72d0: 55 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65  UE. *     The re
72e0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
72f0: 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29  SCardReconnect()
7300: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
7310: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
7320: 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
7330: 72 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e  round SCardRecon
7340: 6e 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20  nect(). *. *    
7350: 20 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e   The SCardReconn
7360: 65 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63  ect() function c
7370: 61 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  all will be call
7380: 65 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68  ed first with th
7390: 65 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65  e. *     dwPrefe
73a0: 72 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66  rredProtocols of
73b0: 20 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63   "default_protoc
73c0: 6f 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61  ol".  If that ca
73d0: 6c 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20  ll returns. *   
73e0: 20 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f    SCARD_E_PROTO_
73f0: 4d 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61  MISMATCH try aga
7400: 69 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63  in with a protoc
7410: 6f 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66  ol of T=0, and f
7420: 61 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68  ailing. *     th
7430: 61 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73  at T=1.. *. */.s
7440: 74 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65  tatic LONG cacke
7450: 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64  y_reconnect_card
7460: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
7470: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44  lot *slot, DWORD
7480: 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f   default_protoco
7490: 6c 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63  l, LPDWORD selec
74a0: 74 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a  ted_protocol) {.
74b0: 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e  .LONG scard_conn
74c0: 5f 72 65 74 3b 0a 0a 09 73 63 61 72 64 5f 63 6f  _ret;...scard_co
74d0: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
74e0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
74f0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
7500: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 64 65 66  HARE_SHARED, def
7510: 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53  ault_protocol, S
7520: 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c  CARD_RESET_CARD,
7530: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63   selected_protoc
7540: 6f 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64  ol);...if (scard
7550: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7560: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7570: 54 43 48 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  TCH) {...CACKEY_
7580: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7590: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72  ardReconnect() r
75a0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
75b0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
75c0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
75d0: 20 54 3d 30 22 29 0a 09 09 73 63 61 72 64 5f 63   T=0")...scard_c
75e0: 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52  onn_ret = SCardR
75f0: 65 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  econnect(slot->p
7600: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
7610: 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43  SHARE_SHARED, SC
7620: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c  ARD_PROTOCOL_T0,
7630: 20 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52   SCARD_RESET_CAR
7640: 44 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74  D, selected_prot
7650: 6f 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63  ocol);....if (sc
7660: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
7670: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7680: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43  SMATCH) {....CAC
7690: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
76a0: 28 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74  ("SCardReconnect
76b0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
76c0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
76d0: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
76e0: 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 73 63  just T=1")....sc
76f0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7700: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c  CardReconnect(sl
7710: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
7720: 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45  CARD_SHARE_SHARE
7730: 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f  D, SCARD_PROTOCO
7740: 4c 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45  L_T1, SCARD_RESE
7750: 54 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64  T_CARD, selected
7760: 5f 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a  _protocol);...}.
7770: 09 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72  .}...return(scar
7780: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a  d_conn_ret);.}..
7790: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
77a0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
77b0: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
77c0: 63 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b  card(struct cack
77d0: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a  ey_slot *slot);.
77e0: 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a   *. * ARGUMENTS.
77f0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c   *     cackey_sl
7800: 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20  ot *slot. *     
7810: 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64      Slot to send
7820: 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a   commands to. *.
7830: 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a   * RETURN VALUE.
7840: 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43   *     CACKEY_PC
7850: 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20  SC_S_OK         
7860: 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20  On success. *   
7870: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f    CACKEY_PCSC_E_
7880: 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72  GENERIC    On er
7890: 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  ror. *. * NOTES.
78a0: 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20   *     None. *. 
78b0: 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79  */.static cackey
78c0: 5f 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  _ret cackey_conn
78d0: 65 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20  ect_card(struct 
78e0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
78f0: 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74  t) {..cackey_ret
7900: 20 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65   pcsc_connect_re
7910: 74 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63  t;..DWORD protoc
7920: 6f 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  ol;..LONG scard_
7930: 63 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  conn_ret;...CACK
7940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7950: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
7960: 20 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43   (!slot) {...CAC
7970: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
7980: 28 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73  ("Invalid slot s
7990: 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e  pecified, return
79a0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
79b0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
79c0: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
79d0: 43 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f  C);..}...pcsc_co
79e0: 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
79f0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
7a00: 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
7a10: 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
7a20: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
7a30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
7a40: 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
7a50: 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
7a60: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
7a70: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65  failure");....re
7a80: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
7a90: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
7aa0: 0a 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20  ../* Connect to 
7ab0: 72 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65  reader, if neede
7ac0: 64 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d  d */..if (!slot-
7ad0: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
7ae0: 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  cted) {...CACKEY
7af0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
7b00: 43 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20  CardConnect(%s) 
7b10: 63 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70  called", slot->p
7b20: 63 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73  csc_reader);...s
7b30: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20  card_conn_ret = 
7b40: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61  SCardConnect(*ca
7b50: 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65  ckey_pcsc_handle
7b60: 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61  , slot->pcsc_rea
7b70: 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45  der, SCARD_SHARE
7b80: 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50  _SHARED, SCARD_P
7b90: 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41  ROTOCOL_T0 | SCA
7ba0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20  RD_PROTOCOL_T1, 
7bb0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7bc0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7bd0: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
7be0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
7bf0: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
7c00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
7c10: 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f  _PRINTF("SCardCo
7c20: 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64  nnect() returned
7c30: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7c40: 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20  ISMATCH, trying 
7c50: 77 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a  with just T=0").
7c60: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
7c70: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
7c80: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
7c90: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
7ca0: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
7cb0: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7cc0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7cd0: 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64  &slot->pcsc_card
7ce0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09  , &protocol);...
7cf0: 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e  ..if (scard_conn
7d00: 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
7d10: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20  PROTO_MISMATCH) 
7d20: 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
7d30: 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64  UG_PRINTF("SCard
7d40: 43 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e  Connect() return
7d50: 65 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f  ed SCARD_E_PROTO
7d60: 5f 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e  _MISMATCH, tryin
7d70: 67 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22  g with just T=1"
7d80: 29 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e  ).....scard_conn
7d90: 5f 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e  _ret = SCardConn
7da0: 65 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63  ect(*cackey_pcsc
7db0: 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70  _handle, slot->p
7dc0: 63 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52  csc_reader, SCAR
7dd0: 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20  D_SHARE_SHARED, 
7de0: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
7df0: 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63  1, &slot->pcsc_c
7e00: 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b  ard, &protocol);
7e10: 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
7e20: 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  (scard_conn_ret 
7e30: 3d 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57  == SCARD_W_UNPOW
7e40: 45 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09  ERED_CARD) {....
7e50: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
7e60: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
7e70: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
7e80: 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43  RD_W_UNPOWERED_C
7e90: 41 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72  ARD, trying to r
7ea0: 65 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a  e-connect...");.
7eb0: 0a 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  ....scard_conn_r
7ec0: 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63  et = SCardConnec
7ed0: 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68  t(*cackey_pcsc_h
7ee0: 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73  andle, slot->pcs
7ef0: 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f  c_reader, SCARD_
7f00: 53 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43  SHARE_DIRECT, SC
7f10: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20  ARD_PROTOCOL_T0 
7f20: 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  | SCARD_PROTOCOL
7f30: 5f 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63  _T1, &slot->pcsc
7f40: 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c  _card, &protocol
7f50: 29 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64  );.....if (scard
7f60: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41  _conn_ret == SCA
7f70: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
7f80: 54 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  TCH) {.....CACKE
7f90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7fa0: 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72  SCardConnect() r
7fb0: 65 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f  eturned SCARD_E_
7fc0: 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20  PROTO_MISMATCH, 
7fd0: 74 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74  trying with just
7fe0: 20 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64   T=0").....scard
7ff0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72  _conn_ret = SCar
8000: 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79  dConnect(*cackey
8010: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c  _pcsc_handle, sl
8020: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c  ot->pcsc_reader,
8030: 20 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41   SCARD_SHARE_SHA
8040: 52 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f  RED, SCARD_PROTO
8050: 43 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70  COL_T0, &slot->p
8060: 63 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f  csc_card, &proto
8070: 63 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73  col);......if (s
8080: 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d  card_conn_ret ==
8090: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
80a0: 49 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09  ISMATCH) {......
80b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
80c0: 4e 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63  NTF("SCardConnec
80d0: 74 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41  t() returned SCA
80e0: 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41  RD_E_PROTO_MISMA
80f0: 54 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68  TCH, trying with
8100: 20 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09   just T=1").....
8110: 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20  .scard_conn_ret 
8120: 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a  = SCardConnect(*
8130: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
8140: 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72  le, slot->pcsc_r
8150: 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41  eader, SCARD_SHA
8160: 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44  RE_SHARED, SCARD
8170: 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73  _PROTOCOL_T1, &s
8180: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20  lot->pcsc_card, 
8190: 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09  &protocol);.....
81a0: 7d 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64  }....}.....scard
81b0: 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b  _conn_ret = cack
81c0: 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72  ey_reconnect_car
81d0: 64 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c  d(slot, protocol
81e0: 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09  , &protocol);...
81f0: 7d 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63  }....if (scard_c
8200: 6f 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44  onn_ret != SCARD
8210: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
8220: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
8230: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
8240: 20 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c   to card failed,
8250: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
8260: 69 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e  ilure (SCardConn
8270: 65 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22  ect() = %s/%li)"
8280: 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
8290: 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
82a0: 53 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  STR(scard_conn_r
82b0: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
82c0: 64 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09  d_conn_ret);....
82d0: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
82e0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
82f0: 09 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73  ..}....slot->pcs
8300: 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64  c_card_connected
8310: 20 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72   = 1;...slot->tr
8320: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
8330: 3d 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 0;...slot->tra
8340: 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
8350: 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f  _lock = 0;...slo
8360: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
8370: 6f 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74  otocol;..}...ret
8380: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
8390: 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20  S_OK);.}../*. * 
83a0: 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20  SYNPOSIS. *     
83b0: 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65  cackey_ret cacke
83c0: 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74  y_begin_transact
83d0: 69 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65  ion(struct cacke
83e0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
83f0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
8400: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
8410: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
8420: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
8430: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
8440: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
8450: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
8460: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
8470: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
8480: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
8490: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
84a0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
84b0: 2a 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61  *     The transa
84c0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20  ction should be 
84d0: 74 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67  terminated using
84e0: 20 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61   "cackey_end_tra
84f0: 6e 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f  nsaction". *. */
8500: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
8510: 65 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  et cackey_begin_
8520: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75  transaction(stru
8530: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
8540: 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f  slot) {..cackey_
8550: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f  ret cackey_conn_
8560: 72 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64  ret;..LONG scard
8570: 5f 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41  _trans_ret;...CA
8580: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
8590: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
85a0: 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20  cackey_conn_ret 
85b0: 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74  = cackey_connect
85c0: 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66  _card(slot);..if
85d0: 20 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65   (cackey_conn_re
85e0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
85f0: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
8600: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8610: 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63  Unable to connec
8620: 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72  t to card, retur
8630: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8640: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8650: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8660: 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72  );..}...slot->tr
8670: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b  ansaction_depth+
8680: 2b 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74  +;...if (slot->t
8690: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
86a0: 20 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74   > 1 && !slot->t
86b0: 72 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f  ransaction_need_
86c0: 68 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43  hw_lock) {...CAC
86d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
86e0: 28 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74  ("Already in a t
86f0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66  ransaction, perf
8700: 6f 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e  orming no action
8710: 20 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69   (new depth = %i
8720: 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  )", slot->transa
8730: 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09  ction_depth);...
8740: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8750: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  CSC_S_OK);..}...
8760: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
8770: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
8780: 20 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e   0;...scard_tran
8790: 73 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67  s_ret = SCardBeg
87a0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c  inTransaction(sl
87b0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a  ot->pcsc_card);.
87c0: 09 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73  .if (scard_trans
87d0: 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f  _ret != SCARD_S_
87e0: 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43  SUCCESS) {...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 62 65 67 69  ("Unable to begi
8810: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72  n transaction, r
8820: 65 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f  eturning in erro
8830: 72 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  r");....return(C
8840: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
8850: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
8860: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8870: 22 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67  "Sucessfully beg
8880: 61 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  an transaction o
8890: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c  n slot (%s)", sl
88a0: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
88b0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
88c0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
88d0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
88e0: 20 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65   *     cackey_re
88f0: 74 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  t cackey_end_tra
8900: 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20  nsaction(struct 
8910: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
8920: 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45  t);. *. * ARGUME
8930: 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  NTS. *     cacke
8940: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20  y_slot *slot. * 
8950: 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20          Slot to 
8960: 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f  send commands to
8970: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
8980: 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45  LUE. *     CACKE
8990: 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20  Y_PCSC_S_OK     
89a0: 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20      On success. 
89b0: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
89c0: 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f  C_E_GENERIC    O
89d0: 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f  n error. *. * NO
89e0: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
89f0: 66 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65  function require
8a00: 73 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  s "cackey_begin_
8a10: 74 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20  transaction" to 
8a20: 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a  be called first.
8a30: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
8a40: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
8a50: 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
8a60: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
8a70: 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e  ot *slot) {..LON
8a80: 47 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65  G scard_trans_re
8a90: 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
8aa0: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
8ab0: 2e 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74  .");...if (!slot
8ac0: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
8ad0: 65 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  ected) {...CACKE
8ae0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8af0: 43 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e  Card is not conn
8b00: 65 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f  ected, unable to
8b10: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
8b20: 20 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69   on card");....i
8b30: 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  f (slot->transac
8b40: 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20  tion_depth > 0) 
8b50: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
8b60: 47 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65 61  G_PRINTF("Decrea
8b70: 73 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  sing transaction
8b80: 20 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e   depth and askin
8b90: 67 20 66 6f 72 20 61 20 68 61 72 64 77 61 72 65  g for a hardware
8ba0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78   lock on the nex
8bb0: 74 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74  t begin transact
8bc0: 69 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70  ion (current dep
8bd0: 74 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d  th = %i)", slot-
8be0: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8bf0: 74 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74  th);.....slot->t
8c00: 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
8c10: 2d 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74  --;.....if (slot
8c20: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
8c30: 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73  pth > 0) {.....s
8c40: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
8c50: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
8c60: 31 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72  1;....}...}....r
8c70: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
8c80: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
8c90: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8ca0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
8cb0: 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
8cc0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65  DEBUG_PRINTF("Te
8cd0: 72 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e  rminating a tran
8ce0: 73 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73  saction that has
8cf0: 20 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a   not begun!");..
8d00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
8d10: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
8d20: 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e  ..}...slot->tran
8d30: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b  saction_depth--;
8d40: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61  ...if (slot->tra
8d50: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e  nsaction_depth >
8d60: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
8d70: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61  EBUG_PRINTF("Tra
8d80: 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20  nsactions still 
8d90: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74  in progress, not
8da0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d   terminating on-
8db0: 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e  card Transaction
8dc0: 20 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20   (current depth 
8dd0: 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72  = %i)", slot->tr
8de0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29  ansaction_depth)
8df0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
8e00: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09  EY_PCSC_S_OK);..
8e10: 7d 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f  }...scard_trans_
8e20: 72 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72  ret = SCardEndTr
8e30: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e  ansaction(slot->
8e40: 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44  pcsc_card, SCARD
8e50: 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69  _LEAVE_CARD);..i
8e60: 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  f (scard_trans_r
8e70: 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55  et != SCARD_S_SU
8e80: 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45  CCESS) {...CACKE
8e90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
8ea0: 55 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72  Unable to end tr
8eb0: 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72  ansaction, retur
8ec0: 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b  ning in error");
8ed0: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8ee0: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
8ef0: 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
8f00: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63  EBUG_PRINTF("Suc
8f10: 65 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61  essfully termina
8f20: 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ted transaction 
8f30: 6f 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73  on slot (%s)", s
8f40: 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72  lot->pcsc_reader
8f50: 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b  );...return(CACK
8f60: 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d  EY_PCSC_S_OK);.}
8f70: 0a 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65  ../* APDU Relate
8f80: 64 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f  d Functions */./
8f90: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
8fa0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
8fb0: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
8fc0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
8fd0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
8fe0: 6e 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20  ned char class, 
8ff0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
9000: 73 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67  struction, unsig
9010: 6e 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73  ned char p1, uns
9020: 69 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75  igned char p2, u
9030: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c  nsigned char lc,
9040: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
9050: 64 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63  data, unsigned c
9060: 68 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74  har le, uint16_t
9070: 20 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69   *respcode, unsi
9080: 67 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64  gned char *respd
9090: 61 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73  ata, size_t *res
90a0: 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20  pdata_len);. *. 
90b0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
90c0: 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a     cackey_slot *
90d0: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
90e0: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
90f0: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
9100: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9110: 20 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20   class. *       
9120: 20 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53    APDU Class (GS
9130: 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31  CIS_CLASS_ISO781
9140: 36 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53  6 or GSCIS_CLASS
9150: 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d  _GLOBAL_PLATFORM
9160: 0a 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61  . *         usua
9170: 6c 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20  lly), (CLA). *. 
9180: 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  *     unsigned c
9190: 68 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  har instruction.
91a0: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
91b0: 49 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53  Instruction (INS
91c0: 29 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69  ). *. *     unsi
91d0: 67 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20  gned char p1. * 
91e0: 20 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72          APDU Par
91f0: 61 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a  ameter 1 (P1). *
9200: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9210: 20 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20   char p2. *     
9220: 20 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74      APDU Paramet
9230: 65 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20  er 2 (P2). *. * 
9240: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9250: 72 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20  r lc. *         
9260: 41 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43  APDU Length of C
9270: 6f 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74  ontent (Lc) -- t
9280: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9290: 68 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20  h of "data". *  
92a0: 20 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72         parameter
92b0: 2e 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20  .  If "data" is 
92c0: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
92d0: 4c 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  L, this paramete
92e0: 72 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20  r will. *       
92f0: 20 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a    be ignored.. *
9300: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
9310: 20 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20   char *data. *  
9320: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74         Pointer t
9330: 6f 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64  o buffer to send
9340: 2e 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  .  It should be 
9350: 22 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e  "Lc" bytes long.
9360: 20 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20    If. *         
9370: 73 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c  specified as NUL
9380: 4c 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74  L, "Lc" will not
9390: 20 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68   be sent, and th
93a0: 69 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62  is buffer will b
93b0: 65 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e  e. *         ign
93c0: 6f 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20  ored.. *. *     
93d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65  unsigned char le
93e0: 0a 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55  . *         APDU
93f0: 20 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63   Length of Expec
9400: 74 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74  tation (Le) -- t
9410: 68 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74  his is the lengt
9420: 68 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20  h of the. *     
9430: 20 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70      expected rep
9440: 6c 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ly.  If this is 
9450: 73 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74  specified as 0 t
9460: 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a  hen it will not.
9470: 20 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65   *         be se
9480: 6e 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69  nt.. *. *     ui
9490: 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65  nt16_t *respcode
94a0: 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54  . *         [OUT
94b0: 5d 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f  ] Pointer to sto
94c0: 72 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73  rage of APDU res
94d0: 70 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20  ponse code.  If 
94e0: 74 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20  this is. *      
94f0: 20 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20     specified as 
9500: 4e 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e  NULL, the respon
9510: 73 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20  se code will be 
9520: 64 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a  discarded.. *. *
9530: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
9540: 61 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20  ar *respdata. * 
9550: 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f          [OUT] Po
9560: 69 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65  inter to storage
9570: 20 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73   of APDU respons
9580: 65 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73  e data.  If this
9590: 20 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73   is. *         s
95a0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
95b0: 2c 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64  , the response d
95c0: 61 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63  ata will be disc
95d0: 61 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20  arded.  If. *   
95e0: 20 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64        the "respd
95f0: 61 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74  ata_len" paramet
9600: 65 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20  er is specified 
9610: 61 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75  as NULL, this bu
9620: 66 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20  ffer. *         
9630: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61  will not be upda
9640: 74 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73  ted.. *. *     s
9650: 69 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f  ize_t *respdata_
9660: 6c 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b  len. *         [
9670: 49 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72  IN, OUT] Pointer
9680: 20 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74   initialing cont
9690: 61 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20  aining the size 
96a0: 6f 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61  of the "respdata
96b0: 22 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66  ". *         buf
96c0: 66 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74  fer.  Before ret
96d0: 75 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e  urning, the poin
96e0: 74 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20  ted to value is 
96f0: 75 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20  updated to the. 
9700: 2a 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72  *         number
9710: 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
9720: 6e 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  n to the buffer.
9730: 20 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65    If this is spe
9740: 63 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20  cified as. *    
9750: 20 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69       NULL, it wi
9760: 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65  ll not be update
9770: 64 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61  d, and "respdata
9780: 22 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  " will be ignore
9790: 64 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20  d causing. *    
97a0: 20 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73       the respons
97b0: 65 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73  e data to be dis
97c0: 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45  carded.. *. * RE
97d0: 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
97e0: 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f    CACKEY_PCSC_S_
97f0: 4f 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20  OK           On 
9800: 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43  success. *     C
9810: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
9820: 45 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72  ERIC      On err
9830: 6f 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  or. *     CACKEY
9840: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
9850: 45 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e 64  ENT  If the send
9860: 69 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61 75  ing failed becau
9870: 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a  se the token is.
9880: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e    absent. *. * N
98b0: 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73  OTES. *     This
98c0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63   function will c
98d0: 6f 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43  onnect to the PC
98e0: 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d  /SC Connection M
98f0: 61 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20  anager via. *   
9900: 20 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f    cackey_pcsc_co
9910: 6e 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65  nnect() if neede
9920: 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20  d.. *. *     It 
9930: 77 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20  will connect to 
9940: 74 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20  the card in the 
9950: 72 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20  reader attached 
9960: 74 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20  to the slot. *  
9970: 20 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49     specified.  I
9980: 74 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74  t will reconnect
9990: 20 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20   to the card if 
99a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  the connection. 
99b0: 2a 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e  *     goes away.
99c0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
99d0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
99e0: 5f 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63  _send_apdu(struc
99f0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
9a00: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
9a10: 61 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e  ar class, unsign
9a20: 65 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74  ed char instruct
9a30: 69 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ion, unsigned ch
9a40: 61 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20  ar p1, unsigned 
9a50: 63 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65  char p2, unsigne
9a60: 64 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e  d int lc, unsign
9a70: 65 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75  ed char *data, u
9a80: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20  nsigned int le, 
9a90: 75 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f  uint16_t *respco
9aa0: 64 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  de, unsigned cha
9ab0: 72 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a  r *respdata, siz
9ac0: 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65  e_t *respdata_le
9ad0: 6e 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61  n) {..uint8_t ma
9ae0: 6a 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63  jor_rc, minor_rc
9af0: 3b 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f  ;..size_t bytes_
9b00: 74 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73  to_copy, tmp_res
9b10: 70 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53  pdata_len;..LPCS
9b20: 43 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20  CARD_IO_REQUEST 
9b30: 70 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f  pioSendPci;..DWO
9b40: 52 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57  RD protocol;..DW
9b50: 4f 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65  ORD xmit_len, re
9b60: 63 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63  cv_len;..LONG sc
9b70: 61 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63  ard_xmit_ret, sc
9b80: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a  ard_reconn_ret;.
9b90: 09 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31  .BYTE xmit_buf[1
9ba0: 30 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31  024], recv_buf[1
9bb0: 30 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f  024];..int pcsc_
9bc0: 63 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73  connect_ret, pcs
9bd0: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09  c_getresp_ret;..
9be0: 69 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45  int idx;...CACKE
9bf0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9c00: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
9c10: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
9c20: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
9c30: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
9c40: 65 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72  ecified.");....r
9c50: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
9c60: 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d  C_E_GENERIC);..}
9c70: 0a 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f  ...pcsc_connect_
9c80: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e  ret = cackey_con
9c90: 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b  nect_card(slot);
9ca0: 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65  ..if (pcsc_conne
9cb0: 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  ct_ret != CACKEY
9cc0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
9cd0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
9ce0: 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63  NTF("Unable to c
9cf0: 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20  onnect to card, 
9d00: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
9d10: 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72  lure");....retur
9d20: 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
9d30: 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f  GENERIC);..}.../
9d40: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63  * Determine whic
9d50: 68 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65  h protocol to se
9d60: 6e 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69  nd using */..swi
9d70: 74 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f  tch (slot->proto
9d80: 63 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43  col) {...case SC
9d90: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a  ARD_PROTOCOL_T0:
9da0: 0a 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d  ....pioSendPci =
9db0: 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b 0a 0a   SCARD_PCI_T0;..
9dc0: 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73 65  ...break;...case
9dd0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
9de0: 54 31 3a 0a 09 09 09 70 69 6f 53 65 6e 64 50 63  T1:....pioSendPc
9df0: 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31  i = SCARD_PCI_T1
9e00: 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 64  ;.....break;...d
9e10: 65 66 61 75 6c 74 3a 0a 09 09 09 43 41 43 4b 45  efault:....CACKE
9e20: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9e30: 49 6e 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  Invalid protocol
9e40: 20 66 6f 75 6e 64 2c 20 61 62 6f 72 74 69 6e 67   found, aborting
9e50: 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
9e60: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
9e70: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
9e80: 54 72 61 6e 73 6d 69 74 20 2a 2f 0a 09 78 6d 69  Transmit */..xmi
9e90: 74 5f 6c 65 6e 20 3d 20 30 3b 0a 09 78 6d 69 74  t_len = 0;..xmit
9ea0: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
9eb0: 20 3d 20 63 6c 61 73 73 3b 0a 09 78 6d 69 74 5f   = class;..xmit_
9ec0: 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20  buf[xmit_len++] 
9ed0: 3d 20 69 6e 73 74 72 75 63 74 69 6f 6e 3b 0a 09  = instruction;..
9ee0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
9ef0: 6e 2b 2b 5d 20 3d 20 70 31 3b 0a 09 78 6d 69 74  n++] = p1;..xmit
9f00: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
9f10: 20 3d 20 70 32 3b 0a 09 69 66 20 28 64 61 74 61   = p2;..if (data
9f20: 29 20 7b 0a 09 09 69 66 20 28 6c 63 20 3e 20 32  ) {...if (lc > 2
9f30: 35 36 29 20 7b 0a 09 09 09 78 6d 69 74 5f 62 75  56) {....xmit_bu
9f40: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
9f50: 30 78 38 30 3b 20 2f 2a 20 58 58 58 20 55 4e 54  0x80; /* XXX UNT
9f60: 45 53 54 45 44 20 2a 2f 0a 09 09 09 78 6d 69 74  ESTED */....xmit
9f70: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
9f80: 20 3d 20 28 6c 63 20 26 20 30 78 66 66 30 30 29   = (lc & 0xff00)
9f90: 20 3e 3e 20 38 3b 0a 09 09 09 78 6d 69 74 5f 62   >> 8;....xmit_b
9fa0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
9fb0: 20 6c 63 20 26 20 30 78 66 66 3b 0a 09 09 7d 20   lc & 0xff;...} 
9fc0: 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74 5f 62  else {....xmit_b
9fd0: 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d  uf[xmit_len++] =
9fe0: 20 6c 63 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28   lc;...}...for (
9ff0: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 6c  idx = 0; idx < l
a000: 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 78  c; idx++) {....x
a010: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a020: 2b 2b 5d 20 3d 20 64 61 74 61 5b 69 64 78 5d 3b  ++] = data[idx];
a030: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 6c 65  ...}..}...if (le
a040: 20 21 3d 20 30 78 30 30 29 20 7b 0a 09 09 69 66   != 0x00) {...if
a050: 20 28 6c 65 20 3e 20 32 35 36 29 20 7b 0a 09 09   (le > 256) {...
a060: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a070: 65 6e 2b 2b 5d 20 3d 20 30 78 38 30 3b 20 2f 2a  en++] = 0x80; /*
a080: 20 58 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f   XXX UNTESTED */
a090: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a0a0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 65 20 26  t_len++] = (le &
a0b0: 20 30 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09   0xff00) >> 8;..
a0c0: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a0d0: 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26 20 30 78  len++] = le & 0x
a0e0: 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20 69 66 20  ff;...} else if 
a0f0: 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b 0a 09 09  (le == 256) {...
a100: 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c  .xmit_buf[xmit_l
a110: 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b 0a 09 09  en++] = 0x00;...
a120: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78 6d 69 74  } else {....xmit
a130: 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d  _buf[xmit_len++]
a140: 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   = le;...}..}...
a150: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
a160: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
a170: 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f  /..cackey_begin_
a180: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
a190: 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73 73 20 3d  );...if (class =
a1a0: 3d 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  = GSCIS_CLASS_IS
a1b0: 4f 37 38 31 36 20 26 26 20 69 6e 73 74 72 75 63  O7816 && instruc
a1c0: 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53 5f 49 4e  tion == GSCIS_IN
a1d0: 53 54 52 5f 56 45 52 49 46 59 20 26 26 20 70 31  STR_VERIFY && p1
a1e0: 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 43 41   == 0x00) {...CA
a1f0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
a200: 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55 3a  F("Sending APDU:
a210: 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e 22 29 3b   <<censored>>");
a220: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43  ..} else {...CAC
a230: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
a240: 55 46 28 22 53 65 6e 64 69 6e 67 20 41 50 44 55  UF("Sending APDU
a250: 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d  :", xmit_buf, xm
a260: 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65  it_len);..}...re
a270: 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  cv_len = sizeof(
a280: 72 65 63 76 5f 62 75 66 29 3b 0a 09 73 63 61 72  recv_buf);..scar
a290: 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20 53 43 61  d_xmit_ret = SCa
a2a0: 72 64 54 72 61 6e 73 6d 69 74 28 73 6c 6f 74 2d  rdTransmit(slot-
a2b0: 3e 70 63 73 63 5f 63 61 72 64 2c 20 70 69 6f 53  >pcsc_card, pioS
a2c0: 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f 62 75 66  endPci, xmit_buf
a2d0: 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e 55 4c 4c  , xmit_len, NULL
a2e0: 2c 20 72 65 63 76 5f 62 75 66 2c 20 26 72 65 63  , recv_buf, &rec
a2f0: 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20 28 73 63  v_len);...if (sc
a300: 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 3d 20  ard_xmit_ret == 
a310: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e  SCARD_E_NOT_TRAN
a320: 53 41 43 54 45 44 29 20 7b 0a 09 09 43 41 43 4b  SACTED) {...CACK
a330: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
a340: 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6e 64 20  "Failed to send 
a350: 41 50 44 55 20 74 6f 20 63 61 72 64 20 28 53 43  APDU to card (SC
a360: 61 72 64 54 72 61 6e 73 6d 69 74 28 29 20 3d 20  ardTransmit() = 
a370: 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c 20 61 73  %s/%lx), will as
a380: 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  k calling functi
a390: 6f 6e 20 74 6f 20 72 65 74 72 79 20 28 6e 6f 74  on to retry (not
a3a0: 20 72 65 73 65 74 74 69 6e 67 20 63 61 72 64 29   resetting card)
a3b0: 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  ...", CACKEY_DEB
a3c0: 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45 52 52  UG_FUNC_SCARDERR
a3d0: 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f 78 6d  _TO_STR(scard_xm
a3e0: 69 74 5f 72 65 74 29 2c 20 28 75 6e 73 69 67 6e  it_ret), (unsign
a3f0: 65 64 20 6c 6f 6e 67 29 20 73 63 61 72 64 5f 78  ed long) scard_x
a400: 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09 2f 2a 20  mit_ret);..../* 
a410: 42 65 67 69 6e 20 53 6d 61 72 74 63 61 72 64 20  Begin Smartcard 
a420: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
a430: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
a440: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
a450: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a460: 50 43 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09  PCSC_E_RETRY);..
a470: 7d 0a 0a 09 69 66 20 28 73 63 61 72 64 5f 78 6d  }...if (scard_xm
a480: 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  it_ret != SCARD_
a490: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 43  S_SUCCESS) {...C
a4a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a4b0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
a4c0: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
a4d0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
a4e0: 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20 43 41 43   = %s/%lx)", CAC
a4f0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
a500: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
a510: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20  card_xmit_ret), 
a520: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
a530: 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 29 3b  scard_xmit_ret);
a540: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
a550: 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b 69 6e 67  _PRINTF("Marking
a560: 20 73 6c 6f 74 20 61 73 20 68 61 76 69 6e 67 20   slot as having 
a570: 62 65 65 6e 20 72 65 73 65 74 22 29 3b 0a 09 09  been reset");...
a580: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
a590: 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09  _reset(slot);...
a5a0: 09 69 66 20 28 73 63 61 72 64 5f 78 6d 69 74 5f  .if (scard_xmit_
a5b0: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 57 5f 52  ret == SCARD_W_R
a5c0: 45 53 45 54 5f 43 41 52 44 29 20 7b 0a 09 09 09  ESET_CARD) {....
a5d0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a5e0: 4e 54 46 28 22 52 65 73 65 74 20 72 65 71 75 69  NTF("Reset requi
a5f0: 72 65 64 2c 20 70 6c 65 61 73 65 20 68 6f 6c 64  red, please hold
a600: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63 61 72 64  ...");.....scard
a610: 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61  _reconn_ret = ca
a620: 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63  ckey_reconnect_c
a630: 61 72 64 28 73 6c 6f 74 2c 20 53 43 41 52 44 5f  ard(slot, SCARD_
a640: 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43  PROTOCOL_T0 | SC
a650: 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c  ARD_PROTOCOL_T1,
a660: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09   &protocol);....
a670: 09 69 66 20 28 73 63 61 72 64 5f 72 65 63 6f 6e  .if (scard_recon
a680: 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  n_ret == SCARD_S
a690: 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
a6a0: 2f 2a 20 55 70 64 61 74 65 20 70 72 6f 74 6f 63  /* Update protoc
a6b0: 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d 3e  ol */.....slot->
a6c0: 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f 74 6f  protocol = proto
a6d0: 63 6f 6c 3b 0a 09 09 09 09 73 77 69 74 63 68 20  col;.....switch 
a6e0: 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 29  (slot->protocol)
a6f0: 20 7b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41   {......case SCA
a700: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a  RD_PROTOCOL_T0:.
a710: 09 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69  ......pioSendPci
a720: 20 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 30 3b   = SCARD_PCI_T0;
a730: 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ........break;..
a740: 09 09 09 09 63 61 73 65 20 53 43 41 52 44 5f 50  ....case SCARD_P
a750: 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09 09 09 09  ROTOCOL_T1:.....
a760: 09 09 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53  ..pioSendPci = S
a770: 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09  CARD_PCI_T1;....
a780: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
a790: 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 09 09 43  default:.......C
a7a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a7b0: 54 46 28 22 49 6e 76 61 6c 69 64 20 70 72 6f 74  TF("Invalid prot
a7c0: 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62 75 74 20  ocol found, but 
a7d0: 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64 6f 20 61  too late to do a
a7e0: 6e 79 74 68 69 6e 67 20 61 62 6f 75 74 20 69 74  nything about it
a7f0: 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e 67 20 61   now -- trying a
a800: 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09 09 09 09  nyway.");.......
a810: 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
a820: 09 09 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69  .../* Re-establi
a830: 73 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  sh transaction, 
a840: 69 66 20 69 74 20 77 61 73 20 70 72 65 73 65 6e  if it was presen
a850: 74 20 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f  t */.....if (slo
a860: 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
a870: 65 70 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09  epth > 0) {.....
a880: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
a890: 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09  on_depth--;.....
a8a0: 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69  .slot->transacti
a8b0: 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20  on_need_hw_lock 
a8c0: 3d 20 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79  = 1;......cackey
a8d0: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
a8e0: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a  on(slot);.....}.
a8f0: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
a900: 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74 20  G_PRINTF("Reset 
a910: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 72  successful, retr
a920: 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b 0a 0a 09  ansmitting");...
a930: 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69  ...recv_len = si
a940: 7a 65 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a  zeof(recv_buf);.
a950: 09 09 09 09 73 63 61 72 64 5f 78 6d 69 74 5f 72  ....scard_xmit_r
a960: 65 74 20 3d 20 53 43 61 72 64 54 72 61 6e 73 6d  et = SCardTransm
a970: 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  it(slot->pcsc_ca
a980: 72 64 2c 20 70 69 6f 53 65 6e 64 50 63 69 2c 20  rd, pioSendPci, 
a990: 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69 74 5f 6c  xmit_buf, xmit_l
a9a0: 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63 76 5f 62  en, NULL, recv_b
a9b0: 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e 29 3b 0a  uf, &recv_len);.
a9c0: 0a 09 09 09 09 69 66 20 28 73 63 61 72 64 5f 78  .....if (scard_x
a9d0: 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41 52 44  mit_ret != SCARD
a9e0: 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
a9f0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
aa00: 50 52 49 4e 54 46 28 22 52 65 74 72 61 6e 73 6d  PRINTF("Retransm
aa10: 69 74 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  it failed, retur
aa20: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 20  ning in failure 
aa30: 61 66 74 65 72 20 64 69 73 63 6f 6e 6e 65 63 74  after disconnect
aa40: 69 6e 67 20 74 68 65 20 63 61 72 64 20 28 53 43  ing the card (SC
aa50: 61 72 64 54 72 61 6e 73 6d 69 74 20 3d 20 25 73  ardTransmit = %s
aa60: 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45 59 5f 44  /%li)", CACKEY_D
aa70: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
aa80: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
aa90: 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c 6f 6e 67  xmit_ret), (long
aaa0: 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  ) scard_xmit_ret
aab0: 29 3b 0a 0a 09 09 09 09 09 53 43 61 72 64 44 69  );.......SCardDi
aac0: 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70  sconnect(slot->p
aad0: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
aae0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09  LEAVE_CARD);....
aaf0: 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72  ..slot->pcsc_car
ab00: 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b  d_connected = 0;
ab10: 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ......./* End Sm
ab20: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
ab30: 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73 6c 6f 74  ion */......slot
ab40: 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ->transaction_de
ab50: 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 09 63 61  pth = 1;......ca
ab60: 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ckey_end_transac
ab70: 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09  tion(slot);.....
ab80: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
ab90: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
aba0: 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20  NT);.....}....} 
abb0: 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43 4b 45  else {.....CACKE
abc0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
abd0: 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61  Disconnecting ca
abe0: 72 64 22 29 3b 0a 0a 09 09 09 09 53 43 61 72 64  rd");......SCard
abf0: 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d  Disconnect(slot-
ac00: 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52  >pcsc_card, SCAR
ac10: 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09  D_LEAVE_CARD);..
ac20: 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  ...slot->pcsc_ca
ac30: 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
ac40: 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64 20 53 6d  ;....../* End Sm
ac50: 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74  artcard Transact
ac60: 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c 6f 74 2d  ion */.....slot-
ac70: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
ac80: 74 68 20 3d 20 31 3b 0a 09 09 09 09 63 61 63 6b  th = 1;.....cack
ac90: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
aca0: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 43  on(slot);......C
acb0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
acc0: 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
acd0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 09 09 09 09   failure");.....
ace0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
acf0: 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
ad00: 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65  );....}...} else
ad10: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
ad20: 55 47 5f 50 52 49 4e 54 46 28 22 44 69 73 63 6f  UG_PRINTF("Disco
ad30: 6e 6e 65 63 74 69 6e 67 20 63 61 72 64 22 29 3b  nnecting card");
ad40: 0a 0a 09 09 09 53 43 61 72 64 44 69 73 63 6f 6e  .....SCardDiscon
ad50: 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  nect(slot->pcsc_
ad60: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
ad70: 45 5f 43 41 52 44 29 3b 0a 09 09 09 73 6c 6f 74  E_CARD);....slot
ad80: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
ad90: 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09 09 09 2f  ected = 0;...../
ada0: 2a 20 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20  * End Smartcard 
adb0: 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09  Transaction */..
adc0: 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74  ..slot->transact
add0: 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09  ion_depth = 1;..
ade0: 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61  ..cackey_end_tra
adf0: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a  nsaction(slot);.
ae00: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ae10: 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
ae20: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
ae30: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
ae40: 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
ae50: 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  SENT);...}..}...
ae60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
ae70: 4e 54 42 55 46 28 22 52 65 74 75 72 6e 65 64 20  NTBUF("Returned 
ae80: 56 61 6c 75 65 3a 22 2c 20 72 65 63 76 5f 62 75  Value:", recv_bu
ae90: 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09  f, recv_len);...
aea0: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 32  if (recv_len < 2
aeb0: 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69 6d 61 6c  ) {.../* Minimal
aec0: 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e 67 74 68   response length
aed0: 20 69 73 20 32 20 62 79 74 65 73 2c 20 72 65 74   is 2 bytes, ret
aee0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
aef0: 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45  e */...CACKEY_DE
af00: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
af10: 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  onse too small, 
af20: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
af30: 6c 75 72 65 20 28 72 65 63 76 5f 6c 65 6e 20 3d  lure (recv_len =
af40: 20 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65   %lu)", (unsigne
af50: 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e  d long) recv_len
af60: 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20 53 6d 61  );..../* End Sma
af70: 72 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69  rtcard Transacti
af80: 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65 79 5f 65  on */...cackey_e
af90: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
afa0: 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  lot);....return(
afb0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
afc0: 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  NERIC);..}.../* 
afd0: 44 65 74 65 72 6d 69 6e 65 20 72 65 73 75 6c 74  Determine result
afe0: 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a 6f 72 5f   code */..major_
aff0: 72 63 20 3d 20 72 65 63 76 5f 62 75 66 5b 72 65  rc = recv_buf[re
b000: 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a 09 6d 69  cv_len - 2];..mi
b010: 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75  nor_rc = recv_bu
b020: 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 31 5d 3b  f[recv_len - 1];
b030: 0a 09 69 66 20 28 72 65 73 70 63 6f 64 65 29 20  ..if (respcode) 
b040: 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65 20 3d 20  {...*respcode = 
b050: 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20 38 29 20  (major_rc << 8) 
b060: 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09 7d 0a 0a  | minor_rc;..}..
b070: 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65 73 73 61  ./* Adjust messa
b080: 67 65 20 62 75 66 66 65 72 20 2a 2f 0a 09 72 65  ge buffer */..re
b090: 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a 0a 09 2f  cv_len -= 2;.../
b0a0: 2a 20 41 64 64 20 62 79 74 65 73 20 74 6f 20 72  * Add bytes to r
b0b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 09  eturn value */..
b0c0: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
b0d0: 20 3d 20 30 3b 0a 09 69 66 20 28 72 65 73 70 64   = 0;..if (respd
b0e0: 61 74 61 20 26 26 20 72 65 73 70 64 61 74 61 5f  ata && respdata_
b0f0: 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f 72 65 73  len) {...tmp_res
b100: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a 72 65 73  pdata_len = *res
b110: 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09 62 79  pdata_len;....by
b120: 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 2a 72  tes_to_copy = *r
b130: 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09 09  espdata_len;....
b140: 69 66 20 28 72 65 63 76 5f 6c 65 6e 20 3c 20 62  if (recv_len < b
b150: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a  ytes_to_copy) {.
b160: 09 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
b170: 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a 09 09 7d   = recv_len;...}
b180: 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b190: 5f 50 52 49 4e 54 46 28 22 43 6f 70 79 69 6e 67  _PRINTF("Copying
b1a0: 20 25 6c 75 20 62 79 74 65 73 20 74 6f 20 74 68   %lu bytes to th
b1b0: 65 20 62 75 66 66 65 72 20 28 72 65 63 76 27 64  e buffer (recv'd
b1c0: 20 25 6c 75 20 62 79 74 65 73 2c 20 62 75 74 20   %lu bytes, but 
b1d0: 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65 73 20 6c  only %lu bytes l
b1e0: 65 66 74 20 69 6e 20 6f 75 72 20 62 75 66 66 65  eft in our buffe
b1f0: 72 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  r)", (unsigned l
b200: 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f 5f 63 6f  ong) bytes_to_co
b210: 70 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  py, (unsigned lo
b220: 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c 20 28 75  ng) recv_len, (u
b230: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 72  nsigned long) *r
b240: 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09  espdata_len);...
b250: 09 6d 65 6d 63 70 79 28 72 65 73 70 64 61 74 61  .memcpy(respdata
b260: 2c 20 72 65 63 76 5f 62 75 66 2c 20 62 79 74 65  , recv_buf, byte
b270: 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09 09 72 65  s_to_copy);...re
b280: 73 70 64 61 74 61 20 2b 3d 20 62 79 74 65 73 5f  spdata += bytes_
b290: 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a 72 65 73  to_copy;....*res
b2a0: 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62 79 74 65  pdata_len = byte
b2b0: 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09 74 6d 70  s_to_copy;...tmp
b2c0: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2d 3d  _respdata_len -=
b2d0: 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a   bytes_to_copy;.
b2e0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
b2f0: 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  recv_len != 0) {
b300: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
b310: 5f 50 52 49 4e 54 46 28 22 54 68 72 6f 77 69 6e  _PRINTF("Throwin
b320: 67 20 61 77 61 79 20 25 6c 75 20 62 79 74 65 73  g away %lu bytes
b330: 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20 70 75 74  , nowhere to put
b340: 20 74 68 65 6d 21 22 2c 20 28 75 6e 73 69 67 6e   them!", (unsign
b350: 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65  ed long) recv_le
b360: 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  n);...}..}...if 
b370: 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20 30 78 36  (major_rc == 0x6
b380: 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20 6e 65 65  1) {.../* We nee
b390: 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a 09 09 43  d to READ */...C
b3a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b3b0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
b3c0: 72 65 71 75 69 72 65 64 22 29 3b 0a 0a 09 09 69  required");....i
b3d0: 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d 3d 20 30  f (minor_rc == 0
b3e0: 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e 6f 72 5f  x00) {....minor_
b3f0: 72 63 20 3d 20 43 41 43 4b 45 59 5f 41 50 44 55  rc = CACKEY_APDU
b400: 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09 70 63 73  _MTU;...}....pcs
b410: 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d 20  c_getresp_ret = 
b420: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
b430: 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
b440: 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53 43 49  SS_ISO7816, GSCI
b450: 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52 45 53 50  S_INSTR_GET_RESP
b460: 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30 78 30 30  ONSE, 0x00, 0x00
b470: 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69 6e 6f 72  , 0, NULL, minor
b480: 5f 72 63 2c 20 72 65 73 70 63 6f 64 65 2c 20 72  _rc, respcode, r
b490: 65 73 70 64 61 74 61 2c 20 26 74 6d 70 5f 72 65  espdata, &tmp_re
b4a0: 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a 0a 09 09  spdata_len);....
b4b0: 69 66 20 28 70 63 73 63 5f 67 65 74 72 65 73 70  if (pcsc_getresp
b4c0: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
b4d0: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
b4e0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b4f0: 54 46 28 22 42 75 66 66 65 72 20 72 65 61 64 20  TF("Buffer read 
b500: 66 61 69 6c 65 64 21 20 20 52 65 74 75 72 6e 69  failed!  Returni
b510: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
b520: 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72  ...../* End Smar
b530: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
b540: 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65  n */....cackey_e
b550: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
b560: 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20 28 70 63  lot);.....if (pc
b570: 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74 20 3d  sc_getresp_ret =
b580: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
b590: 52 45 54 52 59 29 20 7b 0a 09 09 09 09 72 65 74  RETRY) {.....ret
b5a0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
b5b0: 45 5f 52 45 54 52 59 29 3b 0a 09 09 09 7d 0a 0a  E_RETRY);....}..
b5c0: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b5d0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
b5e0: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 72 65 73  ;...}....if (res
b5f0: 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 09  pdata_len) {....
b600: 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 2b 3d  *respdata_len +=
b610: 20 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65   tmp_respdata_le
b620: 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 45 6e 64  n;...}..../* End
b630: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
b640: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b  action */...cack
b650: 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  ey_end_transacti
b660: 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 43 41 43  on(slot);....CAC
b670: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b680: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
b690: 75 63 63 65 73 73 20 28 62 75 66 66 65 72 20 72  uccess (buffer r
b6a0: 65 61 64 20 63 6f 6d 70 6c 65 74 65 29 22 29 3b  ead complete)");
b6b0: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
b6c0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a  _PCSC_S_OK);..}.
b6d0: 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
b6e0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
b6f0: 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72  /..cackey_end_tr
b700: 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
b710: 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20  ...if (major_rc 
b720: 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09 2f 2a 20  == 0x90) {.../* 
b730: 53 75 63 63 65 73 73 20 2a 2f 0a 09 09 43 41 43  Success */...CAC
b740: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
b750: 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  ("Returning in s
b760: 75 63 63 65 73 73 20 28 6d 61 6a 6f 72 5f 72 63  uccess (major_rc
b770: 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a 09 09 72   = 0x90)");....r
b780: 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
b790: 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 0a 09 43  C_S_OK);..}....C
b7a0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
b7b0: 54 46 28 22 41 50 44 55 20 52 65 74 75 72 6e 65  TF("APDU Returne
b7c0: 64 20 61 6e 20 65 72 72 6f 72 2c 20 72 65 74 75  d an error, retu
b7d0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b7e0: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
b7f0: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
b800: 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59  IC);.}../*. * SY
b810: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 73 73  NPOSIS. *     ss
b820: 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74  ize_t cackey_get
b830: 5f 64 61 74 61 28 73 74 72 75 63 74 20 63 61 63  _data(struct cac
b840: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
b850: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
b860: 75 66 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f  uffer, size_t co
b870: 75 6e 74 2c 20 2e 2e 2e 2e 0a 20 2a 0a 20 2a 20  unt, ..... *. * 
b880: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
b890: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73   struct cackey_s
b8a0: 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20  lot *slot. *    
b8b0: 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e       Slot to sen
b8c0: 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a  d commands to. *
b8d0: 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64  . *     unsigned
b8e0: 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a 20 2a   char *buffer. *
b8f0: 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 42           [OUT] B
b900: 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20 20 20  uffer. *. *     
b910: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20 2a 20  size_t count. * 
b920: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
b930: 66 20 62 79 74 65 73 20 74 6f 20 61 74 74 65 6d  f bytes to attem
b940: 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a 20 2a  pt to read. *. *
b950: 20 20 20 20 20 73 69 7a 65 5f 74 20 69 6e 69 74       size_t init
b960: 69 61 6c 5f 6f 66 66 73 65 74 0a 20 2a 20 20 20  ial_offset. *   
b970: 20 20 20 20 20 20 53 70 65 63 69 66 79 20 74 68        Specify th
b980: 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69  e offset to begi
b990: 6e 20 74 68 65 20 72 65 61 64 20 66 72 6f 6d 0a  n the read from.
b9a0: 20 2a 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20   *. *. * RETURN 
b9b0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 54 68 69  VALUE. *     Thi
b9c0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
b9d0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
b9e0: 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
b9f0: 72 65 61 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65  read, or -1 on e
ba00: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45  rror.. *. * NOTE
ba10: 53 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a  S. *     None. *
ba20: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a  . */.static ssiz
ba30: 65 5f 74 20 63 61 63 6b 65 79 5f 67 65 74 5f 64  e_t cackey_get_d
ba40: 61 74 61 28 73 74 72 75 63 74 20 63 61 63 6b 65  ata(struct cacke
ba50: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e  y_slot *slot, un
ba60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66  signed char *buf
ba70: 66 65 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  fer, size_t coun
ba80: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
ba90: 20 6f 69 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69   oid[3]) {..unsi
baa0: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
bab0: 72 5f 70 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69  r_p;..size_t ini
bac0: 74 5f 63 6f 75 6e 74 3b 0a 0a 09 73 69 7a 65 5f  t_count;...size_
bad0: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61  t offset = 0, ma
bae0: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f  x_offset, max_co
baf0: 75 6e 74 2c 20 73 69 7a 65 3b 0a 09 75 6e 73 69  unt, size;..unsi
bb00: 67 6e 65 64 20 63 68 61 72 20 63 6d 64 5b 5d 20  gned char cmd[] 
bb10: 3d 20 7b 30 78 35 43 2c 20 30 78 30 33 2c 20 30  = {0x5C, 0x03, 0
bb20: 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d  x00, 0x00, 0x00}
bb30: 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65 73 70  ;..uint16_t resp
bb40: 63 6f 64 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  code;..int send_
bb50: 72 65 74 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  ret;..int idx;..
bb60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
bb70: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
bb80: 0a 0a 09 69 6e 69 74 5f 63 6f 75 6e 74 20 3d 20  ...init_count = 
bb90: 63 6f 75 6e 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66  count;...max_off
bba0: 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61  set = count;..ma
bbb0: 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59  x_count = CACKEY
bbc0: 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 63 6d 64  _APDU_MTU;...cmd
bbd0: 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a 09 63  [2] = oid[0];..c
bbe0: 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d 3b 0a  md[3] = oid[1];.
bbf0: 09 63 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b 32 5d  .cmd[4] = oid[2]
bc00: 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ;...send_ret = c
bc10: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
bc20: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
bc30: 53 5f 49 53 4f 37 38 31 36 2c 20 4e 49 53 54 53  S_ISO7816, NISTS
bc40: 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f  P800_73_3_INSTR_
bc50: 47 45 54 5f 44 41 54 41 2c 20 30 78 33 46 2c 20  GET_DATA, 0x3F, 
bc60: 30 78 46 46 2c 20 73 69 7a 65 6f 66 28 63 6d 64  0xFF, sizeof(cmd
bc70: 29 2c 20 63 6d 64 2c 20 63 6f 75 6e 74 2c 20 26  ), cmd, count, &
bc80: 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72  respcode, buffer
bc90: 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 69 66 20  , &count);...if 
bca0: 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43  (send_ret == CAC
bcb0: 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59  KEY_PCSC_E_RETRY
bcc0: 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
bcd0: 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20  UG_PRINTF("ADPU 
bce0: 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20  Sending failed, 
bcf0: 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62 75  retrying read bu
bd00: 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75 72  ffer");....retur
bd10: 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74  n(cackey_get_dat
bd20: 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c 20  a(slot, buffer, 
bd30: 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 6f 69 64 29  init_count, oid)
bd40: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64  );..}...if (send
bd50: 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
bd60: 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 69 66  CSC_S_OK) {...if
bd70: 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78   (respcode == 0x
bd80: 36 41 38 36 29 20 7b 0a 2f 2a 20 58 58 58 20 54  6A86) {./* XXX T
bd90: 4f 44 4f 20 50 49 56 20 2a 2f 0a 09 09 7d 0a 0a  ODO PIV */...}..
bda0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
bdb0: 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 73 65  RINTF("cackey_se
bdc0: 6e 64 5f 61 70 64 75 28 29 20 66 61 69 6c 65 64  nd_apdu() failed
bdd0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
bde0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
bdf0: 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6f 66  urn(-1);..}...of
be00: 66 73 65 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a  fset += count;..
be10: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
be20: 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
be30: 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
be40: 0a 09 69 66 20 28 6f 66 66 73 65 74 20 3e 20 5f  ..if (offset > _
be50: 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29  POSIX_SSIZE_MAX)
be60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
be70: 47 5f 50 52 49 4e 54 46 28 22 4f 66 66 73 65 74  G_PRINTF("Offset
be80: 20 65 78 63 65 65 64 73 20 6d 61 78 69 6d 75 6d   exceeds maximum
be90: 20 76 61 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e   value, returnin
bea0: 67 20 69 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d  g in failure. (m
beb0: 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74  ax = %li, offset
bec0: 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
bed0: 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
bee0: 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
bef0: 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72  g) offset);....r
bf00: 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20  eturn(-1);..}.# 
bf10: 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09   endif.#endif...
bf20: 69 66 20 28 6f 66 66 73 65 74 20 3c 20 32 29 20  if (offset < 2) 
bf30: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
bf40: 5f 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45  _PRINTF("APDU GE
bf50: 54 20 44 41 54 41 20 72 65 74 75 72 6e 65 64 20  T DATA returned 
bf60: 25 6c 75 20 62 79 74 65 73 2c 20 77 68 69 63 68  %lu bytes, which
bf70: 20 69 73 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f   is too short fo
bf80: 72 20 61 20 42 45 52 2d 54 4c 56 20 72 65 73 70  r a BER-TLV resp
bf90: 6f 6e 73 65 22 2c 20 28 75 6e 73 69 67 6e 65 64  onse", (unsigned
bfa0: 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a   long) offset);.
bfb0: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
bfc0: 7d 0a 0a 09 62 75 66 66 65 72 5f 70 20 3d 20 62  }...buffer_p = b
bfd0: 75 66 66 65 72 3b 0a 09 69 66 20 28 2a 62 75 66  uffer;..if (*buf
bfe0: 66 65 72 5f 70 20 21 3d 20 30 78 35 33 29 20 7b  fer_p != 0x53) {
bff0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c000: 50 52 49 4e 54 46 28 22 41 50 44 55 20 47 45 54  PRINTF("APDU GET
c010: 20 44 41 54 41 20 64 69 64 20 6e 6f 74 20 72 65   DATA did not re
c020: 74 75 72 6e 20 61 20 42 45 52 2d 54 4c 56 20 77  turn a BER-TLV w
c030: 69 74 68 20 74 61 67 20 35 33 2e 20 20 54 61 67  ith tag 53.  Tag
c040: 20 3d 20 25 30 32 78 22 2c 20 28 75 6e 73 69 67   = %02x", (unsig
c050: 6e 65 64 20 69 6e 74 29 20 2a 62 75 66 66 65 72  ned int) *buffer
c060: 5f 70 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  _p);....return(-
c070: 31 29 3b 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70  1);..}..buffer_p
c080: 2b 2b 3b 0a 0a 09 69 66 20 28 28 2a 62 75 66 66  ++;...if ((*buff
c090: 65 72 5f 70 20 26 20 30 78 38 30 29 20 3d 3d 20  er_p & 0x80) == 
c0a0: 30 78 38 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d  0x80) {...size =
c0b0: 20 30 3b 0a 09 09 69 64 78 20 3d 20 28 2a 62 75   0;...idx = (*bu
c0c0: 66 66 65 72 5f 70 20 26 20 30 78 37 66 29 3b 0a  ffer_p & 0x7f);.
c0d0: 0a 09 09 69 66 20 28 28 28 62 75 66 66 65 72 5f  ...if (((buffer_
c0e0: 70 20 2d 20 62 75 66 66 65 72 29 20 2b 20 69 64  p - buffer) + id
c0f0: 78 29 20 3e 3d 20 6f 66 66 73 65 74 29 20 7b 0a  x) >= offset) {.
c100: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
c110: 50 52 49 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65  PRINTF("Malforme
c120: 64 20 42 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e  d BER value -- n
c130: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
c140: 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 72 65 61  available to rea
c150: 64 20 6c 65 6e 67 74 68 22 29 3b 0a 0a 09 09 09  d length");.....
c160: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
c170: 0a 09 09 66 6f 72 20 28 3b 20 69 64 78 20 3e 20  ...for (; idx > 
c180: 30 3b 20 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62  0; idx--) {....b
c190: 75 66 66 65 72 5f 70 2b 2b 3b 0a 09 09 09 73 69  uffer_p++;....si
c1a0: 7a 65 20 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a  ze <<= 8;....siz
c1b0: 65 20 7c 3d 20 2a 62 75 66 66 65 72 5f 70 3b 0a  e |= *buffer_p;.
c1c0: 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
c1d0: 73 69 7a 65 20 3d 20 2a 62 75 66 66 65 72 5f 70  size = *buffer_p
c1e0: 3b 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70 2b 2b  ;..}..buffer_p++
c1f0: 3b 0a 0a 09 69 66 20 28 28 28 62 75 66 66 65 72  ;...if (((buffer
c200: 5f 70 20 2d 20 62 75 66 66 65 72 29 20 2b 20 73  _p - buffer) + s
c210: 69 7a 65 29 20 21 3d 20 6f 66 66 73 65 74 29 20  ize) != offset) 
c220: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
c230: 5f 50 52 49 4e 54 46 28 22 45 6e 74 69 72 65 20  _PRINTF("Entire 
c240: 62 75 66 66 65 72 20 69 73 20 6e 6f 74 20 63 6f  buffer is not co
c250: 6e 73 75 6d 65 64 21 22 29 3b 0a 0a 09 09 69 66  nsumed!");....if
c260: 20 28 28 28 62 75 66 66 65 72 5f 70 20 2d 20 62   (((buffer_p - b
c270: 75 66 66 65 72 29 20 2b 20 73 69 7a 65 29 20 3e  uffer) + size) >
c280: 20 6f 66 66 73 65 74 29 20 7b 0a 09 09 09 43 41   offset) {....CA
c290: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c2a0: 46 28 22 45 6e 63 6f 64 65 64 20 73 69 7a 65 20  F("Encoded size 
c2b0: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
c2c0: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61  the amount of da
c2d0: 74 61 20 72 65 61 64 2c 20 64 72 6f 70 70 69 6e  ta read, droppin
c2e0: 67 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  g");.....return(
c2f0: 2d 31 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 65  -1);...}..}...me
c300: 6d 6d 6f 76 65 28 62 75 66 66 65 72 2c 20 62 75  mmove(buffer, bu
c310: 66 66 65 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 0a  ffer_p, size);..
c320: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c330: 49 4e 54 42 55 46 28 22 47 45 54 20 44 41 54 41  INTBUF("GET DATA
c340: 20 72 65 73 75 6c 74 22 2c 20 62 75 66 66 65 72   result", buffer
c350: 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45  , size);...CACKE
c360: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c370: 52 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63  Returning in suc
c380: 63 65 73 73 2c 20 72 65 61 64 20 25 6c 75 20 62  cess, read %lu b
c390: 79 74 65 73 22 2c 20 28 75 6e 73 69 67 6e 65 64  ytes", (unsigned
c3a0: 20 6c 6f 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09   long) size);...
c3b0: 72 65 74 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a  return(size);.}.
c3c0: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
c3d0: 20 2a 20 20 20 20 20 73 73 69 7a 65 5f 74 20 63   *     ssize_t c
c3e0: 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65  ackey_read_buffe
c3f0: 72 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  r(struct cackey_
c400: 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69  slot *slot, unsi
c410: 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65  gned char *buffe
c420: 72 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c  r, size_t count,
c430: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
c440: 5f 6f 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e  _or_v, size_t in
c450: 69 74 69 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20  itial_offset);. 
c460: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
c470: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
c480: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
c490: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
c4a0: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
c4b0: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
c4c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
c4d0: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  er. *         [O
c4e0: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a  UT] Buffer. *. *
c4f0: 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e       size_t coun
c500: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  t. *         Num
c510: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
c520: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a  attempt to read.
c530: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
c540: 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20  ed char t_or_v. 
c550: 2a 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74  *         Select
c560: 20 74 68 65 20 54 2d 62 75 66 66 65 72 20 28 30   the T-buffer (0
c570: 31 29 20 6f 72 20 56 2d 62 75 66 66 65 72 20 28  1) or V-buffer (
c580: 30 32 29 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  02) to read from
c590: 2e 20 20 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  .  . *. *     si
c5a0: 7a 65 5f 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66  ze_t initial_off
c5b0: 73 65 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  set. *         S
c5c0: 70 65 63 69 66 79 20 74 68 65 20 6f 66 66 73 65  pecify the offse
c5d0: 74 20 74 6f 20 62 65 67 69 6e 20 74 68 65 20 72  t to begin the r
c5e0: 65 61 64 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20  ead from. *. *. 
c5f0: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
c600: 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e 63 74  *     This funct
c610: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
c620: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
c630: 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f  actually read, o
c640: 72 20 2d 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20  r -1 on error.. 
c650: 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
c660: 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74    None. *. */.st
c670: 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
c680: 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28  key_read_buffer(
c690: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
c6a0: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
c6b0: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c  ed char *buffer,
c6c0: 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75   size_t count, u
c6d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f  nsigned char t_o
c6e0: 72 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74  r_v, size_t init
c6f0: 69 61 6c 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75  ial_offset) {..u
c700: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e  nsigned char *in
c710: 69 74 5f 62 75 66 66 65 72 3b 0a 09 73 69 7a 65  it_buffer;..size
c720: 5f 74 20 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09  _t init_count;..
c730: 73 69 7a 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74  size_t init_init
c740: 69 61 6c 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69  ial_offset;...si
c750: 7a 65 5f 74 20 6f 66 66 73 65 74 20 3d 20 30 2c  ze_t offset = 0,
c760: 20 6d 61 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78   max_offset, max
c770: 5f 63 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65  _count;..unsigne
c780: 64 20 63 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09  d char cmd[2];..
c790: 75 69 6e 74 31 36 5f 74 20 72 65 73 70 63 6f 64  uint16_t respcod
c7a0: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
c7b0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
c7c0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
c7d0: 22 29 3b 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65  ");...init_buffe
c7e0: 72 20 3d 20 62 75 66 66 65 72 3b 0a 09 69 6e 69  r = buffer;..ini
c7f0: 74 5f 63 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b  t_count = count;
c800: 0a 09 69 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f  ..init_initial_o
c810: 66 66 73 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f  ffset = initial_
c820: 6f 66 66 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66  offset;...max_of
c830: 66 73 65 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d  fset = count;..m
c840: 61 78 5f 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45  ax_count = CACKE
c850: 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66  Y_APDU_MTU;...if
c860: 20 28 74 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26   (t_or_v != 1 &&
c870: 20 74 5f 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a   t_or_v != 2) {.
c880: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c890: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 54  RINTF("Invalid T
c8a0: 20 6f 72 20 56 20 70 61 72 61 6d 65 74 65 72 20   or V parameter 
c8b0: 73 70 65 63 69 66 69 65 64 2c 20 72 65 74 75 72  specified, retur
c8c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
c8d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29  );....return(-1)
c8e0: 3b 0a 09 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20  ;..}...cmd[0] = 
c8f0: 74 5f 6f 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20  t_or_v;...while 
c900: 28 31 29 20 7b 0a 09 09 69 66 20 28 6f 66 66 73  (1) {...if (offs
c910: 65 74 20 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74  et >= max_offset
c920: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
c930: 42 55 47 5f 50 52 49 4e 54 46 28 22 42 75 66 66  BUG_PRINTF("Buff
c940: 65 72 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65  er too small, re
c950: 74 75 72 6e 69 6e 67 20 77 68 61 74 20 77 65 20  turning what we 
c960: 67 6f 74 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72  got...");.....br
c970: 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e  eak;...}....coun
c980: 74 20 3d 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d  t = max_offset -
c990: 20 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 63   offset;...if (c
c9a0: 6f 75 6e 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74  ount > max_count
c9b0: 29 20 7b 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d  ) {....count = m
c9c0: 61 78 5f 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09  ax_count;...}...
c9d0: 09 63 6d 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b  .cmd[1] = count;
c9e0: 0a 0a 09 09 73 65 6e 64 5f 72 65 74 20 3d 20 63  ....send_ret = c
c9f0: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
ca00: 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53  slot, GSCIS_CLAS
ca10: 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52  S_GLOBAL_PLATFOR
ca20: 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 52  M, GSCIS_INSTR_R
ca30: 45 41 44 5f 42 55 46 46 45 52 2c 20 28 28 69 6e  EAD_BUFFER, ((in
ca40: 69 74 69 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f  itial_offset + o
ca50: 66 66 73 65 74 29 20 3e 3e 20 38 29 20 26 20 30  ffset) >> 8) & 0
ca60: 78 66 66 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66  xff, (initial_of
ca70: 66 73 65 74 20 2b 20 6f 66 66 73 65 74 29 20 26  fset + offset) &
ca80: 20 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d   0xff, sizeof(cm
ca90: 64 29 2c 20 63 6d 64 2c 20 30 78 30 30 2c 20 26  d), cmd, 0x00, &
caa0: 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65 72  respcode, buffer
cab0: 20 2b 20 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e   + offset, &coun
cac0: 74 29 3b 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f  t);....if (send_
cad0: 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  ret == CACKEY_PC
cae0: 53 43 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09  SC_E_RETRY) {...
caf0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
cb00: 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64 69  INTF("ADPU Sendi
cb10: 6e 67 20 66 61 69 6c 65 64 2c 20 72 65 74 72 79  ng failed, retry
cb20: 69 6e 67 20 72 65 61 64 20 62 75 66 66 65 72 22  ing read buffer"
cb30: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 61  );.....return(ca
cb40: 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72  ckey_read_buffer
cb50: 28 73 6c 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66  (slot, init_buff
cb60: 65 72 2c 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20  er, init_count, 
cb70: 74 5f 6f 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69  t_or_v, init_ini
cb80: 74 69 61 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09  tial_offset));..
cb90: 09 7d 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72  .}....if (send_r
cba0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
cbb0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20  C_S_OK) {....if 
cbc0: 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30 78 36  (respcode == 0x6
cbd0: 41 38 36 29 20 7b 0a 09 09 09 09 69 66 20 28 6d  A86) {.....if (m
cbe0: 61 78 5f 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b  ax_count == 1) {
cbf0: 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
cc00: 09 7d 0a 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e  .}......max_coun
cc10: 74 20 3d 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20  t = max_count / 
cc20: 32 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  2;......continue
cc30: 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
cc40: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cc50: 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
cc60: 28 29 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  () failed, retur
cc70: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
cc80: 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
cc90: 29 3b 0a 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74  );...}....offset
cca0: 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66   += count;....if
ccb0: 20 28 63 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f   (count < max_co
ccc0: 75 6e 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  unt) {....CACKEY
ccd0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
cce0: 68 6f 72 74 20 72 65 61 64 20 2d 2d 20 63 6f 75  hort read -- cou
ccf0: 6e 74 20 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20  nt = %i, cmd[1] 
cd00: 3d 20 25 69 22 2c 20 28 69 6e 74 29 20 63 6f 75  = %i", (int) cou
cd10: 6e 74 2c 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d  nt, (int) cmd[1]
cd20: 29 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09  );.....break;...
cd30: 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43  }..}..#ifdef CAC
cd40: 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20  KEY_PARANOID.#  
cd50: 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49  ifdef _POSIX_SSI
cd60: 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 66 66 73  ZE_MAX..if (offs
cd70: 65 74 20 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a  et > _POSIX_SSIZ
cd80: 45 5f 4d 41 58 29 20 7b 0a 09 09 43 41 43 4b 45  E_MAX) {...CACKE
cd90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
cda0: 4f 66 66 73 65 74 20 65 78 63 65 65 64 73 20 6d  Offset exceeds m
cdb0: 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
cdc0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
cdd0: 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
cde0: 6f 66 66 73 65 74 20 3d 20 25 6c 75 29 22 2c 20  offset = %lu)", 
cdf0: 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53  (long) _POSIX_SS
ce00: 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e  IZE_MAX, (unsign
ce10: 65 64 20 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29  ed long) offset)
ce20: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
ce30: 0a 09 7d 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  ..}.#  endif.#en
ce40: 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dif...CACKEY_DEB
ce50: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
ce60: 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c  ning in success,
ce70: 20 72 65 61 64 20 25 6c 75 20 62 79 74 65 73 22   read %lu bytes"
ce80: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
ce90: 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 72 65 74  ) offset);...ret
cea0: 75 72 6e 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a  urn(offset);.}..
ceb0: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
cec0: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
ced0: 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
cee0: 70 70 6c 65 74 28 73 74 72 75 63 74 20 63 61 63  pplet(struct cac
cef0: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
cf00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
cf10: 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c  id, size_t aid_l
cf20: 65 6e 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  en);. *. * ARGUM
cf30: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
cf40: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
cf50: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
cf60: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
cf70: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
cf80: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
cf90: 20 2a 61 69 64 0a 20 2a 20 20 20 20 20 20 20 20   *aid. *        
cfa0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
cfb0: 6e 67 20 41 70 70 6c 65 74 20 49 44 20 74 6f 20  ng Applet ID to 
cfc0: 73 65 6c 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20  select. *. *    
cfd0: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a   size_t aid_len.
cfe0: 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65   *         Numbe
cff0: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
d000: 65 20 22 61 69 64 22 20 28 41 70 70 6c 65 74 20  e "aid" (Applet 
d010: 49 44 29 20 70 61 72 61 6d 65 74 65 72 0a 20 2a  ID) parameter. *
d020: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
d030: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
d040: 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20  CSC_S_OK        
d050: 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20   On success. *  
d060: 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45     CACKEY_PCSC_E
d070: 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65  _GENERIC    On e
d080: 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  rror. *. * NOTES
d090: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
d0a0: 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65   */.static cacke
d0b0: 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65 6c  y_ret cackey_sel
d0c0: 65 63 74 5f 61 70 70 6c 65 74 28 73 74 72 75 63  ect_applet(struc
d0d0: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
d0e0: 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  lot, unsigned ch
d0f0: 61 72 20 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20  ar *aid, size_t 
d100: 61 69 64 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20  aid_len) {..int 
d110: 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b  send_ret;...CACK
d120: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d130: 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
d140: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d150: 42 55 46 28 22 53 65 6c 65 63 74 69 6e 67 20 61  BUF("Selecting a
d160: 70 70 6c 65 74 3a 22 2c 20 61 69 64 2c 20 61 69  pplet:", aid, ai
d170: 64 5f 6c 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72  d_len);...send_r
d180: 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
d190: 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
d1a0: 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
d1b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c   GSCIS_INSTR_SEL
d1c0: 45 43 54 2c 20 47 53 43 49 53 5f 50 41 52 41 4d  ECT, GSCIS_PARAM
d1d0: 5f 53 45 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20  _SELECT_APPLET, 
d1e0: 30 78 30 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61  0x00, aid_len, a
d1f0: 69 64 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20  id, 0x00, NULL, 
d200: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  NULL, NULL);...i
d210: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
d220: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54  ACKEY_PCSC_E_RET
d230: 52 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  RY) {...CACKEY_D
d240: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50  EBUG_PRINTF("ADP
d250: 55 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64  U Sending failed
d260: 2c 20 72 65 74 72 79 69 6e 67 20 73 65 6c 65 63  , retrying selec
d270: 74 20 61 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72  t applet");....r
d280: 65 74 75 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c  eturn(cackey_sel
d290: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
d2a0: 20 61 69 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b   aid, aid_len));
d2b0: 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72  ..}...if (send_r
d2c0: 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
d2d0: 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  C_S_OK) {...CACK
d2e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d2f0: 22 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "Failed to open 
d300: 61 70 70 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e  applet, returnin
d310: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
d320: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
d330: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
d340: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
d350: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 63  BUG_PRINTF("Succ
d360: 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63 74 65  essfully selecte
d370: 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75  d file");...retu
d380: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
d390: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
d3a0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
d3b0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
d3c0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
d3d0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
d3e0: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
d3f0: 65 66 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ef);. *. * ARGUM
d400: 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74 72 75  ENTS. *     stru
d410: 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
d420: 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20  slot. *         
d430: 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d  Slot to send com
d440: 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20  mands to. *. *  
d450: 20 20 20 75 69 6e 74 31 36 5f 74 20 65 66 0a 20     uint16_t ef. 
d460: 2a 20 20 20 20 20 20 20 20 20 45 6c 65 6d 65 6e  *         Elemen
d470: 74 61 6c 20 46 69 6c 65 20 74 6f 20 73 65 6c 65  tal File to sele
d480: 63 74 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ct. *. * RETURN 
d490: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
d4a0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
d4b0: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
d4c0: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
d4d0: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
d4e0: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
d4f0: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
d500: 73 20 73 65 6c 65 63 74 73 20 61 6e 20 45 6c 65  s selects an Ele
d510: 6d 65 6e 74 61 72 79 20 46 69 6c 65 20 28 45 46  mentary File (EF
d520: 29 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 72  ) under the curr
d530: 65 6e 74 6c 79 20 73 65 6c 65 63 74 65 64 0a 20  ently selected. 
d540: 2a 20 20 20 20 20 44 65 64 69 63 61 74 65 64 20  *     Dedicated 
d550: 46 69 6c 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20  File (DF). *. * 
d560: 20 20 20 20 54 79 70 69 63 61 6c 6c 79 20 74 68      Typically th
d570: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  is is called aft
d580: 65 72 20 73 65 6c 65 63 74 69 6e 67 20 74 68 65  er selecting the
d590: 20 63 6f 72 72 65 63 74 20 41 70 70 6c 65 74 20   correct Applet 
d5a0: 28 75 73 69 6e 67 0a 20 2a 20 20 20 20 20 63 61  (using. *     ca
d5b0: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
d5c0: 65 74 29 20 66 6f 72 20 56 4d 20 63 61 72 64 73  et) for VM cards
d5d0: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
d5e0: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
d5f0: 5f 73 65 6c 65 63 74 5f 66 69 6c 65 28 73 74 72  _select_file(str
d600: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
d610: 2a 73 6c 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20  *slot, uint16_t 
d620: 65 66 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20  ef) {..unsigned 
d630: 63 68 61 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b  char fid_buf[2];
d640: 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a  ..int send_ret;.
d650: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
d660: 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
d670: 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ;.../* Open the 
d680: 65 6c 65 6d 65 6e 74 61 72 79 20 66 69 6c 65 20  elementary file 
d690: 2a 2f 0a 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d  */..fid_buf[0] =
d6a0: 20 28 65 66 20 3e 3e 20 38 29 20 26 20 30 78 66   (ef >> 8) & 0xf
d6b0: 66 3b 0a 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d  f;..fid_buf[1] =
d6c0: 20 65 66 20 26 20 30 78 66 66 3b 0a 0a 09 43 41   ef & 0xff;...CA
d6d0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
d6e0: 46 28 22 53 65 6c 65 63 74 69 6e 67 20 66 69 6c  F("Selecting fil
d6f0: 65 3a 20 25 30 34 6c 78 22 2c 20 28 75 6e 73 69  e: %04lx", (unsi
d700: 67 6e 65 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a  gned long) ef);.
d710: 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
d720: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
d730: 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
d740: 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
d750: 4e 53 54 52 5f 53 45 4c 45 43 54 2c 20 30 78 30  NSTR_SELECT, 0x0
d760: 32 2c 20 30 78 30 43 2c 20 73 69 7a 65 6f 66 28  2, 0x0C, sizeof(
d770: 66 69 64 5f 62 75 66 29 2c 20 66 69 64 5f 62 75  fid_buf), fid_bu
d780: 66 2c 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e  f, 0x00, NULL, N
d790: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  ULL, NULL);..if 
d7a0: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
d7b0: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
d7c0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d7d0: 50 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74  PRINTF("Failed t
d7e0: 6f 20 6f 70 65 6e 20 66 69 6c 65 2c 20 72 65 74  o open file, ret
d7f0: 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
d800: 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  e");....return(C
d810: 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e  ACKEY_PCSC_E_GEN
d820: 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  ERIC);..}...CACK
d830: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
d840: 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 73 65  "Successfully se
d850: 6c 65 63 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a  lected file");..
d860: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
d870: 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  CSC_S_OK);.}../*
d880: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
d890: 20 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f      void cackey_
d8a0: 66 72 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20  free_tlv(struct 
d8b0: 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74  cackey_tlv_entit
d8c0: 79 20 2a 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20  y *root);. *. * 
d8d0: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
d8e0: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74   struct cackey_t
d8f0: 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a  lv_entity *root.
d900: 20 2a 20 20 20 20 20 20 20 20 20 52 6f 6f 74 20   *         Root 
d910: 6f 66 20 74 68 65 20 54 4c 56 20 6c 69 73 74 20  of the TLV list 
d920: 74 6f 20 73 74 61 72 74 20 66 72 65 65 69 6e 67  to start freeing
d930: 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
d940: 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a  LUE. *     None.
d950: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
d960: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
d970: 20 66 72 65 65 73 20 74 68 65 20 54 4c 56 20 6c   frees the TLV l
d980: 69 6e 6b 65 64 20 6c 69 73 74 65 64 20 72 65 74  inked listed ret
d990: 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20  urned from. *   
d9a0: 20 20 22 63 61 63 6b 65 79 5f 72 65 61 64 5f 74    "cackey_read_t
d9b0: 6c 76 22 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  lv". *. */.stati
d9c0: 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72  c void cackey_fr
d9d0: 65 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ee_tlv(struct ca
d9e0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
d9f0: 2a 72 6f 6f 74 29 20 7b 0a 09 73 74 72 75 63 74  *root) {..struct
da00: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
da10: 74 79 20 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b  ty *curr, *next;
da20: 0a 0a 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
da30: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b  ULL) {...return;
da40: 0a 09 7d 0a 0a 09 66 6f 72 20 28 63 75 72 72 20  ..}...for (curr 
da50: 3d 20 72 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75  = root; curr; cu
da60: 72 72 20 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e  rr = next) {...n
da70: 65 78 74 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78  ext = curr->_nex
da80: 74 3b 0a 0a 09 09 73 77 69 74 63 68 20 28 63 75  t;....switch (cu
da90: 72 72 2d 3e 74 61 67 29 20 7b 0a 09 09 09 63 61  rr->tag) {....ca
daa0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52  se GSCIS_TAG_ACR
dab0: 5f 54 41 42 4c 45 3a 0a 09 09 09 63 61 73 65 20  _TABLE:....case 
dac0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46  GSCIS_TAG_CERTIF
dad0: 49 43 41 54 45 3a 0a 09 09 09 09 69 66 20 28 63  ICATE:.....if (c
dae0: 75 72 72 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09  urr->value) {...
daf0: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
db00: 6c 75 65 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09  lue);.....}.....
db10: 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 47  break;....case G
db20: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
db30: 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72 2d 3e  :.....if (curr->
db40: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 20 7b  value_cardurl) {
db50: 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72 2d  ......free(curr-
db60: 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b  >value_cardurl);
db70: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b  .....}.....break
db80: 3b 0a 09 09 7d 0a 0a 09 09 66 72 65 65 28 63 75  ;...}....free(cu
db90: 72 72 29 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  rr);..}...return
dba0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
dbb0: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
dbc0: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
dbd0: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
dbe0: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
dbf0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
dc00: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
dc10: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  *. */.static str
dc20: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
dc30: 6e 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65  ntity *cackey_re
dc40: 61 64 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61  ad_tlv(struct ca
dc50: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
dc60: 20 7b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65   {..struct cacke
dc70: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75  y_tlv_entity *cu
dc80: 72 72 5f 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74  rr_entity, *root
dc90: 20 3d 20 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d   = NULL, *last =
dca0: 20 4e 55 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64   NULL;..unsigned
dcb0: 20 63 68 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32   char tlen_buf[2
dcc0: 5d 2c 20 74 76 61 6c 5f 62 75 66 5b 31 30 32 34  ], tval_buf[1024
dcd0: 5d 2c 20 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *tval;..unsig
dce0: 6e 65 64 20 63 68 61 72 20 76 6c 65 6e 5f 62 75  ned char vlen_bu
dcf0: 66 5b 32 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38  f[2], vval_buf[8
dd00: 31 39 32 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e  192], *vval;..un
dd10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
dd20: 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  buf;..unsigned l
dd30: 6f 6e 67 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09  ong tmpbuflen;..
dd40: 73 73 69 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c  ssize_t tlen, vl
dd50: 65 6e 3b 0a 09 73 73 69 7a 65 5f 74 20 72 65 61  en;..ssize_t rea
dd60: 64 5f 72 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f  d_ret;..size_t o
dd70: 66 66 73 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66  ffset_t = 0, off
dd80: 73 65 74 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69  set_v = 0;..unsi
dd90: 67 6e 65 64 20 63 68 61 72 20 74 61 67 3b 0a 09  gned char tag;..
dda0: 73 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23  size_t length;.#
ddb0: 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a  ifdef HAVE_LIBZ.
ddc0: 09 69 6e 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f  .int uncompress_
ddd0: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ret;.#endif...CA
dde0: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ddf0: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
de00: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
de10: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
de20: 6f 74 2c 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, tlen_buf, si
de30: 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20  zeof(tlen_buf), 
de40: 31 2c 20 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69  1, offset_t);..i
de50: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
de60: 69 7a 65 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29  izeof(tlen_buf))
de70: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
de80: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
de90: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
dea0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
deb0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
dec0: 09 7d 0a 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65  .}...tlen = (tle
ded0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
dee0: 20 74 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   tlen_buf[0];...
def0: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
df00: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
df10: 6f 74 2c 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69  ot, vlen_buf, si
df20: 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20  zeof(vlen_buf), 
df30: 32 2c 20 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69  2, offset_v);..i
df40: 66 20 28 72 65 61 64 5f 72 65 74 20 21 3d 20 73  f (read_ret != s
df50: 69 7a 65 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29  izeof(vlen_buf))
df60: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
df70: 47 5f 50 52 49 4e 54 46 28 22 52 65 61 64 20 66  G_PRINTF("Read f
df80: 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e 67  ailed, returning
df90: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
dfa0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
dfb0: 09 7d 0a 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65  .}...vlen = (vle
dfc0: 6e 5f 62 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c  n_buf[1] << 8) |
dfd0: 20 76 6c 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09   vlen_buf[0];...
dfe0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
dff0: 4e 54 46 28 22 54 61 67 20 4c 65 6e 67 74 68 20  NTF("Tag Length 
e000: 3d 20 25 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e  = %lu, Value Len
e010: 67 74 68 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73  gth = %lu", (uns
e020: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e  igned long) tlen
e030: 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
e040: 29 20 76 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65  ) vlen);...offse
e050: 74 5f 74 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65  t_t += 2;..offse
e060: 74 5f 76 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28  t_v += 2;...if (
e070: 74 6c 65 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76  tlen > sizeof(tv
e080: 61 6c 5f 62 75 66 29 29 20 7b 0a 09 09 43 41 43  al_buf)) {...CAC
e090: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e0a0: 28 22 54 61 67 20 6c 65 6e 67 74 68 20 69 73 20  ("Tag length is 
e0b0: 74 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72  too large, retur
e0c0: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22  ning in failure"
e0d0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
e0e0: 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65  L);..}...if (vle
e0f0: 6e 20 3e 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f  n > sizeof(vval_
e100: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
e110: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 56  _DEBUG_PRINTF("V
e120: 61 6c 75 65 20 6c 65 6e 67 74 68 20 69 73 20 74  alue length is t
e130: 6f 6f 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e  oo large, return
e140: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e150: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e160: 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74  );..}...read_ret
e170: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
e180: 75 66 66 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c  uffer(slot, tval
e190: 5f 62 75 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f  _buf, tlen, 1, o
e1a0: 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28 72  ffset_t);..if (r
e1b0: 65 61 64 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29  ead_ret != tlen)
e1c0: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e1d0: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
e1e0: 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20   to read entire 
e1f0: 54 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  T-buffer, return
e200: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e210: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e220: 29 3b 0a 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74  );..}...read_ret
e230: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 62   = cackey_read_b
e240: 75 66 66 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c  uffer(slot, vval
e250: 5f 62 75 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f  _buf, vlen, 2, o
e260: 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28 72  ffset_v);..if (r
e270: 65 61 64 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29  ead_ret != vlen)
e280: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
e290: 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
e2a0: 20 74 6f 20 72 65 61 64 20 65 6e 74 69 72 65 20   to read entire 
e2b0: 56 2d 62 75 66 66 65 72 2c 20 72 65 74 75 72 6e  V-buffer, return
e2c0: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
e2d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
e2e0: 29 3b 0a 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74  );..}...tval = t
e2f0: 76 61 6c 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d  val_buf;..vval =
e300: 20 76 76 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c   vval_buf;..whil
e310: 65 20 28 74 6c 65 6e 20 3e 20 30 20 26 26 20 76  e (tlen > 0 && v
e320: 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 09 74 61 67  len > 0) {...tag
e330: 20 3d 20 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c   = *tval;...tval
e340: 2b 2b 3b 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09  ++;...tlen--;...
e350: 09 69 66 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78  .if (*tval == 0x
e360: 66 66 29 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20  ff) {....length 
e370: 3d 20 28 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29  = (tval[2] << 8)
e380: 20 7c 20 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74   | tval[1];....t
e390: 76 61 6c 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65  val += 3;....tle
e3a0: 6e 20 2d 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65  n -= 3;...} else
e3b0: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a   {....length = *
e3c0: 74 76 61 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b  tval;....tval++;
e3d0: 0a 09 09 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a  ....tlen--;...}.
e3e0: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e3f0: 50 52 49 4e 54 46 28 22 54 61 67 3a 20 25 73 20  PRINTF("Tag: %s 
e400: 28 25 30 32 78 29 22 2c 20 43 41 43 4b 45 59 5f  (%02x)", CACKEY_
e410: 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54  DEBUG_FUNC_TAG_T
e420: 4f 5f 53 54 52 28 74 61 67 29 2c 20 28 75 6e 73  O_STR(tag), (uns
e430: 69 67 6e 65 64 20 69 6e 74 29 20 74 61 67 29 3b  igned int) tag);
e440: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
e450: 50 52 49 4e 54 42 55 46 28 22 56 61 6c 75 65 3a  PRINTBUF("Value:
e460: 22 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  ", vval, length)
e470: 3b 0a 0a 09 09 63 75 72 72 5f 65 6e 74 69 74 79  ;....curr_entity
e480: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63   = NULL;...switc
e490: 68 20 28 74 61 67 29 20 7b 0a 09 09 09 63 61 73  h (tag) {....cas
e4a0: 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  e GSCIS_TAG_CARD
e4b0: 55 52 4c 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e  URL:.....curr_en
e4c0: 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  tity = malloc(si
e4d0: 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74  zeof(*curr_entit
e4e0: 79 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  y));.....curr_en
e4f0: 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64  tity->value_card
e500: 75 72 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  url = malloc(siz
e510: 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79  eof(*curr_entity
e520: 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 29  ->value_cardurl)
e530: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  );......memcpy(c
e540: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75  urr_entity->valu
e550: 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
e560: 76 76 61 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75  vval, 5);.....cu
e570: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
e580: 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70  _cardurl->apptyp
e590: 65 20 3d 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09  e = vval[5];....
e5a0: 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61  .curr_entity->va
e5b0: 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
e5c0: 65 63 74 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d  ectid = (vval[6]
e5d0: 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d   << 8) | vval[7]
e5e0: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
e5f0: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
e600: 2d 3e 61 70 70 69 64 20 3d 20 28 76 76 61 6c 5b  ->appid = (vval[
e610: 38 5d 20 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b  8] << 8) | vval[
e620: 39 5d 3b 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e  9];......curr_en
e630: 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b  tity->tag = tag;
e640: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
e650: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
e660: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
e670: 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41 43  ase GSCIS_TAG_AC
e680: 52 5f 54 41 42 4c 45 3a 0a 09 09 09 09 63 75 72  R_TABLE:.....cur
e690: 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f  r_entity = mallo
e6a0: 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65  c(sizeof(*curr_e
e6b0: 6e 74 69 74 79 29 29 3b 0a 09 09 09 09 74 6d 70  ntity));.....tmp
e6c0: 62 75 66 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e  buf = malloc(len
e6d0: 67 74 68 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70  gth);......memcp
e6e0: 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20  y(tmpbuf, vval, 
e6f0: 6c 65 6e 67 74 68 29 3b 0a 0a 09 09 09 09 63 75  length);......cu
e700: 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d  rr_entity->tag =
e710: 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f 65   tag;.....curr_e
e720: 6e 74 69 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20  ntity->length = 
e730: 6c 65 6e 67 74 68 3b 0a 09 09 09 09 63 75 72 72  length;.....curr
e740: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d  _entity->value =
e750: 20 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72   tmpbuf;.....cur
e760: 72 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20  r_entity->_next 
e770: 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65  = NULL;......bre
e780: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
e790: 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41 54  S_TAG_CERTIFICAT
e7a0: 45 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  E:.....curr_enti
e7b0: 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ty = malloc(size
e7c0: 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29  of(*curr_entity)
e7d0: 29 3b 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  );..#ifdef HAVE_
e7e0: 4c 49 42 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c  LIBZ.....tmpbufl
e7f0: 65 6e 20 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b  en = length * 2;
e800: 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
e810: 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b  lloc(tmpbuflen);
e820: 0a 0a 09 09 09 09 75 6e 63 6f 6d 70 72 65 73 73  ......uncompress
e830: 5f 72 65 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73  _ret = uncompres
e840: 73 28 74 6d 70 62 75 66 2c 20 26 74 6d 70 62 75  s(tmpbuf, &tmpbu
e850: 66 6c 65 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67  flen, vval, leng
e860: 74 68 29 3b 0a 09 09 09 09 69 66 20 28 75 6e 63  th);.....if (unc
e870: 6f 6d 70 72 65 73 73 5f 72 65 74 20 21 3d 20 5a  ompress_ret != Z
e880: 5f 4f 4b 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  _OK) {......CACK
e890: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
e8a0: 22 46 61 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d  "Failed to decom
e8b0: 70 72 65 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73  press, uncompres
e8c0: 73 28 29 20 72 65 74 75 72 6e 65 64 20 25 69 20  s() returned %i 
e8d0: 2d 2d 20 72 65 73 6f 72 74 69 6e 67 20 74 6f 20  -- resorting to 
e8e0: 64 69 72 65 63 74 20 63 6f 70 79 22 2c 20 75 6e  direct copy", un
e8f0: 63 6f 6d 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a  compress_ret);..
e900: 09 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
e910: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65   length;......me
e920: 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61  mcpy(tmpbuf, vva
e930: 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09  l, length);.....
e940: 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
e950: 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 44 65  BUG_PRINTBUF("De
e960: 63 6f 6d 70 72 65 73 73 65 64 20 74 6f 3a 22 2c  compressed to:",
e970: 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75 66 6c   tmpbuf, tmpbufl
e980: 65 6e 29 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43  en);.#else.....C
e990: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
e9a0: 54 46 28 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42  TF("Missing ZLIB
e9b0: 20 53 75 70 70 6f 72 74 2c 20 74 68 69 73 20 63   Support, this c
e9c0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 6c 69  ertificate is li
e9d0: 6b 65 6c 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22  kely useless..."
e9e0: 29 3b 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65  );......tmpbufle
e9f0: 6e 20 3d 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09  n = length;.....
ea00: 6d 65 6d 63 70 79 28 74 6d 70 62 75 66 2c 20 76  memcpy(tmpbuf, v
ea10: 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65  val, length);.#e
ea20: 6e 64 69 66 0a 0a 09 09 09 09 63 75 72 72 5f 65  ndif......curr_e
ea30: 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61 67  ntity->tag = tag
ea40: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
ea50: 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62  y->length = tmpb
ea60: 75 66 6c 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f  uflen;.....curr_
ea70: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20  entity->value = 
ea80: 74 6d 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72  tmpbuf;.....curr
ea90: 5f 65 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d  _entity->_next =
eaa0: 20 4e 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61   NULL;......brea
eab0: 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49 53  k;....case GSCIS
eac0: 5f 54 41 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09  _TAG_PKCS15:....
ead0: 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d  .curr_entity = m
eae0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75  alloc(sizeof(*cu
eaf0: 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09  rr_entity));....
eb00: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74  ..curr_entity->t
eb10: 61 67 20 3d 20 74 61 67 3b 0a 09 09 09 09 63 75  ag = tag;.....cu
eb20: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
eb30: 5f 62 79 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b  _byte = vval[0];
eb40: 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79  .....curr_entity
eb50: 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a  ->_next = NULL;.
eb60: 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a  .....break;...}.
eb70: 0a 09 09 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74  ...vval += lengt
eb80: 68 3b 0a 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e  h;...vlen -= len
eb90: 67 74 68 3b 0a 0a 09 09 69 66 20 28 63 75 72 72  gth;....if (curr
eba0: 5f 65 6e 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29  _entity != NULL)
ebb0: 20 7b 0a 09 09 09 69 66 20 28 72 6f 6f 74 20 3d   {....if (root =
ebc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f  = NULL) {.....ro
ebd0: 6f 74 20 3d 20 63 75 72 72 5f 65 6e 74 69 74 79  ot = curr_entity
ebe0: 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c  ;....}.....if (l
ebf0: 61 73 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ast != NULL) {..
ec00: 09 09 09 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d  ...last->_next =
ec10: 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09   curr_entity;...
ec20: 09 7d 0a 0a 09 09 09 6c 61 73 74 20 3d 20 63 75  .}.....last = cu
ec30: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09  rr_entity;...}..
ec40: 7d 0a 0a 09 72 65 74 75 72 6e 28 72 6f 6f 74 29  }...return(root)
ec50: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
ec60: 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
ec70: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
ec80: 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
ec90: 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
eca0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
ecb0: 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
ecc0: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  *. */.static voi
ecd0: 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  d cackey_free_ce
ece0: 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b 65  rts(struct cacke
ecf0: 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
ed00: 2a 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63  *start, size_t c
ed10: 6f 75 6e 74 2c 20 69 6e 74 20 66 72 65 65 5f 73  ount, int free_s
ed20: 74 61 72 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20  tart) {..size_t 
ed30: 69 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74  idx;...if (start
ed40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65   == NULL) {...re
ed50: 74 75 72 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  turn;..}...for (
ed60: 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 63  idx = 0; idx < c
ed70: 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  ount; idx++) {..
ed80: 09 69 66 20 28 73 74 61 72 74 5b 69 64 78 5d 2e  .if (start[idx].
ed90: 63 65 72 74 69 66 69 63 61 74 65 29 20 7b 0a 09  certificate) {..
eda0: 09 09 66 72 65 65 28 73 74 61 72 74 5b 69 64 78  ..free(start[idx
edb0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 29 3b 0a  ].certificate);.
edc0: 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65  ..}..}...if (fre
edd0: 65 5f 73 74 61 72 74 29 20 7b 0a 09 09 66 72 65  e_start) {...fre
ede0: 65 28 73 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72  e(start);..}...r
edf0: 65 74 75 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63  eturn;.}..static
ee00: 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70   struct cackey_p
ee10: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 61  csc_identity *ca
ee20: 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
ee30: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
ee40: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 64 65 73  sc_identity *des
ee50: 74 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  t, struct cackey
ee60: 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
ee70: 73 74 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f  start, size_t co
ee80: 75 6e 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69  unt) {..size_t i
ee90: 64 78 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20  dx;...if (start 
eea0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
eeb0: 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
eec0: 69 66 20 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c  if (dest == NULL
eed0: 29 20 7b 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c  ) {...dest = mal
eee0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 64 65 73 74  loc(sizeof(*dest
eef0: 29 20 2a 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ) * count);..}..
ef00: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
ef10: 64 78 20 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b  dx < count; idx+
ef20: 2b 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 64 65  +) {...memcpy(de
ef30: 73 74 5b 69 64 78 5d 2e 61 70 70 6c 65 74 2c 20  st[idx].applet, 
ef40: 73 74 61 72 74 5b 69 64 78 5d 2e 61 70 70 6c 65  start[idx].apple
ef50: 74 2c 20 73 69 7a 65 6f 66 28 64 65 73 74 5b 69  t, sizeof(dest[i
ef60: 64 78 5d 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  dx].applet));...
ef70: 64 65 73 74 5b 69 64 78 5d 2e 66 69 6c 65 20 3d  dest[idx].file =
ef80: 20 73 74 61 72 74 5b 69 64 78 5d 2e 66 69 6c 65   start[idx].file
ef90: 3b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 65  ;...dest[idx].ce
efa0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
efb0: 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72 74 69  start[idx].certi
efc0: 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09 09 64 65  ficate_len;...de
efd0: 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69 7a 65 20  st[idx].keysize 
efe0: 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 6b 65 79  = start[idx].key
eff0: 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74 5b 69 64  size;....dest[id
f000: 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65 20 3d  x].certificate =
f010: 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b 69 64 78   malloc(dest[idx
f020: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
f030: 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28 64 65 73  n);...memcpy(des
f040: 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61  t[idx].certifica
f050: 74 65 2c 20 73 74 61 72 74 5b 69 64 78 5d 2e 63  te, start[idx].c
f060: 65 72 74 69 66 69 63 61 74 65 2c 20 64 65 73 74  ertificate, dest
f070: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
f080: 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 72 65 74  e_len);..}...ret
f090: 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a 0a 2f 2a  urn(dest);.}../*
f0a0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
f0b0: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
f0c0: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
f0d0: 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
f0e0: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
f0f0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
f100: 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
f110: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
f120: 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
f130: 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 63  y *cackey_read_c
f140: 65 72 74 73 28 73 74 72 75 63 74 20 63 61 63 6b  erts(struct cack
f150: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 73  ey_slot *slot, s
f160: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
f170: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 65 72 74  c_identity *cert
f180: 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  s, unsigned long
f190: 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73 74 72 75   *count) {..stru
f1a0: 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
f1b0: 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64  dentity *curr_id
f1c0: 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
f1d0: 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 63 63 63  _tlv_entity *ccc
f1e0: 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75 72 72 2c  _tlv, *ccc_curr,
f1f0: 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61 70 70 5f   *app_tlv, *app_
f200: 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e 65 64 20  curr;..unsigned 
f210: 63 68 61 72 20 63 63 63 5f 61 69 64 5b 5d 20 3d  char ccc_aid[] =
f220: 20 7b 47 53 43 49 53 5f 41 49 44 5f 43 43 43 7d   {GSCIS_AID_CCC}
f230: 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d 20 7b 4e  , piv_aid[] = {N
f240: 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 50 49  ISTSP800_73_3_PI
f250: 56 5f 41 49 44 7d 3b 0a 09 75 6e 73 69 67 6e 65  V_AID};..unsigne
f260: 64 20 63 68 61 72 20 2a 70 69 76 5f 6f 69 64 2c  d char *piv_oid,
f270: 20 70 69 76 5f 6f 69 64 5f 70 69 76 61 75 74 68   piv_oid_pivauth
f280: 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38 30 30 5f  [] = {NISTSP800_
f290: 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48  73_3_OID_PIVAUTH
f2a0: 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69 67 6e 61  }, piv_oid_signa
f2b0: 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53 54 53 50  ture[] = {NISTSP
f2c0: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
f2d0: 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f 6f 69 64  NATURE}, piv_oid
f2e0: 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b 4e 49 53  _keymgt[] = {NIS
f2f0: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
f300: 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73 69 67 6e  KEYMGT};..unsign
f310: 65 64 20 63 68 61 72 20 63 75 72 72 5f 61 69 64  ed char curr_aid
f320: 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  [7];..unsigned c
f330: 68 61 72 20 62 75 66 66 65 72 5b 38 31 39 32 5d  har buffer[8192]
f340: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
f350: 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a 09 63 61   outidx = 0;..ca
f360: 63 6b 65 79 5f 72 65 74 20 74 72 61 6e 73 61 63  ckey_ret transac
f370: 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73 69 7a 65  tion_ret;..ssize
f380: 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a 09 69 6e  _t read_ret;..in
f390: 74 20 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c  t certs_resizabl
f3a0: 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f 72 65 74  e;..int send_ret
f3b0: 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b 0a 09 69  , select_ret;..i
f3c0: 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70 69 76 20  nt piv_key, piv 
f3d0: 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78 3b 0a 0a  = 0;..int idx;..
f3e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
f3f0: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
f400: 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20 3d 3d 20  ...if (count == 
f410: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
f420: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
f430: 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 72 65  ount is NULL, re
f440: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
f450: 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  re");....return(
f460: 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
f470: 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  certs != NULL) {
f480: 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74 20 3d 3d  ...if (*count ==
f490: 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f   0) {....CACKEY_
f4a0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
f4b0: 71 75 65 73 74 65 64 20 77 65 20 72 65 74 75 72  quested we retur
f4c0: 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20 73 68 6f  n 0 objects, sho
f4d0: 72 74 2d 63 69 72 63 75 69 74 22 29 3b 0a 0a 09  rt-circuit");...
f4e0: 09 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b  ..return(certs);
f4f0: 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28 21 73  ...}..}...if (!s
f500: 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73 65 74 29  lot->slot_reset)
f510: 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74 2d 3e 63   {...if (slot->c
f520: 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09  ached_certs) {..
f530: 09 09 69 66 20 28 63 65 72 74 73 20 3d 3d 20 4e  ..if (certs == N
f540: 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65 72 74 73  ULL) {.....certs
f550: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
f560: 28 2a 63 65 72 74 73 29 20 2a 20 73 6c 6f 74 2d  (*certs) * slot-
f570: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
f580: 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f 75 6e 74  unt);.....*count
f590: 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f   = slot->cached_
f5a0: 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 0a 09 09  certs_count;....
f5b0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69 66  .} else {.....if
f5c0: 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c 6f 74 2d   (*count > slot-
f5d0: 3e 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63 6f  >cached_certs_co
f5e0: 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a 63 6f 75  unt) {......*cou
f5f0: 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68 65  nt = slot->cache
f600: 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a 09  d_certs_count;..
f610: 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 63 61  ...}....}.....ca
f620: 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28  ckey_copy_certs(
f630: 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63  certs, slot->cac
f640: 68 65 64 5f 63 65 72 74 73 2c 20 2a 63 6f 75 6e  hed_certs, *coun
f650: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 63  t);.....return(c
f660: 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  erts);...}..}...
f670: 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64  if (slot->cached
f680: 5f 63 65 72 74 73 29 20 7b 0a 09 09 63 61 63 6b  _certs) {...cack
f690: 65 79 5f 66 72 65 65 5f 63 65 72 74 73 28 73 6c  ey_free_certs(sl
f6a0: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
f6b0: 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63  , slot->cached_c
f6c0: 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a  erts_count, 1);.
f6d0: 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f  ...slot->cached_
f6e0: 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  certs = NULL;..}
f6f0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61 20 53 6d  .../* Begin a Sm
f700: 61 72 74 43 61 72 64 20 74 72 61 6e 73 61 63 74  artCard transact
f710: 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73 61 63 74  ion */..transact
f720: 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  ion_ret = cackey
f730: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
f740: 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 74  on(slot);..if (t
f750: 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65 74 20 21  ransaction_ret !
f760: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
f770: 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
f780: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61  EBUG_PRINTF("Una
f790: 62 6c 65 20 62 65 67 69 6e 20 74 72 61 6e 73 61  ble begin transa
f7a0: 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e 69 6e 67  ction, returning
f7b0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
f7c0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
f7d0: 09 7d 0a 0a 09 69 66 20 28 63 65 72 74 73 20 3d  .}...if (certs =
f7e0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 65 72 74  = NULL) {...cert
f7f0: 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  s = malloc(sizeo
f800: 66 28 2a 63 65 72 74 73 29 20 2a 20 35 29 3b 0a  f(*certs) * 5);.
f810: 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b 0a 09 09  ..*count = 5;...
f820: 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65 20  certs_resizable 
f830: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  = 1;..} else {..
f840: 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  .certs_resizable
f850: 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65   = 0;..}.../* Se
f860: 6c 65 63 74 20 74 68 65 20 43 43 43 20 41 70 70  lect the CCC App
f870: 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74  let */..send_ret
f880: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74   = cackey_select
f890: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 63  _applet(slot, cc
f8a0: 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  c_aid, sizeof(cc
f8b0: 63 5f 61 69 64 29 29 3b 0a 09 69 66 20 28 73 65  c_aid));..if (se
f8c0: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
f8d0: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
f8e0: 2f 2a 20 54 72 79 20 50 49 56 20 61 70 70 6c 69  /* Try PIV appli
f8f0: 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73 65 6e 64  cation */...send
f900: 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
f910: 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
f920: 2c 20 70 69 76 5f 61 69 64 2c 20 73 69 7a 65 6f  , piv_aid, sizeo
f930: 66 28 70 69 76 5f 61 69 64 29 29 3b 0a 09 09 69  f(piv_aid));...i
f940: 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43  f (send_ret == C
f950: 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
f960: 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
f970: 55 47 5f 50 52 49 4e 54 46 28 22 57 65 20 68 61  UG_PRINTF("We ha
f980: 76 65 20 61 20 50 49 56 20 63 61 72 64 20 2d 2d  ve a PIV card --
f990: 20 6e 6f 74 20 75 73 69 6e 67 20 74 68 65 20 43   not using the C
f9a0: 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70 72 65 2d  CC, pulling pre-
f9b0: 73 65 6c 65 63 74 65 64 20 6b 65 79 73 22 29 3b  selected keys");
f9c0: 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b 0a 09 09  .....piv = 1;...
f9d0: 7d 20 65 6c 73 65 20 7b 0a 0a 09 09 09 43 41 43  } else {.....CAC
f9e0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f9f0: 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65 6c 65  ("Unable to sele
fa00: 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c 20 72  ct CCC Applet, r
fa10: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
fa20: 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20 54 65  ure");...../* Te
fa30: 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72  rminate SmartCar
fa40: 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  d Transaction */
fa50: 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  ....cackey_end_t
fa60: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
fa70: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e 55 4c  ;.....return(NUL
fa80: 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  L);...}..}...if 
fa90: 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20 28 69  (piv) {...for (i
faa0: 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 33 3b  dx = 0; idx < 3;
fab0: 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73 77 69   idx++) {....swi
fac0: 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09 09 09  tch (idx) {.....
fad0: 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70 69 76  case 0:......piv
fae0: 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64 5f 70  _oid = piv_oid_p
faf0: 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70 69 76  ivauth;......piv
fb00: 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38 30 30  _key = NISTSP800
fb10: 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41 55 54  _78_3_KEY_PIVAUT
fb20: 48 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  H;......break;..
fb30: 09 09 09 63 61 73 65 20 31 3a 0a 09 09 09 09 09  ...case 1:......
fb40: 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69  piv_oid = piv_oi
fb50: 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a 09 09 09  d_signature;....
fb60: 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54  ..piv_key = NIST
fb70: 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 53  SP800_78_3_KEY_S
fb80: 49 47 4e 41 54 55 52 45 3b 0a 09 09 09 09 09 62  IGNATURE;......b
fb90: 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65 20 32  reak;.....case 2
fba0: 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64 20 3d  :......piv_oid =
fbb0: 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67 74 3b   piv_oid_keymgt;
fbc0: 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20  ......piv_key = 
fbd0: 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b  NISTSP800_78_3_K
fbe0: 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09 09 09  EY_KEYMGT;......
fbf0: 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09  break;....}.....
fc00: 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  read_ret = cacke
fc10: 79 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f 74 2c  y_get_data(slot,
fc20: 20 62 75 66 66 65 72 2c 20 73 69 7a 65 6f 66 28   buffer, sizeof(
fc30: 62 75 66 66 65 72 29 2c 20 70 69 76 5f 6f 69 64  buffer), piv_oid
fc40: 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 61 64 5f  );.....if (read_
fc50: 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09 09 09  ret <= 0) {.....
fc60: 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a  continue;....}..
fc70: 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 65  ...curr_id = &ce
fc80: 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09 09 09  rts[outidx];....
fc90: 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09 63 75  outidx++;.....cu
fca0: 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d  rr_id->keysize =
fcb0: 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f 69 64 2d   -1;....curr_id-
fcc0: 3e 66 69 6c 65 20 3d 20 30 78 46 46 46 46 3b 0a  >file = 0xFFFF;.
fcd0: 09 09 09 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c  ...curr_id->appl
fce0: 65 74 5b 30 5d 20 3d 20 70 69 76 5f 6b 65 79 3b  et[0] = piv_key;
fcf0: 0a 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
fd00: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
fd10: 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 63 75 72  read_ret;....cur
fd20: 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74  r_id->certificat
fd30: 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f  e = malloc(curr_
fd40: 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  id->certificate_
fd50: 6c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28  len);....memcpy(
fd60: 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
fd70: 63 61 74 65 2c 20 62 75 66 66 65 72 20 2b 20 34  cate, buffer + 4
fd80: 2c 20 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  , curr_id->certi
fd90: 66 69 63 61 74 65 5f 6c 65 6e 20 2d 20 34 29 3b  ficate_len - 4);
fda0: 20 2f 2a 20 58 58 58 20 54 4f 44 4f 20 50 49 56   /* XXX TODO PIV
fdb0: 20 28 2d 34 20 68 65 61 64 65 72 2c 20 2d 35 20   (-4 header, -5 
fdc0: 74 72 61 69 6c 65 72 20 3d 3d 20 77 68 79 20 3f  trailer == why ?
fdd0: 29 20 2a 2f 0a 09 09 09 63 75 72 72 5f 69 64 2d  ) */....curr_id-
fde0: 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  >certificate_len
fdf0: 20 2d 3d 20 34 3b 0a 09 09 09 63 75 72 72 5f 69   -= 4;....curr_i
fe00: 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c  d->certificate_l
fe10: 65 6e 20 2d 3d 20 35 3b 0a 09 09 7d 0a 09 7d 20  en -= 5;...}..} 
fe20: 65 6c 73 65 20 7b 0a 09 09 2f 2a 20 52 65 61 64  else {.../* Read
fe30: 20 61 6c 6c 20 74 68 65 20 61 70 70 6c 65 74 73   all the applets
fe40: 20 66 72 6f 6d 20 74 68 65 20 43 43 43 27 73 20   from the CCC's 
fe50: 54 4c 56 20 2a 2f 0a 09 09 63 63 63 5f 74 6c 76  TLV */...ccc_tlv
fe60: 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 74   = cackey_read_t
fe70: 6c 76 28 73 6c 6f 74 29 3b 0a 0a 09 09 2f 2a 20  lv(slot);..../* 
fe80: 4c 6f 6f 6b 20 66 6f 72 20 43 41 52 44 55 52 4c  Look for CARDURL
fe90: 73 20 74 68 61 74 20 63 6f 6f 72 65 73 70 6f 6e  s that coorespon
fea0: 64 20 74 6f 20 50 4b 49 20 61 70 70 6c 65 74 73  d to PKI applets
feb0: 20 2a 2f 0a 09 09 66 6f 72 20 28 63 63 63 5f 63   */...for (ccc_c
fec0: 75 72 72 20 3d 20 63 63 63 5f 74 6c 76 3b 20 63  urr = ccc_tlv; c
fed0: 63 63 5f 63 75 72 72 3b 20 63 63 63 5f 63 75 72  cc_curr; ccc_cur
fee0: 72 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 5f 6e  r = ccc_curr->_n
fef0: 65 78 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ext) {....CACKEY
ff00: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46  _DEBUG_PRINTF("F
ff10: 6f 75 6e 64 20 74 61 67 3a 20 25 73 20 2e 2e 2e  ound tag: %s ...
ff20: 20 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47   ", CACKEY_DEBUG
ff30: 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52  _FUNC_TAG_TO_STR
ff40: 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 29 29  (ccc_curr->tag))
ff50: 3b 0a 0a 09 09 09 69 66 20 28 63 63 63 5f 63 75  ;.....if (ccc_cu
ff60: 72 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53  rr->tag != GSCIS
ff70: 5f 54 41 47 5f 43 41 52 44 55 52 4c 29 20 7b 0a  _TAG_CARDURL) {.
ff80: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ff90: 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
ffa0: 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
ffb0: 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 43  nly care about C
ffc0: 41 52 44 55 52 4c 73 29 22 29 3b 0a 0a 09 09 09  ARDURLs)");.....
ffd0: 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
ffe0: 0a 09 09 09 69 66 20 28 28 63 63 63 5f 63 75 72  ....if ((ccc_cur
fff0: 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10000 2d 3e 61 70 70 74 79 70 65 20 26 20 43 41 43 4b  ->apptype & CACK
10010 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20  EY_TLV_APP_PKI) 
10020 21 3d 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50  != CACKEY_TLV_AP
10030 50 5f 50 4b 49 29 20 7b 0a 09 09 09 09 43 41 43  P_PKI) {.....CAC
10040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10050 28 22 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67  ("  ... skipping
10060 20 69 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72   it (we only car
10070 65 20 61 62 6f 75 74 20 50 4b 49 20 61 70 70 6c  e about PKI appl
10080 65 74 73 2c 20 74 68 69 73 20 61 70 70 6c 65 74  ets, this applet
10090 20 73 75 70 70 6f 72 74 73 3a 20 25 73 2f 25 30   supports: %s/%0
100a0 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
100b0 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
100c0 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
100d0 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
100e0 61 70 70 74 79 70 65 29 2c 20 28 75 6e 73 69 67  apptype), (unsig
100f0 6e 65 64 20 69 6e 74 29 20 63 63 63 5f 63 75 72  ned int) ccc_cur
10100 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10110 2d 3e 61 70 70 74 79 70 65 29 3b 0a 0a 09 09 09  ->apptype);.....
10120 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a  .continue;....}.
10130 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
10140 5f 50 52 49 4e 54 42 55 46 28 22 52 49 44 3a 22  _PRINTBUF("RID:"
10150 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  , ccc_curr->valu
10160 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20  e_cardurl->rid, 
10170 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72 72 2d  sizeof(ccc_curr-
10180 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10190 72 69 64 29 29 3b 0a 09 09 09 43 41 43 4b 45 59  rid));....CACKEY
101a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
101b0 70 70 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22  ppID = %s/%04lx"
101c0 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
101d0 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52  UNC_OBJID_TO_STR
101e0 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65  (ccc_curr->value
101f0 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 29  _cardurl->appid)
10200 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
10210 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  ) ccc_curr->valu
10220 65 5f 63 61 72 64 75 72 6c 2d 3e 61 70 70 69 64  e_cardurl->appid
10230 29 3b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
10240 55 47 5f 50 52 49 4e 54 46 28 22 4f 62 6a 65 63  UG_PRINTF("Objec
10250 74 49 44 20 3d 20 25 73 2f 25 30 34 6c 78 22 2c  tID = %s/%04lx",
10260 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
10270 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54 52 28  NC_OBJID_TO_STR(
10280 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
10290 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69  cardurl->objecti
102a0 64 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  d), (unsigned lo
102b0 6e 67 29 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  ng) ccc_curr->va
102c0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a  lue_cardurl->obj
102d0 65 63 74 69 64 29 3b 0a 0a 09 09 09 6d 65 6d 63  ectid);.....memc
102e0 70 79 28 63 75 72 72 5f 61 69 64 2c 20 63 63 63  py(curr_aid, ccc
102f0 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72  _curr->value_car
10300 64 75 72 6c 2d 3e 72 69 64 2c 20 73 69 7a 65 6f  durl->rid, sizeo
10310 66 28 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  f(ccc_curr->valu
10320 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64 29 29  e_cardurl->rid))
10330 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b 73 69  ;....curr_aid[si
10340 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29 20 2d  zeof(curr_aid) -
10350 20 32 5d 20 3d 20 28 63 63 63 5f 63 75 72 72 2d   2] = (ccc_curr-
10360 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10370 61 70 70 69 64 20 3e 3e 20 38 29 20 26 20 30 78  appid >> 8) & 0x
10380 66 66 3b 0a 09 09 09 63 75 72 72 5f 61 69 64 5b  ff;....curr_aid[
10390 73 69 7a 65 6f 66 28 63 75 72 72 5f 61 69 64 29  sizeof(curr_aid)
103a0 20 2d 20 31 5d 20 3d 20 63 63 63 5f 63 75 72 72   - 1] = ccc_curr
103b0 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
103c0 3e 61 70 70 69 64 20 26 20 30 78 66 66 3b 0a 0a  >appid & 0xff;..
103d0 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 66 6f 75  .../* Select fou
103e0 6e 64 20 61 70 70 6c 65 74 20 2e 2e 2e 20 2a 2f  nd applet ... */
103f0 0a 09 09 09 73 65 6c 65 63 74 5f 72 65 74 20 3d  ....select_ret =
10400 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61   cackey_select_a
10410 70 70 6c 65 74 28 73 6c 6f 74 2c 20 63 75 72 72  pplet(slot, curr
10420 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75 72  _aid, sizeof(cur
10430 72 5f 61 69 64 29 29 3b 0a 09 09 09 69 66 20 28  r_aid));....if (
10440 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20 43 41  select_ret != CA
10450 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
10460 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
10470 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
10480 64 20 74 6f 20 73 65 6c 65 63 74 20 61 70 70 6c  d to select appl
10490 65 74 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  et, skipping pro
104a0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
104b0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
104c0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
104d0 09 09 2f 2a 20 2e 2e 2e 20 61 6e 64 20 6f 62 6a  ../* ... and obj
104e0 65 63 74 20 28 66 69 6c 65 29 20 2a 2f 0a 09 09  ect (file) */...
104f0 09 73 65 6c 65 63 74 5f 72 65 74 20 3d 20 63 61  .select_ret = ca
10500 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
10510 28 73 6c 6f 74 2c 20 63 63 63 5f 63 75 72 72 2d  (slot, ccc_curr-
10520 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10530 6f 62 6a 65 63 74 69 64 29 3b 0a 09 09 09 69 66  objectid);....if
10540 20 28 73 65 6c 65 63 74 5f 72 65 74 20 21 3d 20   (select_ret != 
10550 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
10560 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  ) {.....CACKEY_D
10570 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
10580 6c 65 64 20 74 6f 20 73 65 6c 65 63 74 20 66 69  led to select fi
10590 6c 65 2c 20 73 6b 69 70 70 69 6e 67 20 70 72 6f  le, skipping pro
105a0 63 65 73 73 69 6e 67 20 6f 66 20 74 68 69 73 20  cessing of this 
105b0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 63  object");......c
105c0 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09  ontinue;....}...
105d0 09 09 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 69  ../* Process thi
105e0 73 20 66 69 6c 65 27 73 20 54 4c 56 20 6c 6f 6f  s file's TLV loo
105f0 6b 69 6e 67 20 66 6f 72 20 63 65 72 74 69 66 69  king for certifi
10600 63 61 74 65 73 20 2a 2f 0a 09 09 09 61 70 70 5f  cates */....app_
10610 74 6c 76 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  tlv = cackey_rea
10620 64 5f 74 6c 76 28 73 6c 6f 74 29 3b 0a 09 0a 09  d_tlv(slot);....
10630 09 09 66 6f 72 20 28 61 70 70 5f 63 75 72 72 20  ..for (app_curr 
10640 3d 20 61 70 70 5f 74 6c 76 3b 20 61 70 70 5f 63  = app_tlv; app_c
10650 75 72 72 3b 20 61 70 70 5f 63 75 72 72 20 3d 20  urr; app_curr = 
10660 61 70 70 5f 63 75 72 72 2d 3e 5f 6e 65 78 74 29  app_curr->_next)
10670 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
10680 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
10690 64 20 74 61 67 3a 20 25 73 22 2c 20 43 41 43 4b  d tag: %s", CACK
106a0 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41  EY_DEBUG_FUNC_TA
106b0 47 5f 54 4f 5f 53 54 52 28 61 70 70 5f 63 75 72  G_TO_STR(app_cur
106c0 72 2d 3e 74 61 67 29 29 3b 0a 09 09 09 09 69 66  r->tag));.....if
106d0 20 28 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 20   (app_curr->tag 
106e0 21 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 45 52  != GSCIS_TAG_CER
106f0 54 49 46 49 43 41 54 45 29 20 7b 0a 09 09 09 09  TIFICATE) {.....
10700 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10710 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73 6b 69 70  INTF("  ... skip
10720 70 69 6e 67 20 69 74 20 28 77 65 20 6f 6e 6c 79  ping it (we only
10730 20 63 61 72 65 20 61 62 6f 75 74 20 43 45 52 54   care about CERT
10740 49 46 49 43 41 54 45 73 29 22 29 3b 0a 0a 09 09  IFICATEs)");....
10750 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
10760 09 7d 0a 0a 09 09 09 09 63 75 72 72 5f 69 64 20  .}......curr_id 
10770 3d 20 26 63 65 72 74 73 5b 6f 75 74 69 64 78 5d  = &certs[outidx]
10780 3b 0a 09 09 09 09 6f 75 74 69 64 78 2b 2b 3b 0a  ;.....outidx++;.
10790 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
107a0 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 63 75 72  _id->applet, cur
107b0 72 5f 61 69 64 2c 20 73 69 7a 65 6f 66 28 63 75  r_aid, sizeof(cu
107c0 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74 29 29 3b  rr_id->applet));
107d0 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 66 69  .....curr_id->fi
107e0 6c 65 20 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76  le = ccc_curr->v
107f0 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62  alue_cardurl->ob
10800 6a 65 63 74 69 64 3b 0a 09 09 09 09 63 75 72 72  jectid;.....curr
10810 5f 69 64 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d  _id->keysize = -
10820 31 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  1;......CACKEY_D
10830 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 69 6c  EBUG_PRINTF("Fil
10840 6c 69 6e 67 20 63 75 72 72 5f 69 64 2d 3e 61 70  ling curr_id->ap
10850 70 6c 65 74 20 28 25 70 29 20 77 69 74 68 20 25  plet (%p) with %
10860 6c 75 20 62 79 74 65 73 3a 22 2c 20 63 75 72 72  lu bytes:", curr
10870 5f 69 64 2d 3e 61 70 70 6c 65 74 2c 20 28 75 6e  _id->applet, (un
10880 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a  signed long) siz
10890 65 6f 66 28 63 75 72 72 5f 69 64 2d 3e 61 70 70  eof(curr_id->app
108a0 6c 65 74 29 29 3b 0a 09 09 09 09 43 41 43 4b 45  let));.....CACKE
108b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
108c0 28 22 56 41 4c 3a 22 2c 20 63 75 72 72 5f 69 64  ("VAL:", curr_id
108d0 2d 3e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  ->applet, sizeof
108e0 28 63 75 72 72 5f 69 64 2d 3e 61 70 70 6c 65 74  (curr_id->applet
108f0 29 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f 69 64  ));......curr_id
10900 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10910 6e 20 3d 20 61 70 70 5f 63 75 72 72 2d 3e 6c 65  n = app_curr->le
10920 6e 67 74 68 3b 0a 0a 09 09 09 09 63 75 72 72 5f  ngth;......curr_
10930 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20  id->certificate 
10940 3d 20 6d 61 6c 6c 6f 63 28 63 75 72 72 5f 69 64  = malloc(curr_id
10950 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10960 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63  n);.....memcpy(c
10970 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10980 61 74 65 2c 20 61 70 70 5f 63 75 72 72 2d 3e 76  ate, app_curr->v
10990 61 6c 75 65 2c 20 63 75 72 72 5f 69 64 2d 3e 63  alue, curr_id->c
109a0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
109b0 0a 0a 09 09 09 09 69 66 20 28 6f 75 74 69 64 78  ......if (outidx
109c0 20 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09   >= *count) {...
109d0 09 09 09 69 66 20 28 63 65 72 74 73 5f 72 65 73  ...if (certs_res
109e0 69 7a 61 62 6c 65 29 20 7b 0a 09 09 09 09 09 09  izable) {.......
109f0 2a 63 6f 75 6e 74 20 2a 3d 20 32 3b 0a 09 09 09  *count *= 2;....
10a00 09 09 09 63 65 72 74 73 20 3d 20 72 65 61 6c 6c  ...certs = reall
10a10 6f 63 28 63 65 72 74 73 2c 20 73 69 7a 65 6f 66  oc(certs, sizeof
10a20 28 2a 63 65 72 74 73 29 20 2a 20 28 2a 63 6f 75  (*certs) * (*cou
10a30 6e 74 29 29 3b 0a 09 09 09 09 09 7d 20 65 6c 73  nt));......} els
10a40 65 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  e {.......break;
10a50 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
10a60 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  .}.....cackey_fr
10a70 65 65 5f 74 6c 76 28 61 70 70 5f 74 6c 76 29 3b  ee_tlv(app_tlv);
10a80 0a 0a 09 09 09 69 66 20 28 6f 75 74 69 64 78 20  .....if (outidx 
10a90 3e 3d 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 09 09  >= *count) {....
10aa0 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d  .break;....}...}
10ab0 0a 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
10ac0 74 6c 76 28 63 63 63 5f 74 6c 76 29 3b 0a 09 7d  tlv(ccc_tlv);..}
10ad0 0a 0a 09 2a 63 6f 75 6e 74 20 3d 20 6f 75 74 69  ...*count = outi
10ae0 64 78 3b 0a 0a 09 69 66 20 28 63 65 72 74 73 5f  dx;...if (certs_
10af0 72 65 73 69 7a 61 62 6c 65 29 20 7b 0a 09 09 63  resizable) {...c
10b00 65 72 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63  erts = realloc(c
10b10 65 72 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65  erts, sizeof(*ce
10b20 72 74 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29  rts) * (*count))
10b30 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 63 61 63  ;..}...slot->cac
10b40 68 65 64 5f 63 65 72 74 73 20 3d 20 63 61 63 6b  hed_certs = cack
10b50 65 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 4e 55  ey_copy_certs(NU
10b60 4c 4c 2c 20 63 65 72 74 73 2c 20 2a 63 6f 75 6e  LL, certs, *coun
10b70 74 29 3b 0a 09 73 6c 6f 74 2d 3e 63 61 63 68 65  t);..slot->cache
10b80 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 20 3d 20  d_certs_count = 
10b90 2a 63 6f 75 6e 74 3b 0a 0a 09 2f 2a 20 54 65 72  *count;.../* Ter
10ba0 6d 69 6e 61 74 65 20 53 6d 61 72 74 43 61 72 64  minate SmartCard
10bb0 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   Transaction */.
10bc0 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
10bd0 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
10be0 09 72 65 74 75 72 6e 28 63 65 72 74 73 29 3b 0a  .return(certs);.
10bf0 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49  }../*. * SYNPOSI
10c00 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
10c10 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20   * ARGUMENTS. * 
10c20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45      .... *. * RE
10c30 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20  TURN VALUE. *   
10c40 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45    .... *. * NOTE
10c50 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a  S. *     .... *.
10c60 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65   */.static ssize
10c70 5f 74 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65  _t cackey_signde
10c80 63 72 79 70 74 28 73 74 72 75 63 74 20 63 61 63  crypt(struct cac
10c90 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
10ca0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
10cb0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 79  entity *identity
10cc0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
10cd0 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 62 75 66  *buf, size_t buf
10ce0 6c 65 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  len, unsigned ch
10cf0 61 72 20 2a 6f 75 74 62 75 66 2c 20 73 69 7a 65  ar *outbuf, size
10d00 5f 74 20 6f 75 74 62 75 66 6c 65 6e 2c 20 69 6e  _t outbuflen, in
10d10 74 20 70 61 64 49 6e 70 75 74 2c 20 69 6e 74 20  t padInput, int 
10d20 75 6e 70 61 64 4f 75 74 70 75 74 29 20 7b 0a 09  unpadOutput) {..
10d30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 79  unsigned char dy
10d40 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
10d50 31 30 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  10];..unsigned c
10d60 68 61 72 20 2a 74 6d 70 62 75 66 2c 20 2a 74 6d  har *tmpbuf, *tm
10d70 70 62 75 66 5f 73 2c 20 2a 6f 75 74 62 75 66 5f  pbuf_s, *outbuf_
10d80 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  s;..unsigned cha
10d90 72 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c  r bytes_to_send,
10da0 20 70 31 2c 20 63 6c 61 73 73 3b 0a 09 75 6e 73   p1, class;..uns
10db0 69 67 6e 65 64 20 63 68 61 72 20 62 6c 6f 63 6b  igned char block
10dc0 74 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 72 65  type;..cackey_re
10dd0 74 20 73 65 6e 64 5f 72 65 74 3b 0a 09 75 69 6e  t send_ret;..uin
10de0 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
10df0 09 73 73 69 7a 65 5f 74 20 72 65 74 76 61 6c 20  .ssize_t retval 
10e00 3d 20 30 2c 20 75 6e 70 61 64 6f 66 66 73 65 74  = 0, unpadoffset
10e10 3b 0a 09 73 69 7a 65 5f 74 20 74 6d 70 62 75 66  ;..size_t tmpbuf
10e20 6c 65 6e 2c 20 70 61 64 6c 65 6e 2c 20 74 6d 70  len, padlen, tmp
10e30 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 69 6e 74 20  outbuflen;..int 
10e40 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b  free_tmpbuf = 0;
10e50 0a 09 69 6e 74 20 6c 65 3b 0a 09 69 6e 74 20 70  ..int le;..int p
10e60 69 76 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  iv;...CACKEY_DEB
10e70 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
10e80 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74  d.");...if (slot
10e90 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
10ea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10eb0 46 28 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20  F("Error.  slot 
10ec0 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
10ed0 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
10ee0 66 20 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20  f (buf == NULL) 
10ef0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
10f00 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
10f10 20 62 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a   buf is NULL");.
10f20 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
10f30 7d 0a 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d  }...if (outbuf =
10f40 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
10f50 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
10f60 22 45 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20  "Error.  outbuf 
10f70 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65  is NULL");....re
10f80 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69  turn(-1);..}...i
10f90 66 20 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e  f (identity == N
10fa0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
10fb0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
10fc0 72 6f 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69  ror.  identity i
10fd0 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74  s NULL");....ret
10fe0 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66  urn(-1);..}...if
10ff0 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
11000 5f 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  _identity == NUL
11010 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
11020 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11030 72 2e 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  r.  identity->pc
11040 73 63 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e  sc_identity is N
11050 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ULL");....return
11060 28 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65  (-1);..}.../* De
11070 74 65 72 6d 69 6e 65 20 69 64 65 6e 74 69 74 79  termine identity
11080 20 4b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   Key size */..if
11090 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
110a0 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69  _identity->keysi
110b0 7a 65 20 3c 20 30 29 20 7b 0a 09 09 69 64 65 6e  ze < 0) {...iden
110c0 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
110d0 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 78  ity->keysize = x
110e0 35 30 39 5f 74 6f 5f 6b 65 79 73 69 7a 65 28 69  509_to_keysize(i
110f0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
11100 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
11110 61 74 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ate, identity->p
11120 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 65  csc_identity->ce
11130 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
11140 09 7d 0a 0a 09 2f 2a 20 50 61 64 20 6d 65 73 73  .}.../* Pad mess
11150 61 67 65 20 74 6f 20 6b 65 79 20 73 69 7a 65 20  age to key size 
11160 2a 2f 0a 09 69 66 20 28 70 61 64 49 6e 70 75 74  */..if (padInput
11170 29 20 7b 0a 09 09 69 66 20 28 69 64 65 6e 74 69  ) {...if (identi
11180 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74  ty->pcsc_identit
11190 79 2d 3e 6b 65 79 73 69 7a 65 20 3e 20 30 29 20  y->keysize > 0) 
111a0 7b 0a 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  {....if (buflen 
111b0 21 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  != identity->pcs
111c0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
111d0 69 7a 65 29 20 7b 0a 09 09 09 09 69 66 20 28 62  ize) {.....if (b
111e0 75 66 6c 65 6e 20 3e 20 28 69 64 65 6e 74 69 74  uflen > (identit
111f0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11200 2d 3e 6b 65 79 73 69 7a 65 20 2b 20 33 29 29 20  ->keysize + 3)) 
11210 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
11220 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
11230 72 2e 20 20 4d 65 73 73 61 67 65 20 69 73 20 74  r.  Message is t
11240 6f 6f 20 6c 61 72 67 65 20 74 6f 20 73 69 67 6e  oo large to sign
11250 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09 09 09  /decrypt");.....
11260 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
11270 09 09 7d 0a 0a 09 09 09 09 74 6d 70 62 75 66 6c  ..}......tmpbufl
11280 65 6e 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70  en = identity->p
11290 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65  csc_identity->ke
112a0 79 73 69 7a 65 3b 0a 09 09 09 09 74 6d 70 62 75  ysize;.....tmpbu
112b0 66 20 3d 20 6d 61 6c 6c 6f 63 28 74 6d 70 62 75  f = malloc(tmpbu
112c0 66 6c 65 6e 29 3b 0a 09 09 09 09 66 72 65 65 5f  flen);.....free_
112d0 74 6d 70 62 75 66 20 3d 20 31 3b 0a 0a 09 09 09  tmpbuf = 1;.....
112e0 09 70 61 64 6c 65 6e 20 3d 20 74 6d 70 62 75 66  .padlen = tmpbuf
112f0 6c 65 6e 20 2d 20 62 75 66 6c 65 6e 20 2d 20 33  len - buflen - 3
11300 3b 0a 0a 09 09 09 09 2f 2a 20 52 53 41 20 50 4b  ;....../* RSA PK
11310 43 53 23 31 20 45 4d 53 41 2d 50 4b 43 53 31 2d  CS#1 EMSA-PKCS1-
11320 76 31 5f 35 20 50 61 64 64 69 6e 67 20 2a 2f 0a  v1_5 Padding */.
11330 09 09 09 09 74 6d 70 62 75 66 5b 30 5d 20 3d 20  ....tmpbuf[0] = 
11340 30 78 30 30 3b 0a 09 09 09 09 74 6d 70 62 75 66  0x00;.....tmpbuf
11350 5b 31 5d 20 3d 20 30 78 30 31 3b 0a 09 09 09 09  [1] = 0x01;.....
11360 6d 65 6d 73 65 74 28 26 74 6d 70 62 75 66 5b 32  memset(&tmpbuf[2
11370 5d 2c 20 30 78 46 46 2c 20 70 61 64 6c 65 6e 29  ], 0xFF, padlen)
11380 3b 0a 09 09 09 09 74 6d 70 62 75 66 5b 70 61 64  ;.....tmpbuf[pad
11390 6c 65 6e 20 2b 20 32 5d 3d 20 30 78 30 30 3b 0a  len + 2]= 0x00;.
113a0 09 09 09 09 6d 65 6d 63 70 79 28 26 74 6d 70 62  ....memcpy(&tmpb
113b0 75 66 5b 70 61 64 6c 65 6e 20 2b 20 33 5d 2c 20  uf[padlen + 3], 
113c0 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 0a 09  buf, buflen);...
113d0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
113e0 50 52 49 4e 54 42 55 46 28 22 55 6e 70 61 64 64  PRINTBUF("Unpadd
113f0 65 64 3a 22 2c 20 62 75 66 2c 20 62 75 66 6c 65  ed:", buf, bufle
11400 6e 29 3b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  n);.....CACKEY_D
11410 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28 22 50  EBUG_PRINTBUF("P
11420 61 64 64 65 64 3a 22 2c 20 74 6d 70 62 75 66 2c  added:", tmpbuf,
11430 20 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 09 09 09   tmpbuflen);....
11440 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 6d 70  } else {.....tmp
11450 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 09 74  buf = buf;.....t
11460 6d 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65  mpbuflen = bufle
11470 6e 3b 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62  n;.....free_tmpb
11480 75 66 20 3d 20 30 3b 0a 09 09 09 09 70 61 64 6c  uf = 0;.....padl
11490 65 6e 20 3d 20 30 3b 0a 09 09 09 7d 0a 09 09 7d  en = 0;....}...}
114a0 20 65 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45   else {....CACKE
114b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
114c0 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  Unable to determ
114d0 69 6e 65 20 6b 65 79 20 73 69 7a 65 2c 20 68 6f  ine key size, ho
114e0 70 69 6e 67 20 74 68 65 20 6d 65 73 73 61 67 65  ping the message
114f0 20 69 73 20 70 72 6f 70 65 72 6c 79 20 70 61 64   is properly pad
11500 64 65 64 21 22 29 3b 0a 0a 09 09 09 74 6d 70 62  ded!");.....tmpb
11510 75 66 20 3d 20 62 75 66 3b 0a 09 09 09 74 6d 70  uf = buf;....tmp
11520 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b  buflen = buflen;
11530 0a 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ....free_tmpbuf 
11540 3d 20 30 3b 0a 09 09 09 70 61 64 6c 65 6e 20 3d  = 0;....padlen =
11550 20 30 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20   0;...}..} else 
11560 7b 0a 09 09 74 6d 70 62 75 66 20 3d 20 62 75 66  {...tmpbuf = buf
11570 3b 0a 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20  ;...tmpbuflen = 
11580 62 75 66 6c 65 6e 3b 0a 09 09 66 72 65 65 5f 74  buflen;...free_t
11590 6d 70 62 75 66 20 3d 20 30 3b 0a 09 09 70 61 64  mpbuf = 0;...pad
115a0 6c 65 6e 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  len = 0;..}.../*
115b0 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   Begin transacti
115c0 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65  on */..cackey_be
115d0 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  gin_transaction(
115e0 73 6c 6f 74 29 3b 0a 0a 09 2f 2a 20 44 65 74 65  slot);.../* Dete
115f0 72 6d 69 6e 65 20 74 79 70 65 20 6f 66 20 74 72  rmine type of tr
11600 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 69 66  ansaction */..if
11610 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63   (identity->pcsc
11620 5f 69 64 65 6e 74 69 74 79 2d 3e 66 69 6c 65 20  _identity->file 
11630 3d 3d 20 30 78 46 46 46 46 29 20 7b 0a 09 09 70  == 0xFFFF) {...p
11640 69 76 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  iv = 1;..} else 
11650 7b 0a 09 09 70 69 76 20 3d 20 30 3b 0a 09 7d 0a  {...piv = 0;..}.
11660 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72  ../* Select corr
11670 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09 69  ect applet */..i
11680 66 20 28 21 70 69 76 29 20 7b 0a 09 09 43 41 43  f (!piv) {...CAC
11690 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
116a0 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
116b0 65 74 20 66 6f 75 6e 64 20 61 74 20 25 70 20 2e  et found at %p .
116c0 2e 2e 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  ..", identity->p
116d0 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70  csc_identity->ap
116e0 70 6c 65 74 29 3b 0a 09 09 63 61 63 6b 65 79 5f  plet);...cackey_
116f0 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c  select_applet(sl
11700 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63  ot, identity->pc
11710 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70 70  sc_identity->app
11720 6c 65 74 2c 20 73 69 7a 65 6f 66 28 69 64 65 6e  let, sizeof(iden
11730 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11740 69 74 79 2d 3e 61 70 70 6c 65 74 29 29 3b 0a 0a  ity->applet));..
11750 09 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72 72  ../* Select corr
11760 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 09 63 61  ect file */...ca
11770 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69 6c 65  ckey_select_file
11780 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74 79 2d  (slot, identity-
11790 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e  >pcsc_identity->
117a0 66 69 6c 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b  file);..} else {
117b0 0a 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70  ...dyn_auth_temp
117c0 6c 61 74 65 5b 30 5d 20 3d 20 30 78 37 43 3b 0a  late[0] = 0x7C;.
117d0 09 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c  ..dyn_auth_templ
117e0 61 74 65 5b 31 5d 20 3d 20 30 78 38 32 3b 0a 09  ate[1] = 0x82;..
117f0 09 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  .dyn_auth_templa
11800 74 65 5b 32 5d 20 3d 20 28 28 74 6d 70 62 75 66  te[2] = ((tmpbuf
11810 6c 65 6e 20 2b 20 36 29 20 26 20 30 78 66 66 30  len + 6) & 0xff0
11820 30 29 20 3e 3e 20 38 3b 0a 09 09 64 79 6e 5f 61  0) >> 8;...dyn_a
11830 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 33 5d 20  uth_template[3] 
11840 3d 20 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36  = (tmpbuflen + 6
11850 29 20 26 20 30 78 30 30 66 66 3b 0a 09 09 64 79  ) & 0x00ff;...dy
11860 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
11870 34 5d 20 3d 20 30 78 38 32 3b 0a 09 09 64 79 6e  4] = 0x82;...dyn
11880 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 35  _auth_template[5
11890 5d 20 3d 20 30 78 30 30 3b 0a 09 09 64 79 6e 5f  ] = 0x00;...dyn_
118a0 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d  auth_template[6]
118b0 20 3d 20 30 78 38 31 3b 0a 09 09 64 79 6e 5f 61   = 0x81;...dyn_a
118c0 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20  uth_template[7] 
118d0 3d 20 30 78 38 32 3b 0a 09 09 64 79 6e 5f 61 75  = 0x82;...dyn_au
118e0 74 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d  th_template[8] =
118f0 20 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78   (tmpbuflen & 0x
11900 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 64 79  ff00) >> 8;...dy
11910 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
11920 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 26  9] = tmpbuflen &
11930 20 30 78 30 30 66 66 3b 0a 0a 09 09 73 65 6e 64   0x00ff;....send
11940 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65  _ret = cackey_se
11950 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 30 78  nd_apdu(slot, 0x
11960 31 30 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33  10, NISTSP800_73
11970 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48  _3_INSTR_GENAUTH
11980 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  , NISTSP800_78_3
11990 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69  _ALGO_RSA2048, i
119a0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
119b0 65 6e 74 69 74 79 2d 3e 61 70 70 6c 65 74 5b 30  entity->applet[0
119c0 5d 2c 20 73 69 7a 65 6f 66 28 64 79 6e 5f 61 75  ], sizeof(dyn_au
119d0 74 68 5f 74 65 6d 70 6c 61 74 65 29 2c 20 64 79  th_template), dy
119e0 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 2c  n_auth_template,
119f0 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
11a00 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 74  L, NULL);..}...t
11a10 6d 70 62 75 66 5f 73 20 3d 20 74 6d 70 62 75 66  mpbuf_s = tmpbuf
11a20 3b 0a 09 6f 75 74 62 75 66 5f 73 20 3d 20 6f 75  ;..outbuf_s = ou
11a30 74 62 75 66 3b 0a 09 77 68 69 6c 65 20 28 74 6d  tbuf;..while (tm
11a40 70 62 75 66 6c 65 6e 29 20 7b 0a 09 09 69 66 20  pbuflen) {...if 
11a50 28 74 6d 70 62 75 66 6c 65 6e 20 3e 20 32 34 35  (tmpbuflen > 245
11a60 29 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f  ) {....bytes_to_
11a70 73 65 6e 64 20 3d 20 32 34 35 3b 0a 09 09 09 69  send = 245;....i
11a80 66 20 28 70 69 76 29 20 7b 0a 09 09 09 09 63 6c  f (piv) {.....cl
11a90 61 73 73 20 3d 20 30 78 31 30 3b 0a 09 09 09 09  ass = 0x10;.....
11aa0 6c 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 7d 20  le = 0x00;....} 
11ab0 65 6c 73 65 20 7b 0a 09 09 09 09 70 31 20 3d 20  else {.....p1 = 
11ac0 30 78 38 30 3b 0a 09 09 09 09 6c 65 20 3d 20 30  0x80;.....le = 0
11ad0 78 30 30 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c  x00;....}...} el
11ae0 73 65 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f  se {....bytes_to
11af0 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75 66 6c 65  _send = tmpbufle
11b00 6e 3b 0a 09 09 09 69 66 20 28 70 69 76 29 20 7b  n;....if (piv) {
11b10 0a 09 09 09 09 63 6c 61 73 73 20 3d 20 47 53 43  .....class = GSC
11b20 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
11b30 3b 0a 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a  ;.....le = 256;.
11b40 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
11b50 70 31 20 3d 20 30 78 30 30 3b 0a 09 09 09 09 6c  p1 = 0x00;.....l
11b60 65 20 3d 20 30 78 30 30 3b 0a 09 09 09 7d 0a 09  e = 0x00;....}..
11b70 09 7d 0a 0a 09 09 74 6d 70 6f 75 74 62 75 66 6c  .}....tmpoutbufl
11b80 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65 6e 3b 0a  en = outbuflen;.
11b90 0a 09 09 69 66 20 28 70 69 76 29 20 7b 0a 09 09  ...if (piv) {...
11ba0 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
11bb0 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
11bc0 74 2c 20 63 6c 61 73 73 2c 20 4e 49 53 54 53 50  t, class, NISTSP
11bd0 38 30 30 5f 37 33 5f 33 5f 49 4e 53 54 52 5f 47  800_73_3_INSTR_G
11be0 45 4e 41 55 54 48 2c 20 4e 49 53 54 53 50 38 30  ENAUTH, NISTSP80
11bf0 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52 53 41 32  0_78_3_ALGO_RSA2
11c00 30 34 38 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70  048, identity->p
11c10 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 61 70  csc_identity->ap
11c20 70 6c 65 74 5b 30 5d 2c 20 62 79 74 65 73 5f 74  plet[0], bytes_t
11c30 6f 5f 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20  o_send, tmpbuf, 
11c40 6c 65 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f  le, &respcode, o
11c50 75 74 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75  utbuf, &tmpoutbu
11c60 66 6c 65 6e 29 3b 0a 09 09 7d 20 65 6c 73 65 20  flen);...} else 
11c70 7b 0a 09 09 09 73 65 6e 64 5f 72 65 74 20 3d 20  {....send_ret = 
11c80 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75  cackey_send_apdu
11c90 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41  (slot, GSCIS_CLA
11ca0 53 53 5f 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f  SS_GLOBAL_PLATFO
11cb0 52 4d 2c 20 47 53 43 49 53 5f 49 4e 53 54 52 5f  RM, GSCIS_INSTR_
11cc0 53 49 47 4e 44 45 43 52 59 50 54 2c 20 70 31 2c  SIGNDECRYPT, p1,
11cd0 20 30 78 30 30 2c 20 62 79 74 65 73 5f 74 6f 5f   0x00, bytes_to_
11ce0 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65  send, tmpbuf, le
11cf0 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74  , &respcode, out
11d00 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c  buf, &tmpoutbufl
11d10 65 6e 29 3b 0a 09 09 7d 0a 09 09 69 66 20 28 73  en);...}...if (s
11d20 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  end_ret != CACKE
11d30 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
11d40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11d50 52 49 4e 54 46 28 22 41 44 50 55 20 53 65 6e 64  RINTF("ADPU Send
11d60 69 6e 67 20 46 61 69 6c 65 64 20 2d 2d 20 72 65  ing Failed -- re
11d70 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
11d80 2e 22 29 3b 0a 0a 09 09 09 69 66 20 28 66 72 65  .");.....if (fre
11d90 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09 09 09  e_tmpbuf) {.....
11da0 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
11db0 09 09 09 09 09 66 72 65 65 28 74 6d 70 62 75 66  .....free(tmpbuf
11dc0 5f 73 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  _s);.....}....}.
11dd0 0a 09 09 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73  ..../* End trans
11de0 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63  action */....cac
11df0 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  key_end_transact
11e00 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69  ion(slot);.....i
11e10 66 20 28 72 65 73 70 63 6f 64 65 20 3d 3d 20 30  f (respcode == 0
11e20 78 36 39 38 32 29 20 7b 0a 09 09 09 09 43 41 43  x6982) {.....CAC
11e30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
11e40 28 22 53 65 63 75 72 69 74 79 20 73 74 61 74 75  ("Security statu
11e50 73 20 6e 6f 74 20 73 61 74 69 73 69 66 69 65 64  s not satisified
11e60 2e 20 20 52 65 74 75 72 6e 69 6e 67 20 4e 45 45  .  Returning NEE
11e70 44 4c 4f 47 49 4e 22 29 3b 0a 0a 09 09 09 09 63  DLOGIN");......c
11e80 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
11e90 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 09 09 09  reset(slot);....
11ea0 09 73 6c 6f 74 2d 3e 74 6f 6b 65 6e 5f 66 6c 61  .slot->token_fla
11eb0 67 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52  gs = CKF_LOGIN_R
11ec0 45 51 55 49 52 45 44 3b 0a 0a 09 09 09 09 72 65  EQUIRED;......re
11ed0 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
11ee0 5f 45 5f 4e 45 45 44 4c 4f 47 49 4e 29 3b 0a 09  _E_NEEDLOGIN);..
11ef0 09 09 7d 0a 0a 09 09 09 69 66 20 28 73 65 6e 64  ..}.....if (send
11f00 5f 72 65 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50  _ret == CACKEY_P
11f10 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e  CSC_E_TOKENABSEN
11f20 54 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  T) {.....CACKEY_
11f30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 6f  DEBUG_PRINTF("To
11f40 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 52 65 74  ken absent.  Ret
11f50 75 72 6e 69 6e 67 20 54 4f 4b 45 4e 41 42 53 45  urning TOKENABSE
11f60 4e 54 22 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65  NT");......cacke
11f70 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65  y_mark_slot_rese
11f80 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 09 72 65  t(slot);......re
11f90 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
11fa0 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b  _E_TOKENABSENT);
11fb0 0a 09 09 09 7d 0a 0a 09 09 09 72 65 74 75 72 6e  ....}.....return
11fc0 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 74 6d 70  (-1);...}....tmp
11fd0 62 75 66 20 2b 3d 20 62 79 74 65 73 5f 74 6f 5f  buf += bytes_to_
11fe0 73 65 6e 64 3b 0a 09 09 74 6d 70 62 75 66 6c 65  send;...tmpbufle
11ff0 6e 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 73 65  n -= bytes_to_se
12000 6e 64 3b 0a 0a 09 09 6f 75 74 62 75 66 20 2b 3d  nd;....outbuf +=
12010 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
12020 09 6f 75 74 62 75 66 6c 65 6e 20 2d 3d 20 74 6d  .outbuflen -= tm
12030 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09 09 72 65  poutbuflen;...re
12040 74 76 61 6c 20 2b 3d 20 74 6d 70 6f 75 74 62 75  tval += tmpoutbu
12050 66 6c 65 6e 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  flen;..}...if (f
12060 72 65 65 5f 74 6d 70 62 75 66 29 20 7b 0a 09 09  ree_tmpbuf) {...
12070 69 66 20 28 74 6d 70 62 75 66 5f 73 29 20 7b 0a  if (tmpbuf_s) {.
12080 09 09 09 66 72 65 65 28 74 6d 70 62 75 66 5f 73  ...free(tmpbuf_s
12090 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6f 75 74 62  );...}..}...outb
120a0 75 66 20 3d 20 6f 75 74 62 75 66 5f 73 3b 0a 0a  uf = outbuf_s;..
120b0 09 2f 2a 20 45 6e 64 20 74 72 61 6e 73 61 63 74  ./* End transact
120c0 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65  ion */..cackey_e
120d0 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
120e0 6c 6f 74 29 3b 0a 0a 23 69 66 64 65 66 20 43 41  lot);..#ifdef CA
120f0 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
12100 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
12110 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 6f 75 74  IZE_MAX..if (out
12120 62 75 66 6c 65 6e 20 3e 20 5f 50 4f 53 49 58 5f  buflen > _POSIX_
12130 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09 09 43  SSIZE_MAX) {...C
12140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12150 54 46 28 22 4f 75 74 62 75 66 6c 65 6e 20 65 78  TF("Outbuflen ex
12160 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
12170 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
12180 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
12190 3d 20 25 6c 69 2c 20 6f 75 74 62 75 66 6c 65 6e  = %li, outbuflen
121a0 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29   = %lu)", (long)
121b0 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41   _POSIX_SSIZE_MA
121c0 58 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  X, (unsigned lon
121d0 67 29 20 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 0a  g) outbuflen);..
121e0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
121f0 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
12200 0a 0a 09 2f 2a 20 57 65 20 6d 75 73 74 20 72 65  .../* We must re
12210 6d 6f 76 65 20 74 68 65 20 22 37 43 22 20 74 61  move the "7C" ta
12220 67 20 74 6f 20 67 65 74 20 74 6f 20 74 68 65 20  g to get to the 
12230 73 69 67 6e 61 74 75 72 65 20 2a 2f 0a 09 69 66  signature */..if
12240 20 28 70 69 76 29 20 7b 0a 09 09 69 66 20 28 6f   (piv) {...if (o
12250 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 37 43  utbuf[0] != 0x7C
12260 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
12270 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70  BUG_PRINTF("Resp
12280 6f 6e 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f  onse from PIV fo
12290 72 20 47 45 4e 45 52 41 54 45 20 41 55 54 48 45  r GENERATE AUTHE
122a0 4e 54 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f  NTICATION was no
122b0 74 20 61 20 30 78 37 43 20 74 61 67 2c 20 72 65  t a 0x7C tag, re
122c0 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
122d0 72 65 22 29 3b 0a 0a 0a 09 09 09 72 65 74 75 72  re");......retur
122e0 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 2f 2a  n(-1);...}..../*
122f0 20 58 58 58 20 54 4f 44 4f 20 50 49 56 20 2a 2f   XXX TODO PIV */
12300 0a 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62 75  ...memmove(outbu
12310 66 2c 20 6f 75 74 62 75 66 20 2b 20 38 2c 20 72  f, outbuf + 8, r
12320 65 74 76 61 6c 20 2d 20 38 29 3b 0a 09 09 72 65  etval - 8);...re
12330 74 76 61 6c 20 2d 3d 20 38 3b 0a 09 7d 0a 0a 09  tval -= 8;..}...
12340 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c 79 20 2a  /* Unpad reply *
12350 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f 75 74 70  /..if (unpadOutp
12360 75 74 29 20 7b 0a 09 09 69 66 20 28 72 65 74 76  ut) {...if (retv
12370 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43 41 43  al < 3) {....CAC
12380 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
12390 28 22 52 65 70 6c 79 20 69 73 20 74 6f 6f 20 73  ("Reply is too s
123a0 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e 6f 74  mall, we are not
123b0 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 64 20 2d   able to unpad -
123c0 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b 20 61  - passing back a
123d0 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20 74 68  nd hoping for th
123e0 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09 09 43  e best!");.....C
123f0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12400 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69 6e  TF("Returning in
12410 20 73 75 63 63 65 73 73 2c 20 72 65 74 76 61 6c   success, retval
12420 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29 22 2c   = %li (bytes)",
12430 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c 29 3b   (long) retval);
12440 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74 76 61  ....return(retva
12450 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 6f  l);...}....if (o
12460 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78 30 30  utbuf[0] != 0x00
12470 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
12480 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 72 65  BUG_PRINTF("Unre
12490 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 69 6e 67  cognized padding
124a0 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 73 73 69   scheme -- passi
124b0 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f 70 69  ng back and hopi
124c0 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 21  ng for the best!
124d0 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ");.....CACKEY_D
124e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
124f0 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
12500 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20  s, retval = %li 
12510 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29  (bytes)", (long)
12520 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72 65 74   retval);....ret
12530 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09 09 7d  urn(retval);...}
12540 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20 3d 20  ....blocktype = 
12550 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75 6e 70  outbuf[1];...unp
12560 61 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 09  adoffset = 0;...
12570 09 73 77 69 74 63 68 20 28 62 6c 6f 63 6b 74 79  .switch (blockty
12580 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20 30 78  pe) {....case 0x
12590 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69  00:...../* Paddi
125a0 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 74 68 65  ng Scheme 1, the
125b0 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72 6f 20   first non-zero 
125c0 62 79 74 65 20 69 73 20 74 68 65 20 73 74 61 72  byte is the star
125d0 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09 09 09  t of data */....
125e0 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65  .for (unpadoffse
125f0 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73  t = 2; unpadoffs
12600 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70  et < retval; unp
12610 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09  adoffset++) {...
12620 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e  ...if (outbuf[un
12630 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78  padoffset] != 0x
12640 30 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61  00) {.......brea
12650 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  k;......}.....}.
12660 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
12670 73 65 20 30 78 30 31 3a 0a 09 09 09 09 2f 2a 20  se 0x01:...../* 
12680 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65 20 32  Padding Scheme 2
12690 2c 20 70 61 64 20 62 79 74 65 73 20 61 72 65 20  , pad bytes are 
126a0 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20 62 79  0xFF followed by
126b0 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 66 6f 72   0x00 */.....for
126c0 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3d 20   (unpadoffset = 
126d0 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 20 3c  2; unpadoffset <
126e0 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64 6f 66   retval; unpadof
126f0 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09 09 69  fset++) {......i
12700 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  f (outbuf[unpado
12710 66 66 73 65 74 5d 20 21 3d 20 30 78 46 46 29 20  ffset] != 0xFF) 
12720 7b 0a 09 09 09 09 09 09 69 66 20 28 6f 75 74 62  {.......if (outb
12730 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
12740 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  == 0x00) {......
12750 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b  ..unpadoffset++;
12760 0a 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b 0a  .........break;.
12770 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
12780 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
12790 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c  UG_PRINTF("Inval
127a0 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61 20  id padding data 
127b0 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e 67  found, returning
127c0 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68 6f   in failure, sho
127d0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30 78  uld have been 0x
127e0 30 30 20 66 6f 75 6e 64 20 30 78 25 30 32 78 22  00 found 0x%02x"
127f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
12800 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66 66   outbuf[unpadoff
12810 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 09 72  set]);.........r
12820 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09  eturn(-1);......
12830 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  .}......} else {
12840 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
12850 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76 61  BUG_PRINTF("Inva
12860 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74 61  lid padding data
12870 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69 6e   found, returnin
12880 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73 68  g in failure, sh
12890 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 30  ould have been 0
128a0 78 46 46 20 66 6f 75 6e 64 20 30 78 25 30 32 78  xFF found 0x%02x
128b0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  ", (unsigned int
128c0 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f 66  ) outbuf[unpadof
128d0 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09 72  fset]);........r
128e0 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 09 09  eturn(-1);......
128f0 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61  }.....}.....brea
12900 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30 32 3a  k;....case 0x02:
12910 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e 67 20  ...../* Padding 
12920 53 63 68 65 6d 65 20 33 2c 20 70 61 64 20 62 79  Scheme 3, pad by
12930 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65 72 6f  tes are non-zero
12940 20 66 69 72 73 74 20 7a 65 72 6f 20 62 79 74 65   first zero byte
12950 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20 73 65   found is the se
12960 70 65 72 61 74 6f 72 20 62 79 74 65 20 2a 2f 0a  perator byte */.
12970 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66  ....for (unpadof
12980 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f  fset = 2; unpado
12990 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20  ffset < retval; 
129a0 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b  unpadoffset++) {
129b0 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66  ......if (outbuf
129c0 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 3d 3d  [unpadoffset] ==
129d0 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 75   0x00) {.......u
129e0 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a 0a 09  npadoffset++;...
129f0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
12a00 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  .}.....}.....bre
12a10 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 75  ak;...}....if (u
12a20 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 72 65 74  npadoffset > ret
12a30 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  val) {....CACKEY
12a40 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f  _DEBUG_PRINTF("O
12a50 66 66 73 65 74 20 67 72 65 61 74 65 72 20 74 68  ffset greater th
12a60 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c 20 61  an reply size, a
12a70 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70 61 64  borting.  (unpad
12a80 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c 20 72 65  offset = %lu, re
12a90 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20 28 75  tval = %lu)", (u
12aa0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6e  nsigned long) un
12ab0 70 61 64 6f 66 66 73 65 74 2c 20 28 75 6e 73 69  padoffset, (unsi
12ac0 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74 76 61  gned long) retva
12ad0 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d  l);.....return(-
12ae0 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45  1);...}....CACKE
12af0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
12b00 28 22 50 61 64 64 65 64 3a 22 2c 20 6f 75 74 62  ("Padded:", outb
12b10 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09  uf, retval);....
12b20 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61 64 6f  retval -= unpado
12b30 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f 76 65  ffset;...memmove
12b40 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 75 66 20  (outbuf, outbuf 
12b50 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 72  + unpadoffset, r
12b60 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43 4b 45  etval);....CACKE
12b70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
12b80 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20 6f 75  ("Unpadded:", ou
12b90 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 09  tbuf, retval);..
12ba0 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
12bb0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
12bc0 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20  ing in success, 
12bd0 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28 62 79  retval = %li (by
12be0 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20 72 65  tes)", (long) re
12bf0 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28  tval);...return(
12c00 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 20  retval);.}../*. 
12c10 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20  * SYNPOSIS. *   
12c20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55    .... *. * ARGU
12c30 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  MENTS. *     ...
12c40 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41  . *. * RETURN VA
12c50 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  LUE. *     .... 
12c60 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20  *. * NOTES. *   
12c70 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61    .... *. */.sta
12c80 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74 20 63  tic cackey_ret c
12c90 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74 72 75  ackey_login(stru
12ca0 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a  ct cackey_slot *
12cb0 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  slot, unsigned c
12cc0 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69 67 6e  har *pin, unsign
12cd0 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65 6e 2c  ed long pin_len,
12ce0 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65 6d 61   int *tries_rema
12cf0 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e 73 69  ining_p) {..unsi
12d00 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f 70 69  gned char cac_pi
12d10 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20 30 78  n[8] = {0xFF, 0x
12d20 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20  FF, 0xFF, 0xFF, 
12d30 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
12d40 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74 31 36  , 0xFF};..uint16
12d50 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  _t response_code
12d60 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65 6d  ;..int tries_rem
12d70 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73 65 6e  aining;..int sen
12d80 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65 79 5f  d_ret;..int key_
12d90 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78 30 30  reference = 0x00
12da0 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 20  ;.../* Indicate 
12db0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 6b  that we do not k
12dc0 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 20 6d 61  now about how ma
12dd0 6e 79 20 74 72 69 65 73 20 61 72 65 20 72 65 6d  ny tries are rem
12de0 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20 28 74  aining */..if (t
12df0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 5f 70  ries_remaining_p
12e00 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72 65 6d  ) {...*tries_rem
12e10 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b 0a 09  aining_p = -1;..
12e20 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e 74 6c  }.../* Apparentl
12e30 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72 65 20  y, CAC PINs are 
12e40 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79 74 65  *EXACTLY* 8 byte
12e50 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20 77 69  s long -- pad wi
12e60 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f 20 73  th 0xFF if too s
12e70 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70 69 6e  hort */..if (pin
12e80 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09 09 6d  _len >= 8) {...m
12e90 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c 20 70  emcpy(cac_pin, p
12ea0 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73 65 20  in, 8);..} else 
12eb0 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63 5f 70  {...memcpy(cac_p
12ec0 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c 65 6e  in, pin, pin_len
12ed0 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73 75 65  );..}.../* Issue
12ee0 20 50 49 4e 20 56 65 72 69 66 79 20 2a 2f 0a 09   PIN Verify */..
12ef0 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65  send_ret = cacke
12f00 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74  y_send_apdu(slot
12f10 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53  , GSCIS_CLASS_IS
12f20 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53  O7816, GSCIS_INS
12f30 54 52 5f 56 45 52 49 46 59 2c 20 30 78 30 30 2c  TR_VERIFY, 0x00,
12f40 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 2c 20   key_reference, 
12f50 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e 29 2c  sizeof(cac_pin),
12f60 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30 2c 20   cac_pin, 0x00, 
12f70 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 2c 20  &response_code, 
12f80 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  NULL, NULL);..if
12f90 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41   (send_ret != CA
12fa0 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 26  CKEY_PCSC_S_OK &
12fb0 26 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20  & response_code 
12fc0 3d 3d 20 30 78 36 41 38 38 29 20 7b 0a 09 09 6b  == 0x6A88) {...k
12fd0 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30  ey_reference = 0
12fe0 78 38 30 3b 0a 0a 09 09 73 65 6e 64 5f 72 65 74  x80;....send_ret
12ff0 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
13000 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
13010 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
13020 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52 49 46  SCIS_INSTR_VERIF
13030 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72 65 66  Y, 0x00, key_ref
13040 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66 28 63  erence, sizeof(c
13050 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70 69 6e  ac_pin), cac_pin
13060 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f 6e 73  , 0x00, &respons
13070 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20 4e 55  e_code, NULL, NU
13080 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65  LL);..}...if (se
13090 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
130a0 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
130b0 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f 63 6f  if ((response_co
130c0 64 65 20 26 20 30 78 36 33 43 30 29 20 3d 3d 20  de & 0x63C0) == 
130d0 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74 72 69  0x63C0) {....tri
130e0 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d 20 28  es_remaining = (
130f0 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20 26 20  response_code & 
13100 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  0xF);.....CACKEY
13110 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50  _DEBUG_PRINTF("P
13120 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20  IN Verification 
13130 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69 65 73  failed, %i tries
13140 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74 72 69   remaining", tri
13150 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b 0a 0a  es_remaining);..
13160 09 09 09 69 66 20 28 74 72 69 65 73 5f 72 65 6d  ...if (tries_rem
13170 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09 09 09  aining_p) {.....
13180 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  *tries_remaining
13190 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d 61 69  _p = tries_remai
131a0 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09 09 72  ning;....}.....r
131b0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
131c0 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09 09 7d  C_E_BADPIN);...}
131d0 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e 73 65  ....if (response
131e0 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 33 29  _code == 0x6983)
131f0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
13200 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56  UG_PRINTF("PIN V
13210 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61 69 6c  erification fail
13220 65 64 2c 20 64 65 76 69 63 65 20 69 73 20 6c 6f  ed, device is lo
13230 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65 74 75  cked");.....retu
13240 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
13250 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a 0a 09  _LOCKED);...}...
13260 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
13270 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
13280 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
13290 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20 56 65  G_PRINTF("PIN Ve
132a0 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63 63 65  rification succe
132b0 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  eded");...return
132c0 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f  (CACKEY_PCSC_S_O
132d0 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  K);.}../*. * SYN
132e0 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
132f0 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
13300 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
13310 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
13320 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
13330 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
13340 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  . *. */.static c
13350 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
13360 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 73  _token_present(s
13370 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
13380 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61 63 6b  t *slot) {..cack
13390 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f 6e 6e  ey_ret pcsc_conn
133a0 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52 44 20  ect_ret;..DWORD 
133b0 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30 2c 20  reader_len = 0, 
133c0 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f 74 6f  state = 0, proto
133d0 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c 65 6e  col = 0, atr_len
133e0 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41 58 5f  ;..BYTE atr[MAX_
133f0 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f 4e 47  ATR_SIZE];..LONG
13400 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73 63 61   status_ret, sca
13410 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 0a  rd_reconn_ret;..
13420 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13430 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
13440 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69 6e 74  ...if (slot->int
13450 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43 4b 45  ernal) {...CACKE
13460 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13470 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  Returning token 
13480 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72 6e 61  present (interna
13490 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09 09 72  l token)");....r
134a0 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53  eturn(CACKEY_PCS
134b0 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
134c0 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
134d0 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
134e0 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73  y_connect_card(s
134f0 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73 63 5f  lot);..if (pcsc_
13500 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43  connect_ret != C
13510 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29  ACKEY_PCSC_S_OK)
13520 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
13530 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
13540 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f 20 63   to connect to c
13550 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  ard, returning t
13560 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a 0a  oken absent");..
13570 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
13580 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
13590 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f 6c 65  NT);..}...atr_le
135a0 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72 29 3b  n = sizeof(atr);
135b0 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53  ..status_ret = S
135c0 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d  CardStatus(slot-
135d0 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c  >pcsc_card, NULL
135e0 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26  , &reader_len, &
135f0 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c  state, &protocol
13600 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29  , atr, &atr_len)
13610 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72  ;...if (status_r
13620 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 49 4e  et == SCARD_E_IN
13630 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20 7b 0a  VALID_HANDLE) {.
13640 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
13650 52 49 4e 54 46 28 22 53 43 61 72 64 53 74 61 74  RINTF("SCardStat
13660 75 73 28 29 20 72 65 74 75 72 6e 65 64 20 53 43  us() returned SC
13670 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 48 41  ARD_E_INVALID_HA
13680 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20 69 73  NDLE, marking is
13690 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63 6f 6e   not already con
136a0 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79 69 6e  nected and tryin
136b0 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63 61 63  g again");...cac
136c0 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65  key_mark_slot_re
136d0 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 70 63  set(slot);....pc
136e0 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d  sc_connect_ret =
136f0 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
13700 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09 69 66  card(slot);...if
13710 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72   (pcsc_connect_r
13720 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
13730 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43  C_S_OK) {....CAC
13740 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13750 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e  ("Unable to conn
13760 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72 65 74  ect to card, ret
13770 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61 62 73  urning token abs
13780 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74 75 72  ent");.....retur
13790 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
137a0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
137b0 7d 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d 20 73  }....atr_len = s
137c0 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09 73 74  izeof(atr);...st
137d0 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64  atus_ret = SCard
137e0 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73  Status(slot->pcs
137f0 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72  c_card, NULL, &r
13800 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74  eader_len, &stat
13810 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74  e, &protocol, at
13820 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 7d  r, &atr_len);..}
13830 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f 72 65  ...if (status_re
13840 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
13850 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b 65 79  CESS) {...cackey
13860 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
13870 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20 28 73  (slot);....if (s
13880 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53 43 41  tatus_ret == SCA
13890 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52 44 29  RD_W_RESET_CARD)
138a0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
138b0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73 65 74  UG_PRINTF("Reset
138c0 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65 61 73   required, pleas
138d0 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09  e hold...");....
138e0 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65  .scard_reconn_re
138f0 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e  t = cackey_recon
13900 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20  nect_card(slot, 
13910 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
13920 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  0 | SCARD_PROTOC
13930 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c  OL_T1, &protocol
13940 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  );....if (scard_
13950 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43  reconn_ret == SC
13960 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
13970 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70  ...../* Update p
13980 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73  rotocol */.....s
13990 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20  lot->protocol = 
139a0 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09 09 2f  protocol;....../
139b0 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68 20 74  * Re-establish t
139c0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 69  ransaction, if i
139d0 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 2a 2f  t was present */
139e0 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d 3e 74  .....if (slot->t
139f0 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68  ransaction_depth
13a00 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73 6c 6f   > 0) {......slo
13a10 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64  t->transaction_d
13a20 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73 6c 6f  epth--;......slo
13a30 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t->transaction_n
13a40 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31 3b  eed_hw_lock = 1;
13a50 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62 65 67  ......cackey_beg
13a60 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
13a70 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  lot);.....}.....
13a80 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13a90 49 4e 54 46 28 22 52 65 73 65 74 20 73 75 63 63  INTF("Reset succ
13aa0 65 73 73 66 75 6c 2c 20 72 65 71 75 65 72 79 69  essful, requeryi
13ab0 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 74 75 73  ng");.....status
13ac0 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74 61 74  _ret = SCardStat
13ad0 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  us(slot->pcsc_ca
13ae0 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61 64 65  rd, NULL, &reade
13af0 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c 20 26  r_len, &state, &
13b00 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c 20 26  protocol, atr, &
13b10 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09 69 66  atr_len);.....if
13b20 20 28 73 74 61 74 75 73 5f 72 65 74 20 21 3d 20   (status_ret != 
13b30 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
13b40 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
13b50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 74 69  EBUG_PRINTF("Sti
13b60 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71 75 65  ll unable to que
13b70 72 79 20 63 61 72 64 20 73 74 61 74 75 73 2c 20  ry card status, 
13b80 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  returning token 
13b90 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 53 74  absent.  SCardSt
13ba0 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20 43 41  atus() = %s", CA
13bb0 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
13bc0 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28  SCARDERR_TO_STR(
13bd0 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a 0a 09  status_ret));...
13be0 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
13bf0 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
13c00 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09 09  SENT);.....}....
13c10 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41 43  } else {.....CAC
13c20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13c30 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65 63 6f  ("Unable to reco
13c40 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
13c50 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
13c60 62 73 65 6e 74 2e 20 20 53 43 61 72 64 52 65 63  bsent.  SCardRec
13c70 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 22 2c 20  onnect() = %s", 
13c80 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
13c90 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
13ca0 52 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72  R(scard_reconn_r
13cb0 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 74 75 72  et));......retur
13cc0 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  n(CACKEY_PCSC_E_
13cd0 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a 09 09  TOKENABSENT);...
13ce0 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .}...} else {...
13cf0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13d00 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20  INTF("Unable to 
13d10 71 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75  query card statu
13d20 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b  s, returning tok
13d30 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72  en absent.  SCar
13d40 64 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c  dStatus() = %s",
13d50 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
13d60 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
13d70 54 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b  TR(status_ret));
13d80 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
13d90 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
13da0 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  BSENT);...}..}..
13db0 09 69 66 20 28 28 73 74 61 74 65 20 26 20 53 43  .if ((state & SC
13dc0 41 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d 20 53  ARD_ABSENT) == S
13dd0 43 41 52 44 5f 41 42 53 45 4e 54 29 20 7b 0a 09  CARD_ABSENT) {..
13de0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
13df0 49 4e 54 46 28 22 43 61 72 64 20 69 73 20 61 62  INTF("Card is ab
13e00 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e 67 20  sent, returning 
13e10 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b 0a  token absent");.
13e20 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
13e30 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
13e40 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ENT);..}...CACKE
13e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
13e60 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20  Returning token 
13e70 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09 72 65  present.");...re
13e80 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
13e90 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54 29  _S_TOKENPRESENT)
13ea0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f  ;.}../*. * SYNPO
13eb0 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  SIS. *     .... 
13ec0 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
13ed0 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
13ee0 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20  RETURN VALUE. * 
13ef0 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f      .... *. * NO
13f00 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20  TES. *     .... 
13f10 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73 73 69  *. */.static ssi
13f20 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ze_t cackey_pcsc
13f30 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c 61 62  _identity_to_lab
13f40 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  el(struct cackey
13f50 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a  _pcsc_identity *
13f60 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67 6e  identity, unsign
13f70 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 5f 62  ed char *label_b
13f80 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  uf, unsigned lon
13f90 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65 6e 29  g label_buf_len)
13fa0 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   {..unsigned lon
13fb0 67 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  g certificate_le
13fc0 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 65 6c 5f  n;..void *label_
13fd0 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63 65 72  asn1;..void *cer
13fe0 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74 20 78  tificate;..int x
13ff0 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 0a 09  509_read_ret;...
14000 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 69 64  certificate = id
14010 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
14020 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63 61 74  ate;..certificat
14030 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69 74 79  e_len = identity
14040 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
14050 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69 66 69  n;...if (certifi
14060 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20 7b 0a  cate_len < 0) {.
14070 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
14080 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74  ...x509_read_ret
14090 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a 65   = x509_to_subje
140a0 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c 20  ct(certificate, 
140b0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c  certificate_len,
140c0 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61 62 65   (void **) &labe
140d0 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28 78 35  l_asn1);..if (x5
140e0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
140f0 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b   {...return(-1);
14100 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f  ..}...x509_read_
14110 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f 74 6f  ret = x509_dn_to
14120 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f 61 73  _string(label_as
14130 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65  n1, x509_read_re
14140 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61 62 65  t, (char *) labe
14150 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62 75 66  l_buf, label_buf
14160 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09 69 66  _len, "CN");..if
14170 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
14180 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39 5f 72  <= 0) {...x509_r
14190 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64  ead_ret = x509_d
141a0 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65  n_to_string(labe
141b0 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61  l_asn1, x509_rea
141c0 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20  d_ret, (char *) 
141d0 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c  label_buf, label
141e0 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 3b  _buf_len, NULL);
141f0 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
14200 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09  d_ret <= 0) {...
14210 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d  .return(-1);...}
14220 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
14230 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69  EY_PARANOID.#  i
14240 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a  fdef _POSIX_SSIZ
14250 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30 39 5f  E_MAX..if (x509_
14260 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f 53 49  read_ret > _POSI
14270 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a 09  X_SSIZE_MAX) {..
14280 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14290 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61 64 5f  INTF("x509_read_
142a0 72 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  ret exceeds maxi
142b0 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
142c0 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
142d0 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78 35 30   (max = %li, x50
142e0 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25 6c 75  9_read_ret = %lu
142f0 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49  )", (long) _POSI
14300 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e  X_SSIZE_MAX, (un
14310 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78 35 30  signed long) x50
14320 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a 09 09  9_read_ret);....
14330 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23  return(-1);..}.#
14340 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
14350 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72 65 61  .return(x509_rea
14360 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  d_ret);.}../* Re
14370 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63 63 65  turns 0 on succe
14380 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ss */.static int
14390 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72   cackey_mutex_cr
143a0 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75 74 65  eate(void **mute
143b0 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d 75  x) {..pthread_mu
143c0 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f 6d  tex_t *pthread_m
143d0 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72 65  utex;..int pthre
143e0 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f 52  ad_retval;..CK_R
143f0 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 3b  V custom_retval;
14400 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14410 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
14420 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65 79  );...if ((cackey
14430 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43 4b  _args.flags & CK
14440 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b 29  F_OS_LOCKING_OK)
14450 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49   == CKF_OS_LOCKI
14460 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72 65  NG_OK) {...pthre
14470 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c 6c 6f  ad_mutex = mallo
14480 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72 65 61  c(sizeof(*pthrea
14490 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69 66 20  d_mutex));...if 
144a0 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65 78 29  (!pthread_mutex)
144b0 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
144c0 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69 6c 65  UG_PRINTF("Faile
144d0 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65  d to allocate me
144e0 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72 65 74  mory.");.....ret
144f0 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
14500 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 3d  pthread_retval =
14510 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69   pthread_mutex_i
14520 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75 74 65  nit(pthread_mute
14530 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66 20 28  x, NULL);...if (
14540 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
14550 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
14560 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
14570 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69  thread_mutex_ini
14580 74 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  t() returned err
14590 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
145a0 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
145b0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
145c0 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74 68 72  ...*mutex = pthr
145d0 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20 65 6c  ead_mutex;..} el
145e0 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  se {...if (cacke
145f0 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
14600 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f 6d 5f  ex) {....custom_
14610 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
14620 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78  args.CreateMutex
14630 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66 20  (mutex);.....if 
14640 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20 21  (custom_retval !
14650 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09 09  = CKR_OK) {.....
14660 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
14670 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67 73  NTF("cackey_args
14680 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29 20 72  .CreateMutex() r
14690 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25  eturned error (%
146a0 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75  li).", (long) cu
146b0 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  stom_retval);...
146c0 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
146d0 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43  ..}...}..}...CAC
146e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
146f0 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65  ("Returning suce
14700 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a  ssfully (0)");..
14710 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f  .return(0);.}../
14720 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73  * Returns 0 on s
14730 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63  uccess */.static
14740 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65   int cackey_mute
14750 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75 74  x_lock(void *mut
14760 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f 6d  ex) {..pthread_m
14770 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64 5f  utex_t *pthread_
14780 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68 72  mutex;..int pthr
14790 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  ead_retval;..CK_
147a0 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  RV custom_retval
147b0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
147c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
147d0 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b 65  ");...if ((cacke
147e0 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20 43  y_args.flags & C
147f0 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f 4b  KF_OS_LOCKING_OK
14800 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b  ) == CKF_OS_LOCK
14810 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68 72  ING_OK) {...pthr
14820 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74 65  ead_mutex = mute
14830 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72 65  x;....pthread_re
14840 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f 6d  tval = pthread_m
14850 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72 65 61  utex_lock(pthrea
14860 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66 20 28  d_mutex);...if (
14870 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 20 21  pthread_retval !
14880 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  = 0) {....CACKEY
14890 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 70  _DEBUG_PRINTF("p
148a0 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63  thread_mutex_loc
148b0 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65 72 72  k() returned err
148c0 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68 72 65  or (%i).", pthre
148d0 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09  ad_retval);.....
148e0 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a  return(-1);...}.
148f0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28  .} else {...if (
14900 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b  cackey_args.Lock
14910 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74  Mutex) {....cust
14920 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  om_retval = cack
14930 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
14940 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69 66  x(mutex);.....if
14950 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 20   (custom_retval 
14960 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 09  != CKR_OK) {....
14970 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
14980 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72 67  INTF("cackey_arg
14990 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20 72 65  s.LockMutex() re
149a0 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28 25 6c  turned error (%l
149b0 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73  i).", (long) cus
149c0 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09  tom_retval);....
149d0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
149e0 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b  .}...}..}...CACK
149f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14a00 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63 65 73  "Returning suces
14a10 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09  sfully (0)");...
14a20 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a 2f 2a  return(0);.}../*
14a30 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75   Returns 0 on su
14a40 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20  ccess */.static 
14a50 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  int cackey_mutex
14a60 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d 75  _unlock(void *mu
14a70 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f  tex) {..pthread_
14a80 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64  mutex_t *pthread
14a90 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68  _mutex;..int pth
14aa0 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  read_retval;..CK
14ab0 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  _RV custom_retva
14ac0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
14ad0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
14ae0 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b  .");...if ((cack
14af0 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20  ey_args.flags & 
14b00 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
14b10 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  K) == CKF_OS_LOC
14b20 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68  KING_OK) {...pth
14b30 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75 74  read_mutex = mut
14b40 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f 72  ex;....pthread_r
14b50 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64 5f  etval = pthread_
14b60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 74 68  mutex_unlock(pth
14b70 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69  read_mutex);...i
14b80 66 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61  f (pthread_retva
14b90 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43  l != 0) {....CAC
14ba0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14bb0 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f  ("pthread_mutex_
14bc0 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72 6e 65  unlock() returne
14bd0 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22 2c 20  d error (%i).", 
14be0 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c 29 3b  pthread_retval);
14bf0 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14c00 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
14c10 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72 67 73  .if (cackey_args
14c20 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20 7b 0a  .UnlockMutex) {.
14c30 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  ...custom_retval
14c40 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73 2e 55   = cackey_args.U
14c50 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74 65 78  nlockMutex(mutex
14c60 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73 74 6f  );.....if (custo
14c70 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b 52 5f  m_retval != CKR_
14c80 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  OK) {.....CACKEY
14c90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63  _DEBUG_PRINTF("c
14ca0 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63  ackey_args.Unloc
14cb0 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72 6e 65  kMutex() returne
14cc0 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e 22 2c  d error (%li).",
14cd0 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d 5f 72   (long) custom_r
14ce0 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72 65 74  etval);......ret
14cf0 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a 09 09  urn(-1);....}...
14d00 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  }..}...CACKEY_DE
14d10 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
14d20 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75 6c 6c  rning sucessfull
14d30 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74 75 72  y (0)");...retur
14d40 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(0);.}..static 
14d50 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
14d60 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72   cackey_get_attr
14d70 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45 43 54  ibutes(CK_OBJECT
14d80 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63 6c 61  _CLASS objectcla
14d90 73 73 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65  ss, struct cacke
14da0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  y_pcsc_identity 
14db0 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69 67  *identity, unsig
14dc0 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74 69 74  ned long identit
14dd0 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  y_num, CK_ULONG_
14de0 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b 0a  PTR pulCount) {.
14df0 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c  .static CK_BBOOL
14e00 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a 09 73   ck_true = 1;..s
14e10 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c 20 63  tatic CK_BBOOL c
14e20 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09 73 74  k_false = 0;..st
14e30 61 74 69 63 20 43 4b 5f 54 52 55 53 54 20 63 6b  atic CK_TRUST ck
14e40 5f 74 72 75 73 74 65 64 20 3d 20 43 4b 5f 54 52  _trusted = CK_TR
14e50 55 53 54 45 44 5f 44 45 4c 45 47 41 54 4f 52 3b  USTED_DELEGATOR;
14e60 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d 61 74  ..CK_ULONG numat
14e70 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61 6c 5f  trs = 0, retval_
14e80 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54 52 49  count;..CK_ATTRI
14e90 42 55 54 45 5f 54 59 50 45 20 63 75 72 72 5f 61  BUTE_TYPE curr_a
14ea0 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f 41 54  ttr_type;..CK_AT
14eb0 54 52 49 42 55 54 45 20 63 75 72 72 5f 61 74 74  TRIBUTE curr_att
14ec0 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43 4b 5f  r, *retval;..CK_
14ed0 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65 3b  VOID_PTR pValue;
14ee0 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61 6c  ..CK_ULONG ulVal
14ef0 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a 45 43  ueLen;..CK_OBJEC
14f00 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a 65 63  T_CLASS ck_objec
14f10 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43 45 52  t_class;..CK_CER
14f20 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 63 6b  TIFICATE_TYPE ck
14f30 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70  _certificate_typ
14f40 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50 45 20  e;..CK_KEY_TYPE 
14f50 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 43 4b  ck_key_type;..CK
14f60 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d 70 42  _UTF8CHAR ucTmpB
14f70 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41 31 43  uf[1024];..SHA1C
14f80 6f 6e 74 65 78 74 20 73 68 61 31 5f 63 74 78 3b  ontext sha1_ctx;
14f90 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f 63 74  ..MD5_CTX md5_ct
14fa0 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68 61 31  x;..uint8_t sha1
14fb0 5f 68 61 73 68 5b 53 48 41 31 48 61 73 68 53 69  _hash[SHA1HashSi
14fc0 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20 6d 64  ze];..uint8_t md
14fd0 35 5f 68 61 73 68 5b 4d 44 35 48 61 73 68 53 69  5_hash[MD5HashSi
14fe0 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  ze];..unsigned c
14ff0 68 61 72 20 2a 63 65 72 74 69 66 69 63 61 74 65  har *certificate
15000 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72 74 69  ;..ssize_t certi
15010 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d 31 2c  ficate_len = -1,
15020 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
15030 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72 65 65  .int pValue_free
15040 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
15050 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 20  _PRINTF("Called 
15060 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d 20 25  (objectClass = %
15070 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d  lu, identity_num
15080 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73 69   = %lu).", (unsi
15090 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a 65 63  gned long) objec
150a0 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69 74 79  tclass, identity
150b0 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43 6f 75  _num);...*pulCou
150c0 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28 6f 62  nt = 0;...if (ob
150d0 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b 4f  jectclass != CKO
150e0 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26 20  _CERTIFICATE && 
150f0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
15100 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20 26 26  KO_PUBLIC_KEY &&
15110 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
15120 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 20  CKO_PRIVATE_KEY 
15130 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
15140 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
15150 52 55 53 54 29 20 7b 0a 09 09 43 41 43 4b 45 59  RUST) {...CACKEY
15160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
15170 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a 65 63  eturning 0 objec
15180 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76 61 6c  ts (NULL), inval
15190 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22  id object class"
151a0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c  );....return(NUL
151b0 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65 74 20  L);..}.../* Get 
151c0 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69 64 65  Cert */..if (ide
151d0 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntity == NULL) {
151e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
151f0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
15200 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
15210 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64 65 6e  L), invalid iden
15220 74 69 79 20 70 72 6f 76 69 64 65 64 22 29 3b 0a  tiy provided");.
15230 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
15240 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63 61 74  ..}...certificat
15250 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 63 65  e = identity->ce
15260 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65 72 74  rtificate;..cert
15270 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 69 64  ificate_len = id
15280 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
15290 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20 28 63  ate_len;...if (c
152a0 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d  ertificate_len =
152b0 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66 69 63  = -1 || certific
152c0 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ate == NULL) {..
152d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
152e0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
152f0 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c 4c 29  0 objects (NULL)
15300 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74 79 20  , this identity 
15310 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e  does not have an
15320 20 58 2e 35 30 39 20 63 65 72 74 69 66 69 63 61   X.509 certifica
15330 74 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  te associated wi
15340 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c 20 6e  th it and will n
15350 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09 72 65  ot work");....re
15360 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a  turn(NULL);..}..
15370 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
15380 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 41  certificate is A
15390 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58 2e 35  SN.1 encoded X.5
153a0 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  09 certificate *
153b0 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f 5f 73  /..if (x509_to_s
153c0 65 72 69 61 6c 28 63 65 72 74 69 66 69 63 61 74  erial(certificat
153d0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
153e0 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29 20 7b  en, NULL) < 0) {
153f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15400 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
15410 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
15420 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20 63 65  L), the X.509 ce
15430 72 74 69 66 69 63 61 74 65 20 61 73 73 6f 63 69  rtificate associ
15440 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 69  ated with this i
15450 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 76  dentity is not v
15460 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74 75 72  alid");....retur
15470 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  n(NULL);..}...re
15480 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36 34 3b  tval_count = 64;
15490 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c 6c 6f  ..retval = mallo
154a0 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a  c(retval_count *
154b0 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29   sizeof(*retval)
154c0 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72 5f 61  );...for (curr_a
154d0 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20 63 75  ttr_type = 0; cu
154e0 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c 20 30  rr_attr_type < 0
154f0 78 63 65 35 33 36 33 62 66 3b 20 63 75 72 72 5f  xce5363bf; curr_
15500 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b 0a 09  attr_type++) {..
15510 09 69 66 20 28 63 75 72 72 5f 61 74 74 72 5f 74  .if (curr_attr_t
15520 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20 7b 0a  ype == 0x800) {.
15530 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74 79 70  ...curr_attr_typ
15540 65 20 3d 20 30 78 63 65 35 33 36 33 30 30 3b 0a  e = 0xce536300;.
15550 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f 66 72  ..}....pValue_fr
15560 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c 75 65  ee = 0;...pValue
15570 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c   = NULL;...ulVal
15580 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47  ueLen = (CK_LONG
15590 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63 68 20  ) -1;....switch 
155a0 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29  (curr_attr_type)
155b0 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43   {....case CKA_C
155c0 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b 45 59  LASS:.....CACKEY
155d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
155e0 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
155f0 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20 28 30  ute CKA_CLASS (0
15600 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
15610 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
15620 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
15630 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c  ....ck_object_cl
15640 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c 61 73  ass = objectclas
15650 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  s;......pValue =
15660 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c 61 73   &ck_object_clas
15670 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  s;.....ulValueLe
15680 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 6f 62  n = sizeof(ck_ob
15690 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a 09 09  ject_class);....
156a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
156b0 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
156c0 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
156d0 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
156e0 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a 45 43  ong) *((CK_OBJEC
156f0 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61 6c 75  T_CLASS *) pValu
15700 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
15710 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
15720 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
15730 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
15740 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41 43 4b  _TOKEN:.....CACK
15750 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15760 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15770 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45 4e 20  ibute CKA_TOKEN 
15780 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
15790 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
157a0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
157b0 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
157c0 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75 6c 56  ck_true;.....ulV
157d0 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66  alueLen = sizeof
157e0 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09 09 09  (ck_true);......
157f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
15800 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
15810 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
15820 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
15830 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
15840 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
15850 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
15860 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
15870 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
15880 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54 45 3a  ase CKA_PRIVATE:
15890 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
158a0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
158b0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
158c0 4b 41 5f 50 52 49 56 41 54 45 20 28 30 78 25 30  KA_PRIVATE (0x%0
158d0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
158e0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
158f0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
15900 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
15910 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
15920 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
15930 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
15940 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
15950 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
15960 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
15970 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
15980 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
15990 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
159a0 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66  ..pValue = &ck_f
159b0 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75  alse;.....ulValu
159c0 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
159d0 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41  _false);......CA
159e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
159f0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
15a00 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
15a10 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15a20 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
15a30 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
15a40 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
15a50 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
15a60 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
15a70 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09  e CKA_TRUSTED:..
15a80 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15a90 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
15aa0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
15ab0 5f 54 52 55 53 54 45 44 20 28 30 78 25 30 38 6c  _TRUSTED (0x%08l
15ac0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
15ad0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
15ae0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
15af0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
15b00 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
15b10 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
15b20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
15b30 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
15b40 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
15b50 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
15b60 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
15b70 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
15b80 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56 61 6c  .....}......pVal
15b90 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
15ba0 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
15bb0 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b  sizeof(ck_true);
15bc0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
15bd0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
15be0 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25  returning %lu (%
15bf0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
15c00 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42  ed long) *((CK_B
15c10 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c  BOOL *) pValue),
15c20 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
15c30 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
15c40 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
15c50 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  ;....case CKA_MO
15c60 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09 43 41  DIFIABLE:.....CA
15c70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15c80 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
15c90 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f 44 49  tribute CKA_MODI
15ca0 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  FIABLE (0x%08lx)
15cb0 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
15cc0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
15cd0 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56 61  _type);......pVa
15ce0 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b  lue = &ck_false;
15cf0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
15d00 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73  = sizeof(ck_fals
15d10 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f  e);......CACKEY_
15d20 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
15d30 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75  .. returning %lu
15d40 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73   (%p/%lu)", (uns
15d50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43  igned long) *((C
15d60 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75  K_BBOOL *) pValu
15d70 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  e), pValue, (uns
15d80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
15d90 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
15da0 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
15db0 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41 43 4b  _LABEL:.....CACK
15dc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15dd0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15de0 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45 4c 20  ibute CKA_LABEL 
15df0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
15e00 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15e10 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
15e20 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20 44 65  ....../* XXX: De
15e30 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a 2f 0a  termine name */.
15e40 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
15e50 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61 72 20   snprintf((char 
15e60 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73 69 7a  *) ucTmpBuf, siz
15e70 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c 20 22  eof(ucTmpBuf), "
15e80 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22 2c 20  Identity #%lu", 
15e90 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15ea0 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b 0a 09  identity_num);..
15eb0 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63 54 6d  ...pValue = ucTm
15ec0 70 42 75 66 3b 0a 0a 09 09 09 09 69 66 20 28 75  pBuf;......if (u
15ed0 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73 69 7a  lValueLen >= siz
15ee0 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29 20 7b  eof(ucTmpBuf)) {
15ef0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
15f00 20 3d 20 30 3b 0a 09 09 09 09 09 70 56 61 6c 75   = 0;......pValu
15f10 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  e = NULL;.....}.
15f20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
15f30 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
15f40 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25 6c 75  eturning (%p/%lu
15f50 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  )", pValue, (uns
15f60 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
15f70 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
15f80 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
15f90 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41 43 4b  _VALUE:.....CACK
15fa0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15fb0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15fc0 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55 45 20  ibute CKA_VALUE 
15fd0 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
15fe0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15ff0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
16000 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28 6f 62  ......switch (ob
16010 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09 09 09  jectclass) {....
16020 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49 56 41  ..case CKO_PRIVA
16030 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09 43 41  TE_KEY:.......CA
16040 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16050 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
16060 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
16070 73 65 20 77 65 20 61 72 65 20 61 20 70 72 69 76  se we are a priv
16080 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09  ate key.");.....
16090 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
160a0 61 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45  ase CKO_NETSCAPE
160b0 5f 54 52 55 53 54 3a 0a 09 09 09 09 09 09 43 41  _TRUST:.......CA
160c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
160d0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
160e0 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
160f0 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73  se we are a Nets
16100 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
16110 74 22 29 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  t");........brea
16120 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43 4b 4f  k;......case CKO
16130 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09 09 09  _PUBLIC_KEY:....
16140 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
16150 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
16160 09 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
16170 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 70 75  ret = x509_to_pu
16180 62 6b 65 79 28 63 65 72 74 69 66 69 63 61 74 65  bkey(certificate
16190 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
161a0 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09  n, &pValue);....
161b0 09 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61  ....if (x509_rea
161c0 64 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a 09 09  d_ret < 0) { ...
161d0 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 4e  ......pValue = N
161e0 55 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20 65 6c  ULL;........} el
161f0 73 65 20 7b 0a 09 09 09 09 09 09 09 09 75 6c 56  se {.........ulV
16200 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
16210 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 09 09  ead_ret;........
16220 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09 09 09  }.......}.......
16230 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63 61 73  .break;......cas
16240 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  e CKO_CERTIFICAT
16250 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20  E:.......pValue 
16260 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09  = certificate;..
16270 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
16280 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  = certificate_le
16290 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b 3b  n;........break;
162a0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
162b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
162c0 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
162d0 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
162e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
162f0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16300 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
16310 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a 09 09  e CKA_ISSUER:...
16320 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16330 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
16340 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
16350 49 53 53 55 45 52 20 28 30 78 25 30 38 6c 78 29  ISSUER (0x%08lx)
16360 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
16370 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
16380 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
16390 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
163a0 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
163b0 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
163c0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
163d0 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
163e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
163f0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
16400 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
16410 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
16420 65 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65  ertificate or Ne
16430 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
16440 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
16450 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
16460 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
16470 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
16480 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
16490 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 72 28 63  x509_to_issuer(c
164a0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
164b0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
164c0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
164d0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
164e0 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
164f0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
16500 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
16510 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
16520 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
16530 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
16540 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
16550 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
16560 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c  %p/%lu", pValue,
16570 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16580 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16590 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
165a0 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55 4d  e CKA_SERIAL_NUM
165b0 42 45 52 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  BER:.....CACKEY_
165c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
165d0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
165e0 74 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e 55  te CKA_SERIAL_NU
165f0 4d 42 45 52 20 28 30 78 25 30 38 6c 78 29 20 2e  MBER (0x%08lx) .
16600 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
16610 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
16620 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
16630 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43 4b  bjectclass != CK
16640 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26 26  O_CERTIFICATE &&
16650 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20   objectclass != 
16660 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
16670 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
16680 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16690 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
166a0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
166b0 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72  we are not a cer
166c0 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65 74 73  tificate or Nets
166d0 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63  cape trust objec
166e0 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b  t");.......break
166f0 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20  ;.....}......if 
16700 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
16710 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35   >= 0) {......x5
16720 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35  09_read_ret = x5
16730 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63 65 72  09_to_serial(cer
16740 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
16750 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
16760 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
16770 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
16780 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
16790 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
167a0 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
167b0 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
167c0 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
167d0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
167e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
167f0 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
16800 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
16810 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
16820 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
16830 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
16840 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a 0a 09  e CKA_SUBJECT:..
16850 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16860 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
16870 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
16880 5f 53 55 42 4a 45 43 54 20 28 30 78 25 30 38 6c  _SUBJECT (0x%08l
16890 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
168a0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
168b0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
168c0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
168d0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
168e0 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  E) {......CACKEY
168f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
16900 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
16910 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
16920 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74  e are not a cert
16930 69 66 69 63 61 74 65 22 29 3b 0a 0a 09 09 09 09  ificate");......
16940 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
16950 09 09 09 69 66 20 28 63 65 72 74 69 66 69 63 61  ...if (certifica
16960 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09  te_len >= 0) {..
16970 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65  ....x509_read_re
16980 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62 6a  t = x509_to_subj
16990 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65 2c  ect(certificate,
169a0 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e   certificate_len
169b0 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09 09 09  , &pValue);.....
169c0 09 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72  .if (x509_read_r
169d0 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09 09 09  et < 0) {.......
169e0 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
169f0 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
16a00 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
16a10 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09  x509_read_ret;..
16a20 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09  ....}.....}.....
16a30 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16a40 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72  INTF(" ... retur
16a50 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56  ning %p/%lu", pV
16a60 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  alue, (unsigned 
16a70 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e  long) ulValueLen
16a80 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  );......break;..
16a90 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a 0a 09  ..case CKA_ID:..
16aa0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
16ab0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
16ac0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
16ad0 5f 49 44 20 28 30 78 25 30 38 6c 78 29 20 2e 2e  _ID (0x%08lx) ..
16ae0 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  .", (unsigned lo
16af0 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79  ng) curr_attr_ty
16b00 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62  pe);......if (ob
16b10 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
16b20 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54 29  _NETSCAPE_TRUST)
16b30 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
16b40 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
16b50 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e  . but not gettin
16b60 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20  g it because we 
16b70 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20 74  are a Netscape t
16b80 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a  rust object");..
16b90 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
16ba0 7d 0a 0a 09 09 09 09 75 63 54 6d 70 42 75 66 5b  }......ucTmpBuf[
16bb0 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74 79 5f  0] = ((identity_
16bc0 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29 20 26  num + 1) >> 8) &
16bd0 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54 6d 70   0xff;.....ucTmp
16be0 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65 6e 74  Buf[1] =  (ident
16bf0 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26 20 30  ity_num + 1) & 0
16c00 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  xff;......pValue
16c10 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a 09 09   = &ucTmpBuf;...
16c20 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 32  ..ulValueLen = 2
16c30 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
16c40 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
16c50 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c   returning %p/%l
16c60 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73  u", pValue, (uns
16c70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61  igned long) ulVa
16c80 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72  lueLen);......br
16c90 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41  eak;....case CKA
16ca0 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54 59 50  _CERTIFICATE_TYP
16cb0 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
16cc0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
16cd0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
16ce0 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45   CKA_CERTIFICATE
16cf0 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78 29 20  _TYPE (0x%08lx) 
16d00 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
16d10 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
16d20 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
16d30 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
16d40 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 29 20  KO_CERTIFICATE) 
16d50 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  {......CACKEY_DE
16d60 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
16d70 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67   but not getting
16d80 20 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61   it because we a
16d90 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69 66 69  re not a certifi
16da0 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09 09 62  cate.");.......b
16db0 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
16dc0 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70  ./* We only supp
16dd0 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66 69 63  ort one certific
16de0 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09 09 09  ate type */.....
16df0 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
16e00 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30 39 3b  ype = CKC_X_509;
16e10 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26  ......pValue = &
16e20 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
16e30 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ype;.....ulValue
16e40 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
16e50 63 65 72 74 69 66 69 63 61 74 65 5f 74 79 70 65  certificate_type
16e60 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
16e70 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
16e80 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 43 5f  . returning CKC_
16e90 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25 70 2f  X_509 (%lu) (%p/
16ea0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
16eb0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52   long) *((CK_CER
16ec0 54 49 46 49 43 41 54 45 5f 54 59 50 45 20 2a 29  TIFICATE_TYPE *)
16ed0 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65   pValue), pValue
16ee0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16ef0 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
16f00 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
16f10 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 3a  se CKA_KEY_TYPE:
16f20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
16f30 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
16f40 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
16f50 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30 78 25  KA_KEY_TYPE (0x%
16f60 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73  08lx) ...", (uns
16f70 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72  igned long) curr
16f80 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09  _attr_type);....
16f90 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
16fa0 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s != CKO_PRIVATE
16fb0 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74 63 6c  _KEY && objectcl
16fc0 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42 4c 49  ass != CKO_PUBLI
16fd0 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 43 41  C_KEY) {......CA
16fe0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16ff0 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20  F(" ... but not 
17000 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75  getting it becau
17010 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20  se we are not a 
17020 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09 62 72  key.");.......br
17030 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
17040 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f  /* We only suppo
17050 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70 65 20  rt one key type 
17060 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f 74 79  */.....ck_key_ty
17070 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a 0a 09  pe = CKK_RSA;...
17080 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
17090 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c  key_type;.....ul
170a0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
170b0 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29 3b 0a  f(ck_key_type);.
170c0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
170d0 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
170e0 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52 53 41  eturning CKK_RSA
170f0 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75 29 22   (%lu) (%p/%lu)"
17100 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17110 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46 49 43  ) *((CK_CERTIFIC
17120 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56 61 6c  ATE_TYPE *) pVal
17130 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
17140 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17150 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17160 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17170 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41 43 4b  A_SIGN:.....CACK
17180 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17190 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
171a0 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e 20 28  ibute CKA_SIGN (
171b0 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
171c0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
171d0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
171e0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
171f0 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
17200 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
17210 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17220 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
17230 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
17240 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
17250 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
17260 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
17270 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
17280 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73  ..if (objectclas
17290 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45  s == CKO_PRIVATE
172a0 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70 56 61  _KEY) {......pVa
172b0 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a  lue = &ck_true;.
172c0 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
172d0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
172e0 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a  );.....} else {.
172f0 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
17300 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
17310 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
17320 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09 09 09  f(ck_false);....
17330 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
17340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
17350 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
17360 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
17370 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
17380 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
17390 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
173a0 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
173b0 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
173c0 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
173d0 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09  SIGN_RECOVER:...
173e0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
173f0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
17400 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
17410 53 49 47 4e 5f 52 45 43 4f 56 45 52 20 28 30 78  SIGN_RECOVER (0x
17420 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
17430 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
17440 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
17450 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
17460 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss == CKO_NETSCA
17470 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
17480 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
17490 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
174a0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
174b0 63 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e  cause we are a N
174c0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
174d0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
174e0 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
174f0 2f 2a 20 57 65 20 63 75 72 72 65 6e 74 6c 79 20  /* We currently 
17500 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 22 53 69  only support "Si
17510 67 6e 20 77 69 74 68 20 41 70 70 65 6e 64 69 78  gn with Appendix
17520 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75 65 20  " */.....pValue 
17530 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
17540 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
17550 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a  zeof(ck_false);.
17560 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17570 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72  G_PRINTF(" ... r
17580 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70  eturning %lu (%p
17590 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65  /%lu)", (unsigne
175a0 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42  d long) *((CK_BB
175b0 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20  OOL *) pValue), 
175c0 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
175d0 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
175e0 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
175f0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44 45 43  ....case CKA_DEC
17600 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b 45 59  RYPT:.....CACKEY
17610 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
17620 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
17630 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50 54 20  ute CKA_DECRYPT 
17640 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
17650 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
17660 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
17670 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74  ......if (object
17680 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54  class == CKO_NET
17690 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09  SCAPE_TRUST) {..
176a0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
176b0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75  _PRINTF(" ... bu
176c0 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74  t not getting it
176d0 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20   because we are 
176e0 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74  a Netscape trust
176f0 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09   object");......
17700 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
17710 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
17720 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41 54  ss == CKO_PRIVAT
17730 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63 74 63  E_KEY || objectc
17740 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55 42 4c  lass == CKO_PUBL
17750 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  IC_KEY) {......p
17760 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
17770 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
17780 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
17790 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
177a0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
177b0 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
177c0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
177d0 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
177e0 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
177f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17800 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
17810 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
17820 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
17830 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
17840 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
17850 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17860 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17870 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17880 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09 09 09  A_SENSITIVE:....
17890 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
178a0 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
178b0 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 53   attribute CKA_S
178c0 45 4e 53 49 54 49 56 45 20 28 30 78 25 30 38 6c  ENSITIVE (0x%08l
178d0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
178e0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
178f0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
17900 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
17910 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
17920 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
17930 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17940 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
17950 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
17960 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
17970 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
17980 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
17990 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
179a0 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
179b0 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20  KO_PRIVATE_KEY) 
179c0 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
179d0 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 09 75  &ck_true;......u
179e0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
179f0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09  of(ck_true);....
17a00 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70  .} else {......p
17a10 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
17a20 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c  e;......ulValueL
17a30 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66  en = sizeof(ck_f
17a40 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09  alse);.....}....
17a50 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
17a60 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
17a70 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
17a80 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
17a90 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
17aa0 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
17ab0 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
17ac0 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
17ad0 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
17ae0 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52 41 43  .case CKA_EXTRAC
17af0 54 41 42 4c 45 3a 0a 09 09 09 09 43 41 43 4b 45  TABLE:.....CACKE
17b00 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17b10 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
17b20 62 75 74 65 20 43 4b 41 5f 45 58 54 52 41 43 54  bute CKA_EXTRACT
17b30 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29 20 2e  ABLE (0x%08lx) .
17b40 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ..", (unsigned l
17b50 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f 74  ong) curr_attr_t
17b60 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f  ype);......if (o
17b70 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b  bjectclass == CK
17b80 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53 54  O_NETSCAPE_TRUST
17b90 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
17ba0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17bb0 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
17bc0 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
17bd0 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65 20   are a Netscape 
17be0 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a  trust object");.
17bf0 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17c00 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  .}......if (obje
17c10 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50  ctclass == CKO_P
17c20 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a 09 09  RIVATE_KEY) {...
17c30 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f  ...pValue = &ck_
17c40 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61  false;......ulVa
17c50 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
17c60 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09 7d 20  ck_true);.....} 
17c70 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56 61 6c  else {......pVal
17c80 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09  ue = &ck_true;..
17c90 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17ca0 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65   sizeof(ck_false
17cb0 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  );.....}......CA
17cc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
17cd0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
17ce0 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
17cf0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17d00 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20   *((CK_BBOOL *) 
17d10 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
17d20 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17d30 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
17d40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
17d50 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a 09  e CKA_MODULUS:..
17d60 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17d70 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
17d80 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
17d90 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25 30 38 6c  _MODULUS (0x%08l
17da0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
17db0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
17dc0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
17dd0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
17de0 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
17df0 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
17e00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
17e10 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
17e20 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
17e30 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
17e40 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
17e50 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
17e60 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
17e70 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
17e80 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
17e90 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
17ea0 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63 65 72  9_to_modulus(cer
17eb0 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
17ec0 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61 6c  icate_len, &pVal
17ed0 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78 35  ue);......if (x5
17ee0 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30 29  09_read_ret < 0)
17ef0 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65 20   {.......pValue 
17f00 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20 65  = NULL;......} e
17f10 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56 61  lse {.......ulVa
17f20 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72 65  lueLen = x509_re
17f30 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a 09  ad_ret;......}..
17f40 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
17f50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17f60 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28 25  ... returning (%
17f70 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c  p/%lu)", pValue,
17f80 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
17f90 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
17fa0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
17fb0 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50  e CKA_PUBLIC_EXP
17fc0 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43 4b 45  ONENT:.....CACKE
17fd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
17fe0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
17ff0 62 75 74 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f  bute CKA_PUBLIC_
18000 45 58 50 4f 4e 45 4e 54 20 28 30 78 25 30 38 6c  EXPONENT (0x%08l
18010 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
18020 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
18030 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
18040 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d  f (objectclass =
18050 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
18060 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
18070 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18080 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18090 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
180a0 65 20 77 65 20 61 72 65 20 61 20 4e 65 74 73 63  e we are a Netsc
180b0 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74  ape trust object
180c0 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b  ");.......break;
180d0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28  .....}......if (
180e0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20  certificate_len 
180f0 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78 35 30  >= 0) {......x50
18100 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30  9_read_ret = x50
18110 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28 63 65  9_to_exponent(ce
18120 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69  rtificate, certi
18130 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56 61  ficate_len, &pVa
18140 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28 78  lue);......if (x
18150 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20 30  509_read_ret < 0
18160 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75 65  ) {.......pValue
18170 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d 20   = NULL;......} 
18180 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c 56  else {.......ulV
18190 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f 72  alueLen = x509_r
181a0 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d 0a  ead_ret;......}.
181b0 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45  ....}......CACKE
181c0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
181d0 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 28   ... returning (
181e0 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75 65  %p/%lu)", pValue
181f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
18200 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  ) ulValueLen);..
18210 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61  ....break;....ca
18220 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44 49 47  se CKA_TRUST_DIG
18230 49 54 41 4c 5f 53 49 47 4e 41 54 55 52 45 3a 0a  ITAL_SIGNATURE:.
18240 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
18250 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54 49 4f  T_NON_REPUDIATIO
18260 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54  N:....case CKA_T
18270 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50 48 45  RUST_KEY_ENCIPHE
18280 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65 20 43  RMENT:....case C
18290 4b 41 5f 54 52 55 53 54 5f 44 41 54 41 5f 45 4e  KA_TRUST_DATA_EN
182a0 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63  CIPHERMENT:....c
182b0 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b 45  ase CKA_TRUST_KE
182c0 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09 09 09  Y_AGREEMENT:....
182d0 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 4b  case CKA_TRUST_K
182e0 45 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a 09 09  EY_CERT_SIGN:...
182f0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
18300 43 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63 61 73  CRL_SIGN:....cas
18310 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45 52 56  e CKA_TRUST_SERV
18320 45 52 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65  ER_AUTH:....case
18330 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49 45 4e   CKA_TRUST_CLIEN
18340 54 5f 41 55 54 48 3a 0a 09 09 09 63 61 73 65 20  T_AUTH:....case 
18350 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45 5f 53  CKA_TRUST_CODE_S
18360 49 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73 65 20  IGNING:....case 
18370 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49 4c 5f  CKA_TRUST_EMAIL_
18380 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09 09 09  PROTECTION:.....
18390 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
183a0 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
183b0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 54 52  attribute CKA_TR
183c0 55 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38 6c 78  UST_... (0x%08lx
183d0 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
183e0 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
183f0 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70 56  r_type);......pV
18400 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 73 74  alue = &ck_trust
18410 65 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c  ed;.....ulValueL
18420 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74  en = sizeof(ck_t
18430 72 75 73 74 65 64 29 3b 0a 0a 09 09 09 09 43 41  rusted);......CA
18440 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
18450 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
18460 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c  g %lu (%p/%lu)",
18470 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
18480 20 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a 29 20   *((CK_TRUST *) 
18490 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c  pValue), pValue,
184a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
184b0 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09   ulValueLen);...
184c0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
184d0 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41 31 5f  e CKA_CERT_SHA1_
184e0 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b 45 59  HASH:.....CACKEY
184f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
18500 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62  equesting attrib
18510 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41  ute CKA_CERT_SHA
18520 31 5f 48 41 53 48 20 28 30 78 25 30 38 6c 78 29  1_HASH (0x%08lx)
18530 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
18540 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
18550 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
18560 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
18570 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
18580 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
18590 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
185a0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
185b0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
185c0 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e 65 74  we are not 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 53 48  k;.....}......SH
18600 41 31 52 65 73 65 74 28 26 73 68 61 31 5f 63 74  A1Reset(&sha1_ct
18610 78 29 3b 0a 09 09 09 09 53 48 41 31 49 6e 70 75  x);.....SHA1Inpu
18620 74 28 26 73 68 61 31 5f 63 74 78 2c 20 63 65 72  t(&sha1_ctx, cer
18630 74 69 66 69 63 61 74 65 2c 20 63 65 72 74 69 66  tificate, certif
18640 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09 09  icate_len);.....
18650 53 48 41 31 52 65 73 75 6c 74 28 26 73 68 61 31  SHA1Result(&sha1
18660 5f 63 74 78 2c 20 73 68 61 31 5f 68 61 73 68 29  _ctx, sha1_hash)
18670 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
18680 73 68 61 31 5f 68 61 73 68 3b 0a 09 09 09 09 75  sha1_hash;.....u
18690 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
186a0 6f 66 28 73 68 61 31 5f 68 61 73 68 29 3b 0a 0a  of(sha1_hash);..
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 70 2f 25 6c 75 22 2c  turning %p/%lu",
186e0 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e   pValue, (unsign
186f0 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65  ed long) ulValue
18700 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b  Len);......break
18710 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 43 45  ;....case CKA_CE
18720 52 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09 09 09  RT_MD5_HASH:....
18730 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
18740 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67  INTF("Requesting
18750 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 43   attribute CKA_C
18760 45 52 54 5f 4d 44 35 5f 48 41 53 48 20 28 30 78  ERT_MD5_HASH (0x
18770 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
18780 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
18790 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
187a0 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
187b0 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
187c0 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
187d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
187e0 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
187f0 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
18800 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
18810 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
18820 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
18830 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
18840 09 09 09 09 4d 44 35 49 6e 69 74 28 26 6d 64 35  ....MD5Init(&md5
18850 5f 63 74 78 29 3b 0a 09 09 09 09 4d 44 35 55 70  _ctx);.....MD5Up
18860 64 61 74 65 28 26 6d 64 35 5f 63 74 78 2c 20 63  date(&md5_ctx, c
18870 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
18880 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
18890 09 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35 5f 68  ..MD5Final(md5_h
188a0 61 73 68 2c 20 26 6d 64 35 5f 63 74 78 29 3b 0a  ash, &md5_ctx);.
188b0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 6d 64  .....pValue = md
188c0 35 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c 56 61  5_hash;.....ulVa
188d0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
188e0 6d 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09 09 09  md5_hash);......
188f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18900 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18910 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61  ing %p/%lu", pVa
18920 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
18930 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
18940 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
18950 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09 70 56  .default:.....pV
18960 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  alue = NULL;....
18970 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
18980 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09 09 09  K_LONG) -1;.....
18990 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66  break;...}....if
189a0 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75 6c 56   (((CK_LONG) ulV
189b0 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28 43 4b  alueLen) != ((CK
189c0 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a 09 09  _LONG) -1)) {...
189d0 09 2f 2a 20 50 75 73 68 20 63 75 72 72 5f 61 74  ./* Push curr_at
189e0 74 72 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  tr onto the stac
189f0 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61 74 74  k */....curr_att
18a00 72 2e 74 79 70 65 20 3d 20 63 75 72 72 5f 61 74  r.type = curr_at
18a10 74 72 5f 74 79 70 65 3b 0a 09 09 09 63 75 72 72  tr_type;....curr
18a20 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e  _attr.ulValueLen
18a30 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a   = ulValueLen;..
18a40 09 09 09 63 75 72 72 5f 61 74 74 72 2e 70 56 61  ...curr_attr.pVa
18a50 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63 75 72  lue = malloc(cur
18a60 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65  r_attr.ulValueLe
18a70 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28 63 75  n);....memcpy(cu
18a80 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65 2c 20  rr_attr.pValue, 
18a90 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61 74 74  pValue, curr_att
18aa0 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a  r.ulValueLen);..
18ab0 09 09 09 69 66 20 28 70 56 61 6c 75 65 5f 66 72  ...if (pValue_fr
18ac0 65 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a  ee && pValue) {.
18ad0 09 09 09 09 66 72 65 65 28 70 56 61 6c 75 65 29  ....free(pValue)
18ae0 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6e  ;....}.....if (n
18af0 75 6d 61 74 74 72 73 20 3e 3d 20 72 65 74 76 61  umattrs >= retva
18b00 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 72  l_count) {.....r
18b10 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f 63 28  etval = realloc(
18b20 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c 5f 63  retval, retval_c
18b30 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 72  ount * sizeof(*r
18b40 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a 0a 09  etval));....}...
18b50 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76 61 6c  ..memcpy(&retval
18b60 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63 75 72  [numattrs], &cur
18b70 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66 28 63  r_attr, sizeof(c
18b80 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09 09 6e  urr_attr));....n
18b90 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d 0a 09  umattrs++;...}..
18ba0 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74 72 73  }...if (numattrs
18bb0 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74 76 61   != 0) {...retva
18bc0 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61 74 74  l_count = numatt
18bd0 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d 20 72  rs;...retval = r
18be0 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c 20 72  ealloc(retval, r
18bf0 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20 73 69  etval_count * si
18c00 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29 3b 0a  zeof(*retval));.
18c10 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72 65 65  .} else {...free
18c20 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72 65 74  (retval);....ret
18c30 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a  val = NULL;..}..
18c40 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e 75 6d  .*pulCount = num
18c50 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45 59 5f  attrs;...CACKEY_
18c60 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
18c70 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62 6a 65  turning %lu obje
18c80 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75 6d 61  cts (%p).", numa
18c90 74 74 72 73 2c 20 28 76 6f 69 64 20 2a 29 20 72  ttrs, (void *) r
18ca0 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e  etval);...return
18cb0 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61  (retval);.}..sta
18cc0 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65 79 5f  tic void cackey_
18cd0 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28  free_identities(
18ce0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
18cf0 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69  entity *identiti
18d00 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  es, unsigned lon
18d10 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75  g identities_cou
18d20 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42  nt) {..CK_ATTRIB
18d30 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
18d40 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69  .unsigned long i
18d50 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64 78 3b  d_idx, attr_idx;
18d60 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74 69 65  ...if (identitie
18d70 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69 64 65  s == NULL || ide
18d80 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20 3d 3d  ntities_count ==
18d90 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a   0) {...return;.
18da0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69 64 78  .}...for (id_idx
18db0 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c 20 69   = 0; id_idx < i
18dc0 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 3b  dentities_count;
18dd0 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 69   id_idx++) {...i
18de0 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f (identities[id
18df0 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
18e00 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74 74 72  ) {....for (attr
18e10 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72 5f 69  _idx = 0; attr_i
18e20 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65 73 5b  dx < identities[
18e30 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
18e40 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72 5f 69  es_count; attr_i
18e50 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75 72 72  dx++) {.....curr
18e60 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74 69 74  _attr = &identit
18e70 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
18e80 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64 78 5d  ibutes[attr_idx]
18e90 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72 72 5f  ;......if (curr_
18ea0 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20 7b 0a  attr->pValue) {.
18eb0 09 09 09 09 09 66 72 65 65 28 63 75 72 72 5f 61  .....free(curr_a
18ec0 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a 09 09  ttr->pValue);...
18ed0 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ..}....}.....if 
18ee0 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  (identities[id_i
18ef0 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 29 20  dx].attributes) 
18f00 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65 6e 74  {.....free(ident
18f10 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
18f20 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09 7d 0a  tributes);....}.
18f30 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
18f40 63 65 72 74 73 28 69 64 65 6e 74 69 74 69 65 73  certs(identities
18f50 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
18f60 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b 0a 09  entity, 1, 1);..
18f70 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69 64 65  .}..}...free(ide
18f80 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73 74 61  ntities);.}..sta
18f90 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  tic unsigned lon
18fa0 67 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 64 6f  g cackey_read_do
18fb0 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73 74 72  d_identities(str
18fc0 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74  uct cackey_ident
18fd0 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 2c  ity *identities,
18fe0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e   unsigned long n
18ff0 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20 7b 0a  um_dod_certs) {.
19000 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 63  .unsigned long c
19010 65 72 74 5f 69 64 78 2c 20 69 64 5f 69 64 78 20  ert_idx, id_idx 
19020 3d 20 30 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74  = 0;...if (ident
19030 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ities == NULL) {
19040 0a 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f 64 6f  ...return(num_do
19050 64 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a 09 7d  d_certs * 3);..}
19060 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
19070 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
19080 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 3b 20   num_dod_certs; 
19090 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  cert_idx++) {...
190a0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
190b0 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
190c0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65 6e 74   = NULL;...ident
190d0 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
190e0 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
190f0 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
19100 28 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45  (CKO_CERTIFICATE
19110 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73 5b 63  , &extra_certs[c
19120 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30 30 30  ert_idx], 0xf000
19130 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26 69 64   | cert_idx, &id
19140 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
19150 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  .attributes_coun
19160 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  t);...id_idx++;.
19170 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64  ...identities[id
19180 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
19190 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64  ity = NULL;...id
191a0 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d  entities[id_idx]
191b0 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61  .attributes = ca
191c0 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75  ckey_get_attribu
191d0 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b  tes(CKO_PUBLIC_K
191e0 45 59 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73  EY, &extra_certs
191f0 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30  [cert_idx], 0xf0
19200 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26  00 | cert_idx, &
19210 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19220 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
19230 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b  unt);...id_idx++
19240 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  ;....identities[
19250 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
19260 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
19270 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19280 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
19290 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
192a0 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53 43 41  butes(CKO_NETSCA
192b0 50 45 5f 54 52 55 53 54 2c 20 26 65 78 74 72 61  PE_TRUST, &extra
192c0 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64 78 5d  _certs[cert_idx]
192d0 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72 74 5f  , 0xf000 | cert_
192e0 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
192f0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
19300 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09 69 64  tes_count);...id
19310 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72 65 74  _idx++;..}...ret
19320 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d 0a 0a  urn(id_idx);.}..
19330 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61  static struct ca
19340 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 2a 63  ckey_identity *c
19350 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e 74  ackey_read_ident
19360 69 74 69 65 73 28 73 74 72 75 63 74 20 63 61 63  ities(struct cac
19370 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20  key_slot *slot, 
19380 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 2a 69  unsigned long *i
19390 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73 74 72  ds_found) {..str
193a0 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
193b0 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69  identity *pcsc_i
193c0 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74 72 75  dentities;..stru
193d0 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
193e0 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73 3b 0a  ty *identities;.
193f0 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
19400 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78 2c 20  um_ids, id_idx, 
19410 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a 09 75  curr_id_type;..u
19420 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d  nsigned long num
19430 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f 64 5f  _certs, num_dod_
19440 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64 78 3b  certs, cert_idx;
19450 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f 65 78  ..int include_ex
19460 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 0a  tra_certs = 0;..
19470 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19480 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
19490 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75 6e 64  ...if (ids_found
194a0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
194b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
194c0 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73 5f 66  F("Error.  ids_f
194d0 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29 3b 0a  ound is NULL");.
194e0 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
194f0 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b  ..}..#ifdef CACK
19500 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49 4e 43  EY_CARD_SLOT_INC
19510 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52 54 53  LUDE_EXTRA_CERTS
19520 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f  ..include_extra_
19530 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e 64 69  certs = 1;.#endi
19540 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22  f...if (getenv("
19550 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52 54 53  CACKEY_DOD_CERTS
19560 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29 20 21  _ON_HW_SLOTS") !
19570 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e 63 6c  = NULL) {...incl
19580 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74 73 20  ude_extra_certs 
19590 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28 67 65  = 1;..}...if (ge
195a0 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f 5f  tenv("CACKEY_NO_
195b0 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48 57 5f  DOD_CERTS_ON_HW_
195c0 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29  SLOTS") != NULL)
195d0 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65 78 74   {...include_ext
195e0 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a 09 7d  ra_certs = 0;..}
195f0 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28 22 43  ...if (getenv("C
19600 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41 5f 43  ACKEY_NO_EXTRA_C
19610 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c 29 20  ERTS") != NULL) 
19620 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  {...num_dod_cert
19630 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65 20 7b  s = 0;..} else {
19640 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73  ...num_dod_certs
19650 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72 61 5f   = sizeof(extra_
19660 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f 66 28  certs) / sizeof(
19670 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d 29 3b  extra_certs[0]);
19680 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e  ..}...if (slot->
19690 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 6e 75  internal) {...nu
196a0 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79 5f 72  m_ids = cackey_r
196b0 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69 74 69  ead_dod_identiti
196c0 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64 6f 64  es(NULL, num_dod
196d0 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66 20 28  _certs);....if (
196e0 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20 7b 0a  num_ids != 0) {.
196f0 09 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20  ...identities = 
19700 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a  malloc(num_ids *
19710 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74   sizeof(*identit
19720 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63 6b 65  ies));.....cacke
19730 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
19740 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73  ities(identities
19750 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29  , num_dod_certs)
19760 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
19770 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c  identities = NUL
19780 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73 5f 66  L;...}....*ids_f
19790 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a  ound = num_ids;.
197a0 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69  ...return(identi
197b0 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63 73 63  ties);..}...pcsc
197c0 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20 63 61  _identities = ca
197d0 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74 73 28  ckey_read_certs(
197e0 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e 75 6d  slot, NULL, &num
197f0 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28 70 63  _certs);..if (pc
19800 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 21 3d  sc_identities !=
19810 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20 43 6f   NULL) {.../* Co
19820 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f 66 20  nvert number of 
19830 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65 72 20  Certs to number 
19840 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 09 09  of objects */...
19850 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f 5f 50  num_ids = (CKO_P
19860 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43 4b 4f  RIVATE_KEY - CKO
19870 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b 20 31  _CERTIFICATE + 1
19880 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b 0a 0a  ) * num_certs;..
19890 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f 65 78  ..if (include_ex
198a0 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  tra_certs) {....
198b0 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63 6b 65  num_ids += cacke
198c0 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74  y_read_dod_ident
198d0 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f  ities(NULL, num_
198e0 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a  dod_certs);...}.
198f0 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20  ...identities = 
19900 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73 20 2a  malloc(num_ids *
19910 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74   sizeof(*identit
19920 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41 64 64  ies));..../* Add
19930 20 63 65 72 74 69 66 69 63 61 74 65 73 2c 20 70   certificates, p
19940 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e 64 20  ublic keys, and 
19950 70 72 69 76 61 74 65 20 6b 65 79 73 20 66 72 6f  private keys fro
19960 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72 64 20  m the smartcard 
19970 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20 30 3b  */...id_idx = 0;
19980 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69 64 78  ...for (cert_idx
19990 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78 20 3c   = 0; cert_idx <
199a0 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65 72 74   num_certs; cert
199b0 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66 6f 72  _idx++) {....for
199c0 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3d   (curr_id_type =
199d0 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
199e0 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 20 3c  ; curr_id_type <
199f0 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
19a00 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65 2b  Y; curr_id_type+
19a10 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74 69 74  +) {.....identit
19a20 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72  ies[id_idx].attr
19a30 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65 79 5f  ibutes = cackey_
19a40 67 65 74 5f 61 74 74 72 69 62 75 74 65 73 28 63  get_attributes(c
19a50 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26 70 63  urr_id_type, &pc
19a60 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
19a70 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f 69 64  rt_idx], cert_id
19a80 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69  x, &identities[i
19a90 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65  d_idx].attribute
19aa0 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09 09 69  s_count);......i
19ab0 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
19ac0 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20  ].pcsc_identity 
19ad0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
19ae0 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  *identities[id_i
19af0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
19b00 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28  y));.....memcpy(
19b10 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19b20 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  x].pcsc_identity
19b30 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69 74 69  , &pcsc_identiti
19b40 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 73 69  es[cert_idx], si
19b50 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69 65 73  zeof(*identities
19b60 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64  [id_idx].pcsc_id
19b70 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 69  entity));......i
19b80 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
19b90 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ].pcsc_identity-
19ba0 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d 20 6d  >certificate = m
19bb0 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65 6e 74  alloc(pcsc_ident
19bc0 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e  ities[cert_idx].
19bd0 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29  certificate_len)
19be0 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69 64 65  ;.....memcpy(ide
19bf0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
19c00 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63  pcsc_identity->c
19c10 65 72 74 69 66 69 63 61 74 65 2c 20 70 63 73 63  ertificate, pcsc
19c20 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65 72 74  _identities[cert
19c30 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  _idx].certificat
19c40 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69 74 69  e, pcsc_identiti
19c50 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63 65 72  es[cert_idx].cer
19c60 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a  tificate_len);..
19c70 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a 09 09  ....id_idx++;...
19c80 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 6e  .}...}....if (in
19c90 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
19ca0 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  s) {....CACKEY_D
19cb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 63  EBUG_PRINTF("Inc
19cc0 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65 72 6e  luding US Govern
19cd0 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61 74 65  ment Certificate
19ce0 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20 73 6c  s on hardware sl
19cf0 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ot");.....cackey
19d00 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
19d10 74 69 65 73 28 69 64 65 6e 74 69 74 69 65 73 20  ties(identities 
19d20 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f 64 6f  + id_idx, num_do
19d30 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a 0a 09  d_certs);...}...
19d40 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72  .cackey_free_cer
19d50 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74 69  ts(pcsc_identiti
19d60 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20 31  es, num_certs, 1
19d70 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75 6e 64  );....*ids_found
19d80 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09 09 72   = num_ids;....r
19d90 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69 65 73  eturn(identities
19da0 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f 66 6f  );..}....*ids_fo
19db0 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  und = 0;..return
19dc0 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  (NULL);.}..CK_DE
19dd0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
19de0 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c 69 7a  _RV, C_Initializ
19df0 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70  e)(CK_VOID_PTR p
19e00 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43 4b 5f  InitArgs) {..CK_
19e10 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41 52 47  C_INITIALIZE_ARG
19e20 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b 0a 09  S CK_PTR args;..
19e30 75 69 6e 74 33 32 5f 74 20 69 64 78 2c 20 68 69  uint32_t idx, hi
19e40 67 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69 6e 74  ghest_slot;..int
19e50 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 3b   mutex_init_ret;
19e60 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19e70 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
19e80 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  );...if (cackey_
19e90 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
19ea0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
19eb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 41 6c  INTF("Error.  Al
19ec0 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69 7a 65  ready initialize
19ed0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
19ee0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41 4c 52  CKR_CRYPTOKI_ALR
19ef0 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a 45 44  EADY_INITIALIZED
19f00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49 6e 69  );..}...if (pIni
19f10 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  tArgs != NULL) {
19f20 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69 74 41  ...args = pInitA
19f30 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28 26 63  rgs;...memcpy(&c
19f40 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72 67 73  ackey_args, args
19f50 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  , sizeof(cackey_
19f60 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20 28 61  args));....if (a
19f70 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74 65 78  rgs->CreateMutex
19f80 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
19f90 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78 20 3d  ->DestroyMutex =
19fa0 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e  = NULL || args->
19fb0 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c  LockMutex == NUL
19fc0 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c 6f 63  L || args->Unloc
19fd0 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c 29 20  kMutex == NULL) 
19fe0 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d 3e 43  {....if (args->C
19ff0 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20 4e 55  reateMutex != NU
1a000 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65 73 74  LL || args->Dest
1a010 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c  royMutex != NULL
1a020 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b 4d 75   || args->LockMu
1a030 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 61  tex != NULL || a
1a040 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74 65 78  rgs->UnlockMutex
1a050 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
1a060 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1a070 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f 6d 65  NTF("Error. Some
1a080 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20 74 68  , but not All th
1a090 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74 69 76  reading primitiv
1a0a0 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29 3b 0a  es provided.");.
1a0b0 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
1a0c0 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a  ARGUMENTS_BAD);.
1a0d0 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c 73 65  ...}...}..} else
1a0e0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72 67 73   {...cackey_args
1a0f0 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d 20 4e  .CreateMutex = N
1a100 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 61 72  ULL;...cackey_ar
1a110 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65 78 20  gs.DestroyMutex 
1a120 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1a130 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 20  _args.LockMutex 
1a140 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79  = NULL;...cackey
1a150 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65  _args.UnlockMute
1a160 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
1a170 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 3d 20  ey_args.flags = 
1a180 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  0;..}...for (idx
1a190 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
1a1a0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1a1b0 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
1a1c0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
1a1d0 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 63  )); idx++) {...c
1a1e0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1a1f0 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a  dx].active = 0;.
1a200 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
1a210 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  0; idx < (sizeof
1a220 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1a230 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1a240 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78 2b 2b  lots[0])); idx++
1a250 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ) {...cackey_slo
1a260 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d  ts[idx].active =
1a270 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1a280 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65 61  ts[idx].pcsc_rea
1a290 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  der = NULL;...ca
1a2a0 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e  ckey_slots[idx].
1a2b0 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
1a2c0 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  h = 0;...cackey_
1a2d0 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
1a2e0 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c  action_need_hw_l
1a2f0 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  ock = 0;...cacke
1a300 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73 6c 6f  y_slots[idx].slo
1a310 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 09 63  t_reset = 0;...c
1a320 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d  ackey_slots[idx]
1a330 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30  .token_flags = 0
1a340 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
1a350 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55  [idx].label = NU
1a360 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f  LL;...cackey_slo
1a370 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c  ts[idx].internal
1a380 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 67   = 0;..}...if (g
1a390 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e 4f  etenv("CACKEY_NO
1a3a0 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29 20 21  _EXTRA_CERTS") !
1a3b0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1a3c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1a3d0 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20 69 6e  "Asked not to in
1a3e0 63 6c 75 64 65 20 44 6f 44 20 63 65 72 74 69 66  clude DoD certif
1a3f0 69 63 61 74 65 73 22 29 3b 0a 09 7d 20 65 6c 73  icates");..} els
1a400 65 20 7b 0a 09 09 68 69 67 68 65 73 74 5f 73 6c  e {...highest_sl
1a410 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  ot = (sizeof(cac
1a420 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1a430 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1a440 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09 43 41  [0])) - 1;....CA
1a450 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a460 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 44 6f 44  F("Including DoD
1a470 20 63 65 72 74 73 20 69 6e 20 73 6c 6f 74 20 25   certs in slot %
1a480 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lu", (unsigned l
1a490 6f 6e 67 29 20 68 69 67 68 65 73 74 5f 73 6c 6f  ong) highest_slo
1a4a0 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c  t);....cackey_sl
1a4b0 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
1a4c0 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09  ].active = 1;...
1a4d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67  cackey_slots[hig
1a4e0 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74 65 72  hest_slot].inter
1a4f0 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63 6b 65  nal = 1;...cacke
1a500 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f  y_slots[highest_
1a510 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20 28 75  slot].label = (u
1a520 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1a530 22 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74 20 43  "US Government C
1a540 65 72 74 69 66 69 63 61 74 65 73 22 3b 0a 09 09  ertificates";...
1a550 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67  cackey_slots[hig
1a560 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73 63 5f  hest_slot].pcsc_
1a570 72 65 61 64 65 72 20 3d 20 22 43 41 43 4b 65 79  reader = "CACKey
1a580 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  ";...cackey_slot
1a590 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e  s[highest_slot].
1a5a0 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 30 3b  token_flags = 0;
1a5b0 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69 6e 69  ..}...cackey_ini
1a5c0 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 09  tialized = 1;...
1a5d0 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69 67 6c  if (!cackey_bigl
1a5e0 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09 6d 75  ock_init) {...mu
1a5f0 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d 20 63  tex_init_ret = c
1a600 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72 65 61  ackey_mutex_crea
1a610 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67 6c 6f  te(&cackey_biglo
1a620 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75 74 65  ck);....if (mute
1a630 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20 30 29  x_init_ret != 0)
1a640 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1a650 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1a660 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69 61 6c  .  Mutex initial
1a670 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64 2e 22  ization failed."
1a680 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b  );.....return(CK
1a690 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a 09 09  R_CANT_LOCK);...
1a6a0 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69 67 6c  }....cackey_bigl
1a6b0 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a 09 7d  ock_init = 1;..}
1a6c0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a6d0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1a6e0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1a6f0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1a700 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
1a710 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
1a720 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61 6c 69  (CK_RV, C_Finali
1a730 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52 20  ze)(CK_VOID_PTR 
1a740 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09 75 69  pReserved) {..ui
1a750 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09 43 41  nt32_t idx;...CA
1a760 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1a770 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1a780 69 66 20 28 70 52 65 73 65 72 76 65 64 20 21 3d  if (pReserved !=
1a790 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
1a7a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1a7b0 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76 65 64  Error. pReserved
1a7c0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
1a7d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1a7e0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1a7f0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1a800 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1a810 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1a820 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1a830 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1a840 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1a850 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1a860 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1a870 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64  for (idx = 0; id
1a880 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  x < (sizeof(cack
1a890 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1a8a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1a8b0 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64 78 2b  sions[0])); idx+
1a8c0 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b 65  +) {...if (cacke
1a8d0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1a8e0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43 5f 43  active) {....C_C
1a8f0 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64 78 29  loseSession(idx)
1a900 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63 6b 65  ;...}..}...cacke
1a910 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65  y_slots_disconne
1a920 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f 72 20  ct_all();...for 
1a930 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
1a940 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
1a950 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  lots) / sizeof(c
1a960 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29  ackey_slots[0]))
1a970 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20  ; idx++) {...if 
1a980 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  (cackey_slots[id
1a990 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09  x].internal) {..
1a9a0 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d 0a  ..continue;...}.
1a9b0 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
1a9c0 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72 65  ots[idx].pcsc_re
1a9d0 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65 65 28  ader) {....free(
1a9e0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1a9f0 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29 3b 0a  ].pcsc_reader);.
1aa00 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65  ..}....if (cacke
1aa10 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63 61 63  y_slots[idx].cac
1aa20 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 09  hed_certs) {....
1aa30 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74  cackey_free_cert
1aa40 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  s(cackey_slots[i
1aa50 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
1aa60 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  , cackey_slots[i
1aa70 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
1aa80 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09 09 09  _count, 1);.....
1aa90 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1aaa0 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73 20 3d  ].cached_certs =
1aab0 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a 0a 09   NULL;...}..}...
1aac0 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
1aad0 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61 63 6b  onnect();...cack
1aae0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ey_initialized =
1aaf0 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
1ab00 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
1ab10 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
1ab20 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
1ab30 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
1ab40 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1ab50 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1ab60 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f 50 54  Info)(CK_INFO_PT
1ab70 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74 61 74  R pInfo) {..stat
1ab80 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 6d  ic CK_UTF8CHAR m
1ab90 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b 5d 20  anufacturerID[] 
1aba0 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e 6d 65  = "U.S. Governme
1abb0 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43 4b 5f  nt";..static CK_
1abc0 55 54 46 38 43 48 41 52 20 6c 69 62 72 61 72 79  UTF8CHAR library
1abd0 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20  Description[] = 
1abe0 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41 43 4b  "CACKey";...CACK
1abf0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ac00 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1ac10 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
1ac20 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1ac30 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1ac40 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
1ac50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ac60 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1ac70 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1ac80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1ac90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1aca0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1acb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1acc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1acd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ace0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1acf0 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b  ..pInfo->cryptok
1ad00 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d  iVersion.major =
1ad10 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f   ((CACKEY_CRYPTO
1ad20 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29  KI_VERSION_CODE)
1ad30 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a   >> 16) & 0xff;.
1ad40 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f 6b 69  .pInfo->cryptoki
1ad50 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1ad60 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b  ((CACKEY_CRYPTOK
1ad70 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45 29 20  I_VERSION_CODE) 
1ad80 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1ad90 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d 61  memset(pInfo->ma
1ada0 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27 20  nufacturerID, ' 
1adb0 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d  ', sizeof(pInfo-
1adc0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1add0 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1ade0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1adf0 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  , manufacturerID
1ae00 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66 61 63  , sizeof(manufac
1ae10 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b 0a 0a  turerID) - 1);..
1ae20 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
1ae30 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74 28 70  0x00;...memset(p
1ae40 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73  Info->libraryDes
1ae50 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
1ae60 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 69 62  izeof(pInfo->lib
1ae70 72 61 72 79 44 65 73 63 72 69 70 74 69 6f 6e 29  raryDescription)
1ae80 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  );..memcpy(pInfo
1ae90 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72 69 70  ->libraryDescrip
1aea0 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44 65 73  tion, libraryDes
1aeb0 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65 6f 66  cription, sizeof
1aec0 28 6c 69 62 72 61 72 79 44 65 73 63 72 69 70 74  (libraryDescript
1aed0 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70 49 6e  ion) - 1);...pIn
1aee0 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72 73 69  fo->libraryVersi
1aef0 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61 63 6b  on.major = (cack
1af00 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1af10 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b 0a 09  >> 16) & 0xff;..
1af20 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65  pInfo->libraryVe
1af30 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63  rsion.minor = (c
1af40 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e  ackey_getversion
1af50 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b  () >> 8) & 0xff;
1af60 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1af70 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1af80 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1af90 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
1afa0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a  n(CKR_OK);.}../*
1afb0 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69 73 74  . * Process list
1afc0 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61 6e 64   of readers, and
1afd0 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e 67 20   create mapping 
1afe0 62 65 74 77 65 65 6e 20 72 65 61 64 65 72 20 6e  between reader n
1aff0 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49 44 0a  ame and slot ID.
1b000 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
1b010 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1b020 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43 4b 5f  GetSlotList)(CK_
1b030 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65 73 65  BBOOL tokenPrese
1b040 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50  nt, CK_SLOT_ID_P
1b050 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20 43 4b  TR pSlotList, CK
1b060 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 43 6f  _ULONG_PTR pulCo
1b070 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63 20 69  unt) {..static i
1b080 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c 20 3d 20  nt first_call = 
1b090 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  1;..int mutex_re
1b0a0 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73 63 5f  tval;..int pcsc_
1b0b0 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 43 4b  connect_ret;..CK
1b0c0 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20 73 6c  _ULONG count, sl
1b0d0 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20 63 75  ot_count = 0, cu
1b0e0 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69 64 78  rrslot, slot_idx
1b0f0 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65  ;..char *pcsc_re
1b100 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72 65 61  aders, *pcsc_rea
1b110 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f 72 65  ders_s, *pcsc_re
1b120 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52 44 20  aders_e;..DWORD 
1b130 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1b140 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 6c 69  ;..LONG scard_li
1b150 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b 0a 09  streaders_ret;..
1b160 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65 61 64  size_t curr_read
1b170 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73 6c 6f  er_len;..int slo
1b180 74 5f 72 65 73 65 74 3b 0a 0a 09 43 41 43 4b 45  t_reset;...CACKE
1b190 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1b1a0 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1b1b0 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  (pulCount == NUL
1b1c0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1b1d0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b1e0 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73 20 4e  r. pulCount is N
1b1f0 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  ULL.");....retur
1b200 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f  n(CKR_ARGUMENTS_
1b210 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21  BAD);..}...if (!
1b220 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
1b230 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
1b240 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1b250 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
1b260 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
1b270 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
1b280 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
1b290 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
1b2a0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
1b2b0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
1b2c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
1b2d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
1b2e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b2f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b300 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
1b310 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b320 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
1b330 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65 61 72  );..}.../* Clear
1b340 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 2a   list of slots *
1b350 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20  /..slot_reset = 
1b360 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  0;..if (pSlotLis
1b370 74 29 20 7b 0a 09 09 69 66 20 28 66 69 72 73 74  t) {...if (first
1b380 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69 72 73  _call) {....firs
1b390 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09 09 09  t_call = 0;.....
1b3a0 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31 3b 0a  slot_reset = 1;.
1b3b0 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61 6e 79  ..}..../* If any
1b3c0 20 6f 66 20 74 68 65 20 73 6c 6f 74 73 20 68 61   of the slots ha
1b3d0 76 65 20 62 65 65 6e 20 72 65 73 65 74 20 74 68  ve been reset th
1b3e0 65 6e 20 70 75 72 67 65 20 61 6c 6c 20 69 6e 66  en purge all inf
1b3f0 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63 68 65  ormation and che
1b400 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09 66 6f  ck again */...fo
1b410 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b  r (currslot = 0;
1b420 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a   currslot < (siz
1b430 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1b440 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1b450 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75  y_slots[0])); cu
1b460 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 69  rrslot++) {....i
1b470 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1b480 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
1b490 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e  al) {.....contin
1b4a0 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ue;....}.....if 
1b4b0 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1b4c0 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1b4d0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
1b4e0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 63 61  ....}.....if (ca
1b4f0 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1b500 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65 74 29  lot].slot_reset)
1b510 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65 73 65   {.....slot_rese
1b520 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72 65 61  t = 1;......brea
1b530 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  k;....}...}....i
1b540 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  f (slot_reset) {
1b550 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1b560 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69 6e 67  _PRINTF("Purging
1b570 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   all slot inform
1b580 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09 2f 2a  ation.");...../*
1b590 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74 68 65   Only update the
1b5a0 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73 20 69   list of slots i
1b5b0 66 20 77 65 20 61 72 65 20 61 63 74 75 61 6c 6c  f we are actuall
1b5c0 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79 20 74  y being supply t
1b5d0 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74  he slot informat
1b5e0 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65 79  ion */....cackey
1b5f0 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e 65 63  _slots_disconnec
1b600 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66 6f 72  t_all();.....for
1b610 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20   (currslot = 0; 
1b620 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65  currslot < (size
1b630 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1b640 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1b650 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72  _slots[0])); cur
1b660 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 69  rslot++) {.....i
1b670 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1b680 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e  currslot].intern
1b690 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e 74 69  al) {......conti
1b6a0 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  nue;.....}......
1b6b0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
1b6c0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1b6d0 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09 09 66  reader) {......f
1b6e0 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ree(cackey_slots
1b6f0 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f  [currslot].pcsc_
1b700 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09 09 63  reader);.......c
1b710 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1b720 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65  slot].pcsc_reade
1b730 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 7d 0a  r = NULL;.....}.
1b740 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
1b750 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1b760 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09 09 66 72  label) {......fr
1b770 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ee(cackey_slots[
1b780 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65 6c 29  currslot].label)
1b790 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ;.......cackey_s
1b7a0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1b7b0 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  abel = NULL;....
1b7c0 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  .}......cackey_s
1b7d0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1b7e0 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09 7d 0a  ctive = 0;....}.
1b7f0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 0a 09  ..} else {......
1b800 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  .}..}.../* Deter
1b810 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72 65 61  mine list of rea
1b820 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f 63 6f  ders */..pcsc_co
1b830 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b  nnect_ret = cack
1b840 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
1b850 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e  );..if (pcsc_con
1b860 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b  nect_ret != CACK
1b870 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
1b880 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1b890 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f  RINTF("Connectio
1b8a0 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65  n to PC/SC faile
1b8b0 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 73  d, assuming no s
1b8c0 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f 74 5f  lots");....slot_
1b8d0 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20 65 6c  count = 0;..} el
1b8e0 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65 61 64  se {...pcsc_read
1b8f0 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 09  ers_len = 0;....
1b900 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1b910 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c 69 73  s_ret = SCardLis
1b920 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b 65 79  tReaders(*cackey
1b930 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 4e 55  _pcsc_handle, NU
1b940 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73 63 5f  LL, NULL, &pcsc_
1b950 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 0a 09  readers_len);...
1b960 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73 74 72  .if (scard_listr
1b970 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20 53 43  eaders_ret == SC
1b980 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f 52  ARD_F_COMM_ERROR
1b990 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
1b9a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b9b0 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65 61 64  r. SCardListRead
1b9c0 65 72 73 28 29 20 72 65 74 75 72 6e 65 64 20 53  ers() returned S
1b9d0 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52 4f  CARD_F_COMM_ERRO
1b9e0 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f 6e 6e  R, assuming Conn
1b9f0 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20  ection to PC/SC 
1ba00 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63 6f 6e  went away. Recon
1ba10 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09 09 09  necting.");.....
1ba20 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69 73 63  cackey_pcsc_disc
1ba30 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63 61 63  onnect();....cac
1ba40 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74  key_pcsc_connect
1ba50 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ();.....CACKEY_D
1ba60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 79  EBUG_PRINTF("Try
1ba70 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52 65 61  ing SCardListRea
1ba80 64 65 72 73 28 29 20 61 67 61 69 6e 22 29 3b 0a  ders() again");.
1ba90 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1baa0 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1bab0 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1bac0 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1bad0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63   NULL, NULL, &pc
1bae0 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b  sc_readers_len);
1baf0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63 61 72  ...}....if (scar
1bb00 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1bb10 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t == SCARD_S_SUC
1bb20 43 45 53 53 20 26 26 20 70 63 73 63 5f 72 65 61  CESS && pcsc_rea
1bb30 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29 20 7b  ders_len != 0) {
1bb40 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65 72 73  ....pcsc_readers
1bb50 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 72   = malloc(pcsc_r
1bb60 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09  eaders_len);....
1bb70 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73 20 3d  pcsc_readers_s =
1bb80 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b 0a 0a   pcsc_readers;..
1bb90 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61  ...scard_listrea
1bba0 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64  ders_ret = SCard
1bbb0 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63  ListReaders(*cac
1bbc0 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
1bbd0 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65 61 64   NULL, pcsc_read
1bbe0 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61 64 65  ers, &pcsc_reade
1bbf0 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66 20 28  rs_len);....if (
1bc00 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1bc10 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53  s_ret == SCARD_S
1bc20 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09 09  _SUCCESS) {.....
1bc30 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65 20 3d  pcsc_readers_e =
1bc40 20 70 63 73 63 5f 72 65 61 64 65 72 73 20 2b 20   pcsc_readers + 
1bc50 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1bc60 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72 74 20  ;....../* Start 
1bc70 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31 2c 20  with Slot ID 1, 
1bc80 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67 20 69  to avoid a bug i
1bc90 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20 2a 2f  n GDM on RHEL */
1bca0 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39 34 39  ...../* Bug 5949
1bcb0 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75 67 7a  11: https://bugz
1bcc0 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f 6d 2f  illa.redhat.com/
1bcd0 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69 64 3d  show_bug.cgi?id=
1bce0 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09 63 75  594911 */.....cu
1bcf0 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09 09 09  rrslot = 1;.....
1bd00 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  slot_count = 0;.
1bd10 09 09 09 09 77 68 69 6c 65 20 28 70 63 73 63 5f  ....while (pcsc_
1bd20 72 65 61 64 65 72 73 20 3c 20 70 63 73 63 5f 72  readers < pcsc_r
1bd30 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09 09  eaders_e) {.....
1bd40 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20 61 76  ./* Find next av
1bd50 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a 2f 0a  ailable slot */.
1bd60 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75 72 72  .....for (; curr
1bd70 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63  slot < (sizeof(c
1bd80 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1bd90 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1bda0 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f  ts[0])); currslo
1bdb0 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69 66 20  t++) {.......if 
1bdc0 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1bdd0 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1bde0 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61 6b 3b   {........break;
1bdf0 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 7d 0a  .......}......}.
1be00 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61 64 65  ......curr_reade
1be10 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 70  r_len = strlen(p
1be20 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
1be30 09 09 09 09 69 66 20 28 28 70 63 73 63 5f 72 65  ....if ((pcsc_re
1be40 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72 65 61  aders + curr_rea
1be50 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73 63 5f  der_len) > pcsc_
1be60 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09 09  readers_e) {....
1be70 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1be80 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72 72 5f  .......if (curr_
1be90 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20 30 29  reader_len == 0)
1bea0 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a   {.......break;.
1beb0 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69 66 20  .....}.......if 
1bec0 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28 73 69  (currslot >= (si
1bed0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1bee0 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1bef0 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1bf00 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1bf10 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1bf20 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73 20 74  d more readers t
1bf30 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20 61 76  han slots are av
1bf40 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09 09 09  ailable!");.....
1bf50 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 7d  ...break;......}
1bf60 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45  .......CACKEY_DE
1bf70 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e  BUG_PRINTF("Foun
1bf80 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c 20 70  d reader: %s", p
1bf90 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a 0a 09  csc_readers);...
1bfa0 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70 64 61  ..../* Only upda
1bfb0 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 73  te the list of s
1bfc0 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65 20 61  lots if we are a
1bfd0 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 61 73  ctually being as
1bfe0 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65 20 73  ked supply the s
1bff0 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lot information 
1c000 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53 6c 6f  */......if (pSlo
1c010 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09 09 69  tList) {.......i
1c020 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29 20 7b  f (slot_reset) {
1c030 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
1c040 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 61  lots[currslot].a
1c050 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09 09 09  ctive = 1;......
1c060 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1c070 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72 6e 61  urrslot].interna
1c080 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61  l = 0;........ca
1c090 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1c0a0 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64 65 72  lot].pcsc_reader
1c0b0 20 3d 20 73 74 72 64 75 70 28 70 63 73 63 5f 72   = strdup(pcsc_r
1c0c0 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09 09 09  eaders);........
1c0d0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1c0e0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61 72 64  rslot].pcsc_card
1c0f0 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a  _connected = 0;.
1c100 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73 6c  .......cackey_sl
1c110 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74 72  ots[currslot].tr
1c120 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
1c130 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b  = 0;........cack
1c140 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f  ey_slots[currslo
1c150 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 6e  t].transaction_n
1c160 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 30 3b  eed_hw_lock = 0;
1c170 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
1c180 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 74  lots[currslot].t
1c190 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b 46  oken_flags = CKF
1c1a0 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44 3b  _LOGIN_REQUIRED;
1c1b0 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 73  ........cackey_s
1c1c0 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c  lots[currslot].l
1c1d0 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  abel = NULL;....
1c1e0 09 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b  .....cackey_mark
1c1f0 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63 61 63  _slot_reset(&cac
1c200 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1c210 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a 09 09  ot]);.......}...
1c220 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1c230 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61 6c 6c  ../* Artificiall
1c240 79 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 6e  y increase the n
1c250 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76 65 20  umber of active 
1c260 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20 77 69  slots by what wi
1c270 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69 76 65  ll become active
1c280 20 2a 2f 0a 09 09 09 09 09 09 73 6c 6f 74 5f 63   */.......slot_c
1c290 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d 0a 09  ount++;......}..
1c2a0 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b 3b 0a  ....currslot++;.
1c2b0 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61 64 65  ......pcsc_reade
1c2c0 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61 64 65  rs += curr_reade
1c2d0 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09 09 7d  r_len + 1;.....}
1c2e0 0a 0a 09 09 09 09 66 6f 72 20 28 63 75 72 72 73  ......for (currs
1c2f0 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73 6c 6f  lot = 0; currslo
1c300 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t < (sizeof(cack
1c310 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65  ey_slots) / size
1c320 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  of(cackey_slots[
1c330 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74 2b 2b  0])); currslot++
1c340 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63 61 63  ) {......if (cac
1c350 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c  key_slots[currsl
1c360 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  ot].active) {...
1c370 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
1c380 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20 61  _PRINTF("Found a
1c390 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75 22 2c  ctive slot %lu",
1c3a0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
1c3b0 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09 09 09   currslot);.....
1c3c0 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b 2b 3b  ...slot_count++;
1c3d0 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09  ......}.....}...
1c3e0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41  .} else {.....CA
1c3f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1c400 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c 20 74  F("Second call t
1c410 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61 64 65  o SCardListReade
1c420 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74 75 72  rs failed, retur
1c430 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43 4b 45  n %s/%li", CACKE
1c440 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
1c450 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
1c460 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72  rd_listreaders_r
1c470 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
1c480 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65  d_listreaders_re
1c490 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 72 65  t);....}.....fre
1c4a0 65 28 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73  e(pcsc_readers_s
1c4b0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
1c4c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c4d0 49 4e 54 46 28 22 46 69 72 73 74 20 63 61 6c 6c  INTF("First call
1c4e0 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
1c4f0 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
1c500 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
1c510 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
1c520 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
1c530 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1c540 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
1c550 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1c560 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d  ret);...}..}...m
1c570 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1c580 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1c590 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1c5a0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1c5b0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1c5c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1c5d0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1c5e0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1c5f0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1c600 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1c610 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c 69 73  }...if (pSlotLis
1c620 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a  t == NULL) {...*
1c630 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f 74 5f  pulCount = slot_
1c640 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b 45 59  count;....CACKEY
1c650 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1c660 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1c670 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25 6c 75  (%i).  Found %lu
1c680 20 72 65 61 64 65 72 73 2c 20 62 75 74 20 6e 6f   readers, but no
1c690 74 20 73 74 6f 72 69 6e 67 20 49 44 73 20 28 70  t storing IDs (p
1c6a0 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55 4c 4c  SlotList == NULL
1c6b0 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73  )", CKR_OK, (uns
1c6c0 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c 6f 74  igned long) slot
1c6d0 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65 74 75  _count);....retu
1c6e0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
1c6f0 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43 6f 75  .count = *pulCou
1c700 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74 20 3c  nt;..if (count <
1c710 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b 0a 09   slot_count) {..
1c720 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c730 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65  INTF("Error. Use
1c740 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20  r allocated %lu 
1c750 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20  entries, but we 
1c760 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69 65 73  have %lu entries
1c770 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f  .", count, slot_
1c780 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43 4b 45  count);....CACKE
1c790 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1c7a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55  Returning CKR_BU
1c7b0 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 22 29  FFER_TOO_SMALL")
1c7c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1c7d0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
1c7e0 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  );...}...mutex_r
1c7f0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1c800 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1c810 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1c820 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1c830 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1c840 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1c850 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1c860 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1c870 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1c880 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 5f 69  OR);..}...slot_i
1c890 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28 63 75  dx = 0;..for (cu
1c8a0 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63 75 72  rrslot = 0; (cur
1c8b0 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28  rslot < (sizeof(
1c8c0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
1c8d0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1c8e0 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75 72 72 73  ots[0]))); currs
1c8f0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21  lot++) {...if (!
1c900 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1c910 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b  rslot].active) {
1c920 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1c930 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f 69 64  }....if (slot_id
1c940 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a 09 09  x >= count) {...
1c950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1c960 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55 73 65  INTF("Error. Use
1c970 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c 75 20  r allocated %lu 
1c980 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77 65 20  entries, but we 
1c990 6a 75 73 74 20 74 72 69 65 64 20 74 6f 20 77 72  just tried to wr
1c9a0 69 74 65 20 74 6f 20 74 68 65 20 25 6c 75 20 69  ite to the %lu i
1c9b0 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69 6e 67  ndex -- ignoring
1c9c0 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74 5f 69  ", count, slot_i
1c9d0 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69 6e 75  dx);.....continu
1c9e0 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f 74 4c  e;...}....pSlotL
1c9f0 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20 3d 20  ist[slot_idx] = 
1ca00 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c 6f 74  currslot;...slot
1ca10 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d 75 74  _idx++;..}...mut
1ca20 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
1ca30 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
1ca40 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
1ca50 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
1ca60 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
1ca70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1ca80 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
1ca90 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1caa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1cab0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1cac0 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c  ..*pulCount = sl
1cad0 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41 43 4b  ot_count;...CACK
1cae0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1caf0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1cb00 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
1cb10 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20 43 4b  lu readers.", CK
1cb20 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65 64 20  R_OK, (unsigned 
1cb30 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75 6e 74  long) slot_count
1cb40 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1cb50 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72 65 73  OK);...tokenPres
1cb60 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65 73 65  ent = tokenPrese
1cb70 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73 20 75  nt; /* Supress u
1cb80 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65 20 77  nused variable w
1cb90 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f  arning */.}..CK_
1cba0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1cbb0 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c 6f 74  CK_RV, C_GetSlot
1cbc0 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  Info)(CK_SLOT_ID
1cbd0 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c 4f 54   slotID, CK_SLOT
1cbe0 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29  _INFO_PTR pInfo)
1cbf0 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 55 54   {..static CK_UT
1cc00 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73 63 72  F8CHAR slotDescr
1cc10 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41 43 4b  iption[] = "CACK
1cc20 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74 20 6d  ey Slot";..int m
1cc30 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e  utex_retval;..in
1cc40 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b  t bytes_to_copy;
1cc50 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cc60 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1cc70 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
1cc80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1cc90 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1cca0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
1ccb0 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1ccc0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1ccd0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1cce0 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1ccf0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1cd00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1cd10 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1cd20 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1cd30 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1cd40 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1cd50 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
1cd60 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1cd70 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1cd80 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1cd90 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1cda0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1cdb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cdc0 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1cdd0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1cde0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1cdf0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1ce00 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1ce10 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1ce20 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1ce30 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1ce40 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1ce50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1ce60 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1ce70 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1ce80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ce90 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1cea0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1ceb0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1cec0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1ced0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1cee0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1cef0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1cf00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1cf10 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1cf20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1cf30 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1cf40 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1cf50 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1cf60 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1cf70 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1cf80 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1cf90 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1cfa0 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1cfb0 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b 0a 0a  = CKF_HW_SLOT;..
1cfc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f  .if (!cackey_slo
1cfd0 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74 65 72  ts[slotID].inter
1cfe0 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  nal) {...pInfo->
1cff0 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52 45 4d  flags |= CKF_REM
1d000 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b 0a 09  OVABLE_DEVICE;..
1d010 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  }...if (cackey_t
1d020 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
1d030 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1d040 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  D]) == CACKEY_PC
1d050 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
1d060 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e 66 6c  T) {...pInfo->fl
1d070 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b 45 4e  ags |= CKF_TOKEN
1d080 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a 09 62  _PRESENT;..}...b
1d090 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d 20 73  ytes_to_copy = s
1d0a0 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73 6c 6f  trlen(cackey_slo
1d0b0 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f  ts[slotID].pcsc_
1d0c0 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28 73 69  reader);..if (si
1d0d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1d0e0 66 61 63 74 75 72 65 72 49 44 29 20 3c 20 62 79  facturerID) < by
1d0f0 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b 0a 09  tes_to_copy) {..
1d100 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
1d110 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d   sizeof(pInfo->m
1d120 61 6e 75 66 61 63 74 75 72 65 72 49 44 29 3b 0a  anufacturerID);.
1d130 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  .}..memcpy(pInfo
1d140 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1d150 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  , cackey_slots[s
1d160 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65 61 64  lotID].pcsc_read
1d170 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  er, bytes_to_cop
1d180 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  y);...mutex_retv
1d190 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1d1a0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
1d1b0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
1d1c0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
1d1d0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d1e0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1d1f0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
1d200 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
1d210 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
1d220 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65  ROR);..}...memse
1d230 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44 65 73  t(pInfo->slotDes
1d240 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c 20 73  cription, ' ', s
1d250 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 6c 6f  izeof(pInfo->slo
1d260 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29 3b 0a  tDescription));.
1d270 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 73  .memcpy(pInfo->s
1d280 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c 20  lotDescription, 
1d290 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 2c  slotDescription,
1d2a0 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65 73 63   sizeof(slotDesc
1d2b0 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a  ription) - 1);..
1d2c0 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6d  .memset(pInfo->m
1d2d0 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20 27  anufacturerID, '
1d2e0 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1d2f0 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  ->manufacturerID
1d300 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
1d310 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
1d320 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1d330 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
1d340 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
1d350 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
1d360 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
1d370 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
1d380 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
1d390 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1d3a0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
1d3b0 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
1d3c0 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1d3d0 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43 4b 45   = 0x00;...CACKE
1d3e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d3f0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1d400 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1d410 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1d420 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1d430 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1d440 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 29 28  C_GetTokenInfo)(
1d450 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49  CK_SLOT_ID slotI
1d460 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e 46 4f  D, CK_TOKEN_INFO
1d470 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73  _PTR pInfo) {..s
1d480 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1d490 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  R manufacturerID
1d4a0 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72  [] = "U.S. Gover
1d4b0 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20  nment";..static 
1d4c0 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65 66 61  CK_UTF8CHAR defa
1d4d0 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22 55 6e  ultLabel[] = "Un
1d4e0 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a 09 73  known Token";..s
1d4f0 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41  tatic CK_UTF8CHA
1d500 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43 41 43  R model[] = "CAC
1d510 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75 63 74   Token";..struct
1d520 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65   cackey_pcsc_ide
1d530 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64 65 6e  ntity *pcsc_iden
1d540 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67 6e 65  tities;..unsigne
1d550 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72 74 73  d long num_certs
1d560 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62 65 6c  ;..ssize_t label
1d570 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78  _ret;..int mutex
1d580 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 75 73  _retval;..int us
1d590 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 3b  e_default_label;
1d5a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d5b0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
1d5c0 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d  );...if (pInfo =
1d5d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1d5e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d5f0 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73  "Error. pInfo is
1d600 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1d610 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1d620 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1d630 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1d640 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1d650 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d660 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1d670 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1d680 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1d690 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1d6a0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f  D);..}...if (slo
1d6b0 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
1d6c0 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
1d6d0 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
1d6e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1d6f0 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
1d700 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1d710 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
1d720 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
1d730 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
1d740 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
1d750 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
1d760 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1d770 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1d780 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1d790 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
1d7a0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1d7b0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1d7c0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1d7d0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1d7e0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
1d7f0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1d800 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1d810 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
1d820 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
1d830 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
1d840 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1d850 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1d860 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
1d870 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
1d880 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
1d890 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
1d8a0 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
1d8b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1d8c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
1d8d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1d8e0 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1d8f0 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74 6f  ...if (cackey_to
1d900 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61 63  ken_present(&cac
1d910 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44  key_slots[slotID
1d920 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  ]) != CACKEY_PCS
1d930 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e 54  C_S_TOKENPRESENT
1d940 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1d950 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20 74 6f  UG_PRINTF("No to
1d960 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69  ken is present i
1d970 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75 22 2c  n slotID = %lu",
1d980 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
1d990 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1d9a0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1d9b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1d9c0 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53 45 4e  TOKEN_NOT_PRESEN
1d9d0 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  T);..}...mutex_r
1d9e0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1d9f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
1da00 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1da10 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1da20 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1da30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1da40 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
1da50 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
1da60 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
1da70 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a  _ERROR);..}.../*
1da80 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b 65 6e   Determine token
1da90 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65 72 74   label from cert
1daa0 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d 65 6d  ificates */..mem
1dab0 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c  set(pInfo->label
1dac0 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49  , ' ', sizeof(pI
1dad0 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09 75  nfo->label));..u
1dae0 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1daf0 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61 63 6b   = 1;...if (cack
1db00 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1db10 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c 29 20  .label == NULL) 
1db20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74 69 74  {...pcsc_identit
1db30 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61  ies = cackey_rea
1db40 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65 79 5f  d_certs(&cackey_
1db50 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 4e  slots[slotID], N
1db60 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74 73 29  ULL, &num_certs)
1db70 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69 64 65  ;...if (pcsc_ide
1db80 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c 29  ntities != NULL)
1db90 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f 63 65   {....if (num_ce
1dba0 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09 09 6c  rts > 0) {.....l
1dbb0 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63 6b 65  abel_ret = cacke
1dbc0 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79 5f  y_pcsc_identity_
1dbd0 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f 69 64  to_label(pcsc_id
1dbe0 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66 6f 2d  entities, pInfo-
1dbf0 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70  >label, sizeof(p
1dc00 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 09  Info->label));..
1dc10 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72 65 74  ...if (label_ret
1dc20 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75 73 65   > 0) {......use
1dc30 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c 20 3d  _default_label =
1dc40 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79   0;.......cackey
1dc50 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c  _slots[slotID].l
1dc60 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  abel = malloc(si
1dc70 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
1dc80 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d 63 70  l));.......memcp
1dc90 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  y(cackey_slots[s
1dca0 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20 70 49  lotID].label, pI
1dcb0 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65  nfo->label, size
1dcc0 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29  of(pInfo->label)
1dcd0 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  );.....}....}...
1dce0 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
1dcf0 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69 74  rts(pcsc_identit
1dd00 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c 20  ies, num_certs, 
1dd10 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20  1);...}..} else 
1dd20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f  {...memcpy(pInfo
1dd30 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65 79 5f  ->label, cackey_
1dd40 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 6c 61  slots[slotID].la
1dd50 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  bel, sizeof(pInf
1dd60 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09 09 75  o->label));....u
1dd70 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1dd80 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20 28 75   = 0;..}...if (u
1dd90 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1dda0 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e  ) {...memcpy(pIn
1ddb0 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66 61 75  fo->label, defau
1ddc0 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28  ltLabel, sizeof(
1ddd0 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20 2d 20  defaultLabel) - 
1dde0 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65 74 28  1);..}...memset(
1ddf0 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75  pInfo->manufactu
1de00 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69 7a 65  rerID, ' ', size
1de10 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61  of(pInfo->manufa
1de20 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d 65 6d  cturerID));..mem
1de30 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66  cpy(pInfo->manuf
1de40 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e 75 66  acturerID, manuf
1de50 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a 65 6f  acturerID, sizeo
1de60 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44  f(manufacturerID
1de70 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73 65 74  ) - 1);...memset
1de80 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c 20 27  (pInfo->model, '
1de90 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f   ', sizeof(pInfo
1dea0 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65 6d 63  ->model));..memc
1deb0 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c  py(pInfo->model,
1dec0 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66 28 6d   model, sizeof(m
1ded0 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09 6d 65  odel) - 1);...me
1dee0 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65 72 69  mset(pInfo->seri
1def0 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c 20 73  alNumber, ' ', s
1df00 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73 65 72  izeof(pInfo->ser
1df10 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a 09 6d  ialNumber));...m
1df20 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75 74 63  emset(pInfo->utc
1df30 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a 65 6f  Time, ' ', sizeo
1df40 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69 6d 65  f(pInfo->utcTime
1df50 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68 61 72  ));...pInfo->har
1df60 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 61 6a  dwareVersion.maj
1df70 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67 65 74  or = (cackey_get
1df80 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31 36 29  version() >> 16)
1df90 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66 6f 2d   & 0xff;..pInfo-
1dfa0 3e 68 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e  >hardwareVersion
1dfb0 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b 65 79  .minor = (cackey
1dfc0 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e  _getversion() >>
1dfd0 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09 70 49   8) & 0xff;...pI
1dfe0 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56 65 72  nfo->firmwareVer
1dff0 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30 78 30  sion.major = 0x0
1e000 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72 6d 77  0;..pInfo->firmw
1e010 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72  areVersion.minor
1e020 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e 66 6f   = 0x00;...pInfo
1e030 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f 57 52  ->flags = CKF_WR
1e040 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20 7c 20  ITE_PROTECTED | 
1e050 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49 4e 49  CKF_USER_PIN_INI
1e060 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46 5f 54  TIALIZED | CKF_T
1e070 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a 45 44  OKEN_INITIALIZED
1e080 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b   | cackey_slots[
1e090 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
1e0a0 61 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 75 6c  ags;...pInfo->ul
1e0b0 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20  MaxSessionCount 
1e0c0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
1e0d0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
1e0e0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
1e0f0 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 09 70  ons[0])) - 1;..p
1e100 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f 6e 43  Info->ulSessionC
1e110 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56 41 49  ount = CK_UNAVAI
1e120 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f  LABLE_INFORMATIO
1e130 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61 78  N;..pInfo->ulMax
1e140 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  RwSessionCount =
1e150 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 52 77   0;..pInfo->ulRw
1e160 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d 20 43  SessionCount = C
1e170 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
1e180 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
1e190 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e 20 3d  o->ulMaxPinLen =
1e1a0 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   128;..pInfo->ul
1e1b0 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b 0a 09  MinPinLen = 0;..
1e1c0 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c 50 75  pInfo->ulTotalPu
1e1d0 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  blicMemory = CK_
1e1e0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
1e1f0 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d  RMATION;..pInfo-
1e200 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d 65 6d  >ulFreePublicMem
1e210 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c  ory = CK_UNAVAIL
1e220 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e  ABLE_INFORMATION
1e230 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61  ;..pInfo->ulTota
1e240 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79 20 3d  lPrivateMemory =
1e250 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
1e260 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
1e270 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69 76 61  nfo->ulFreePriva
1e280 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e  teMemory = CK_UN
1e290 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d  AVAILABLE_INFORM
1e2a0 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45 59 5f  ATION;...CACKEY_
1e2b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1e2c0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
1e2d0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
1e2e0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
1e2f0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
1e300 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1e310 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74  WaitForSlotEvent
1e320 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61 67 73  )(CK_FLAGS flags
1e330 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50 54 52  , CK_SLOT_ID_PTR
1e340 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56 4f 49   pSlotID, CK_VOI
1e350 44 5f 50 54 52 20 70 52 65 73 65 72 76 65 64 29  D_PTR pReserved)
1e360 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1e370 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1e380 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73 65 72  ");...if (pReser
1e390 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ved != NULL) {..
1e3a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e3b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 52 65  INTF("Error. pRe
1e3c0 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20 4e 55  served is not NU
1e3d0 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
1e3e0 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
1e3f0 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
1e400 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
1e410 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
1e420 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1e430 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
1e440 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1e450 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
1e460 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
1e470 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20 54 4f  ..}.../* XXX: TO
1e480 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20 74 68  DO: Implement th
1e490 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b 45 59  is... */..CACKEY
1e4a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1e4b0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
1e4c0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
1e4d0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
1e4e0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1e4f0 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
1e500 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
1e510 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
1e520 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1e530 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
1e540 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29 28 43  MechanismList)(C
1e550 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
1e560 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54  , CK_MECHANISM_T
1e570 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61 6e 69  YPE_PTR pMechani
1e580 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47  smList, CK_ULONG
1e590 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20 7b  _PTR pulCount) {
1e5a0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e5b0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1e5c0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1e5d0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1e5e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e5f0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1e600 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1e610 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e620 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1e630 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1e640 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20  if (pulCount == 
1e650 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
1e660 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1e670 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e 74 20  rror.  pulCount 
1e680 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1e690 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1e6a0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1e6b0 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73  f (pMechanismLis
1e6c0 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2a  t == NULL) {...*
1e6d0 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a 0a 09  pulCount = 1;...
1e6e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e6f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
1e700 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
1e710 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
1e720 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
1e730 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c 20 31  f (*pulCount < 1
1e740 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1e750 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1e760 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20 73 6d  .  Buffer too sm
1e770 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  all.");....retur
1e780 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  n(CKR_BUFFER_TOO
1e790 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09 70 4d  _SMALL);..}...pM
1e7a0 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30 5d 20  echanismList[0] 
1e7b0 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 3b 0a  = CKM_RSA_PKCS;.
1e7c0 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a  .*pulCount = 1;.
1e7d0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1e7e0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
1e7f0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
1e800 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
1e810 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
1e820 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1e830 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65 63 68  CK_RV, C_GetMech
1e840 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f 53 4c  anismInfo)(CK_SL
1e850 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b  OT_ID slotID, CK
1e860 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50 45 20  _MECHANISM_TYPE 
1e870 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  type, CK_MECHANI
1e880 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  SM_INFO_PTR pInf
1e890 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  o) {..int mutex_
1e8a0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
1e8b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
1e8c0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
1e8d0 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29 20 7b  pInfo == NULL) {
1e8e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1e8f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1e900 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  Info is NULL.");
1e910 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
1e920 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
1e930 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
1e940 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1e950 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e960 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1e970 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1e980 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1e990 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1e9a0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1e9b0 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
1e9c0 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
1e9d0 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
1e9e0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
1e9f0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
1ea00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1ea10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
1ea20 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
1ea30 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
1ea40 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
1ea50 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
1ea60 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54  .return(CKR_SLOT
1ea70 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  _ID_INVALID);..}
1ea80 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
1ea90 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
1eaa0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1eab0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1eac0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1ead0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1eae0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
1eaf0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1eb00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1eb10 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1eb20 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
1eb30 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74  lots[slotID].act
1eb40 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41  ive == 0) {...CA
1eb50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1eb60 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
1eb70 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
1eb80 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74   (%lu), slot not
1eb90 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1eba0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
1ebb0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1ebc0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1ebd0 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  ck);....return(C
1ebe0 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c  KR_SLOT_ID_INVAL
1ebf0 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f  ID);..}...mutex_
1ec00 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
1ec10 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
1ec20 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
1ec30 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
1ec40 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
1ec50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ec60 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
1ec70 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1ec80 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1ec90 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73  L_ERROR);..}...s
1eca0 77 69 74 63 68 20 28 74 79 70 65 29 20 7b 0a 09  witch (type) {..
1ecb0 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f 50 4b  .case CKM_RSA_PK
1ecc0 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  CS:....pInfo->ul
1ecd0 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35 31 32  MinKeySize = 512
1ece0 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c 4d 61  ;....pInfo->ulMa
1ecf0 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39 32 3b  xKeySize = 8192;
1ed00 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73  ....pInfo->flags
1ed10 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b 46 5f   = CKF_HW | CKF_
1ed20 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f 44 45  ENCRYPT | CKF_DE
1ed30 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49 47 4e  CRYPT | CKF_SIGN
1ed40 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b 0a 09   | CKF_VERIFY;..
1ed50 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 43 41  ..break;..}...CA
1ed60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1ed70 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1ed80 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
1ed90 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
1eda0 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65 20 64  _OK);.}../* We d
1edb0 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74 68 69  on't support thi
1edc0 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43 4b 5f  s method. */.CK_
1edd0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1ede0 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54 6f 6b  CK_RV, C_InitTok
1edf0 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73  en)(CK_SLOT_ID s
1ee00 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38 43 48  lotID, CK_UTF8CH
1ee10 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f  AR_PTR pPin, CK_
1ee20 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e 2c 20  ULONG ulPinLen, 
1ee30 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52 20  CK_UTF8CHAR_PTR 
1ee40 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43 4b 45  pLabel) {..CACKE
1ee50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ee60 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
1ee70 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1ee80 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ee90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1eea0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1eeb0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1eec0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1eed0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1eee0 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
1eef0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
1ef00 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f 4b 45  turning CKR_TOKE
1ef10 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45  N_WRITE_PROTECTE
1ef20 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54 4f 4b  D (%i)", CKR_TOK
1ef30 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43 54  EN_WRITE_PROTECT
1ef40 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
1ef50 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1ef60 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f 2a 20  OTECTED);.}../* 
1ef70 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74  We don't support
1ef80 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f   this method. */
1ef90 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
1efa0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69  ION(CK_RV, C_Ini
1efb0 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tPIN)(CK_SESSION
1efc0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
1efd0 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
1efe0 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47  R pPin, CK_ULONG
1eff0 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 41   ulPinLen) {..CA
1f000 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f010 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1f020 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
1f030 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
1f040 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f050 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
1f060 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
1f070 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
1f080 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
1f090 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
1f0a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f0b0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54  "Returning CKR_T
1f0c0 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
1f0d0 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  CTED (%i)", CKR_
1f0e0 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54  TOKEN_WRITE_PROT
1f0f0 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ECTED);...return
1f100 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45  (CKR_TOKEN_WRITE
1f110 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a  _PROTECTED);.}..
1f120 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70  /* We don't supp
1f130 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e  ort this method.
1f140 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55   */.CK_DEFINE_FU
1f150 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
1f160 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49  SetPIN)(CK_SESSI
1f170 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1f180 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  on, CK_UTF8CHAR_
1f190 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43 4b 5f  PTR pOldPin, CK_
1f1a0 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e 4c 65  ULONG ulOldPinLe
1f1b0 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  n, CK_UTF8CHAR_P
1f1c0 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b 5f 55  TR pNewPin, CK_U
1f1d0 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c 65 6e  LONG ulNewPinLen
1f1e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
1f1f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1f200 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
1f210 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1f220 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f230 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f240 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1f250 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1f260 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1f270 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1f280 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f290 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1f2a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
1f2b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
1f2c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
1f2d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
1f2e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
1f2f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
1f300 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
1f310 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
1f320 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f  RV, C_OpenSessio
1f330 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  n)(CK_SLOT_ID sl
1f340 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53 20 66  otID, CK_FLAGS f
1f350 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f 50 54  lags, CK_VOID_PT
1f360 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e 2c 20  R pApplication, 
1f370 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69 66 79  CK_NOTIFY notify
1f380 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  , CK_SESSION_HAN
1f390 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73 69 6f  DLE_PTR phSessio
1f3a0 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
1f3b0 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20 6d 75  ong idx;..int mu
1f3c0 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74  tex_retval;..int
1f3d0 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d   found_session =
1f3e0 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42   0;...CACKEY_DEB
1f3f0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1f400 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66 6c 61  d.");...if ((fla
1f410 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41 4c 5f  gs & CKF_SERIAL_
1f420 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b 46 5f  SESSION) != CKF_
1f430 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e 29 20  SERIAL_SESSION) 
1f440 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  {...return(CKR_S
1f450 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45 4c 5f  ESSION_PARALLEL_
1f460 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1f470 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
1f480 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
1f490 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f4a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
1f4b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
1f4c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f4d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
1f4e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
1f4f0 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
1f500 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
1f510 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1f520 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1f530 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
1f540 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f550 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
1f560 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
1f570 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
1f580 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
1f590 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
1f5a0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
1f5b0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
1f5c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
1f5d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
1f5e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f5f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
1f600 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
1f610 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1f620 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
1f630 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
1f640 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1f650 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
1f660 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1f670 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
1f680 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
1f690 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f6a0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
1f6b0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
1f6c0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
1f6d0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
1f6e0 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
1f6f0 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
1f700 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
1f710 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
1f720 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
1f730 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 65  LID);..}.../* Ve
1f740 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 61  rify that the ca
1f750 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69  rd is actually i
1f760 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f 0a 09  n the slot. */..
1f770 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20 74 6f  /* XXX: Check to
1f780 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73 20   make sure this 
1f790 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53 23 31  is in the PKCS#1
1f7a0 31 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  1 specification 
1f7b0 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 74  */..if (cackey_t
1f7c0 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63 61  oken_present(&ca
1f7d0 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1f7e0 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  D]) != CACKEY_PC
1f7f0 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
1f800 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  T) {...CACKEY_DE
1f810 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1f820 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70 72 65  r.  Card not pre
1f830 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67  sent.  Returning
1f840 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f   CKR_DEVICE_REMO
1f850 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b 65 79  VED");....cackey
1f860 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1f870 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
1f880 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44 45 56  ..return(CKR_DEV
1f890 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a 09 7d  ICE_REMOVED);..}
1f8a0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 31 3b  ...for (idx = 1;
1f8b0 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63   idx < (sizeof(c
1f8c0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
1f8d0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1f8e0 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69  sessions[0])); i
1f8f0 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 21 63  dx++) {...if (!c
1f900 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
1f910 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  dx].active) {...
1f920 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e 20 3d  .found_session =
1f930 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73 73 69   1;.....*phSessi
1f940 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09 63 61  on = idx;.....ca
1f950 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1f960 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09  x].active = 1;..
1f970 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1f980 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20 3d 20  s[idx].slotID = 
1f990 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63 6b 65  slotID;....cacke
1f9a0 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
1f9b0 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50  state = CKS_RO_P
1f9c0 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09  UBLIC_SESSION;..
1f9d0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
1f9e0 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d 20 66  s[idx].flags = f
1f9f0 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65 79 5f  lags;....cackey_
1fa00 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 75 6c  sessions[idx].ul
1fa10 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20 30 3b  DeviceError = 0;
1fa20 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
1fa30 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c 69 63  ons[idx].pApplic
1fa40 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69 63 61  ation = pApplica
1fa50 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65 79 5f  tion;....cackey_
1fa60 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 4e 6f  sessions[idx].No
1fa70 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b 0a 0a  tify = notify;..
1fa80 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1fa90 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
1faa0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 63 61  es = NULL;....ca
1fab0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64  ckey_sessions[id
1fac0 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f  x].identities_co
1fad0 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63  unt = 0;.....cac
1fae0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1faf0 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65 20  ].search_active 
1fb00 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f  = 0;.....cackey_
1fb10 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73 69  sessions[idx].si
1fb20 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  gn_active = 0;..
1fb30 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
1fb40 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70 74 5f  ns[idx].decrypt_
1fb50 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09 09 09  active = 0;.....
1fb60 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1fb70 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  idx].identities 
1fb80 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64  = cackey_read_id
1fb90 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79  entities(&cackey
1fba0 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
1fbb0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
1fbc0 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73  [idx].identities
1fbd0 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09 62 72  _count);......br
1fbe0 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 75  eak;...}..}...mu
1fbf0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1fc00 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
1fc10 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
1fc20 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
1fc30 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
1fc40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1fc50 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
1fc60 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
1fc70 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
1fc80 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
1fc90 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f 73 65  ...if (!found_se
1fca0 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43 4b 45  ssion) {...CACKE
1fcb0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1fcc0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 53 45  Returning CKR_SE
1fcd0 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25 69 29  SSION_COUNT (%i)
1fce0 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  ", CKR_SESSION_C
1fcf0 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75 72 6e  OUNT);....return
1fd00 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43 4f 55  (CKR_SESSION_COU
1fd10 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  NT);..}...CACKEY
1fd20 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
1fd30 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
1fd40 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
1fd50 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
1fd60 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
1fd70 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
1fd80 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29 28 43  _CloseSession)(C
1fd90 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
1fda0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 69 6e   hSession) {..in
1fdb0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
1fdc0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1fdd0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
1fde0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
1fdf0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
1fe00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1fe10 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
1fe20 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
1fe30 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
1fe40 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
1fe50 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
1fe60 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
1fe70 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
1fe80 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
1fe90 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
1fea0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
1feb0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
1fec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1fed0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
1fee0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
1fef0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
1ff00 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
1ff10 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
1ff20 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1ff30 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
1ff40 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1ff50 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1ff60 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1ff70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1ff80 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
1ff90 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
1ffa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
1ffb0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
1ffc0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
1ffd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
1ffe0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
1fff0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
20000 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
20010 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
20020 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20030 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
20040 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
20050 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
20060 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
20070 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
20080 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
20090 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 63 61  .active = 0;..ca
200a0 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e 74 69  ckey_free_identi
200b0 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65 73 73  ties(cackey_sess
200c0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
200d0 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63 6b 65  dentities, cacke
200e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
200f0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  ion].identities_
20100 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65 78 5f  count);...mutex_
20110 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
20120 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
20130 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
20140 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
20150 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
20160 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
20170 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
20180 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
20190 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
201a0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
201b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
201c0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
201d0 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
201e0 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
201f0 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
20200 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
20210 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  RV, C_CloseAllSe
20220 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f 54 5f  ssions)(CK_SLOT_
20230 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09 75 69  ID slotID) {..ui
20240 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69 6e 74  nt32_t idx;..int
20250 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
20260 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20270 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
20280 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
20290 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
202a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
202b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
202c0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
202d0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
202e0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
202f0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
20300 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
20310 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
20320 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
20330 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
20340 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
20350 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20360 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
20370 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
20380 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
20390 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
203a0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
203b0 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f  return(CKR_SLOT_
203c0 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  ID_INVALID);..}.
203d0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
203e0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
203f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20400 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
20410 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
20420 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20430 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
20440 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
20450 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
20460 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
20470 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
20480 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
20490 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
204a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
204b0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
204c0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
204d0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
204e0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
204f0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
20500 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20510 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20520 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
20530 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49  R_SLOT_ID_INVALI
20540 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64  D);..}...for (id
20550 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69  x = 0; idx < (si
20560 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
20570 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
20580 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
20590 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  ])); idx++) {...
205a0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
205b0 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76 65 29  ons[idx].active)
205c0 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b 65 79   {....if (cackey
205d0 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e 73  _sessions[idx].s
205e0 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49 44 29  lotID != slotID)
205f0 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b   {.....continue;
20600 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
20610 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
20620 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20630 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e  ..C_CloseSession
20640 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b 65 79  (idx);....cackey
20650 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
20660 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 7d  ey_biglock);...}
20670 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
20680 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
20690 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
206a0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
206b0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
206c0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
206d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
206e0 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
206f0 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
20700 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
20710 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
20720 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20730 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
20740 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
20750 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
20760 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
20770 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
20780 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f  C_GetSessionInfo
20790 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
207a0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
207b0 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f 50 54  _SESSION_INFO_PT
207c0 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e 74 20  R pInfo) {..int 
207d0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
207e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
207f0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
20800 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e  ..if (pInfo == N
20810 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
20820 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20830 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55  ror. pInfo is NU
20840 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  LL.");....return
20850 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42  (CKR_ARGUMENTS_B
20860 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  AD);..}...if (!c
20870 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
20880 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
20890 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
208a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
208b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
208c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
208d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
208e0 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
208f0 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
20900 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
20910 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
20920 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
20930 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
20940 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20950 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20960 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
20970 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
20980 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
20990 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
209a0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
209b0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
209c0 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
209d0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
209e0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
209f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20a00 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20a10 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
20a20 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
20a30 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
20a40 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
20a50 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20a60 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
20a70 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
20a80 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20a90 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
20aa0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
20ab0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
20ac0 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
20ad0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
20ae0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
20af0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70 49 6e  VALID);..}...pIn
20b00 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63 61 63  fo->slotID = cac
20b10 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20b20 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 09  ssion].slotID;..
20b30 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d 20 63  pInfo->state = c
20b40 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
20b50 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65 3b 0a  Session].state;.
20b60 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20 3d 20  .pInfo->flags = 
20b70 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20b80 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67 73 3b  hSession].flags;
20b90 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76 69 63  ..pInfo->ulDevic
20ba0 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65 79 5f  eError = cackey_
20bb0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
20bc0 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72 6f 72  n].ulDeviceError
20bd0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
20be0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20bf0 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
20c00 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
20c10 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
20c20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
20c30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
20c40 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
20c50 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20c60 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
20c70 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
20c80 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
20c90 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
20ca0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
20cb0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
20cc0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
20cd0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
20ce0 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  GetOperationStat
20cf0 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
20d00 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
20d10 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70 65 72  K_BYTE_PTR pOper
20d20 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b 5f 55  ationState, CK_U
20d30 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70 65 72  LONG_PTR pulOper
20d40 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29 20 7b  ationStateLen) {
20d50 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20d60 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
20d70 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
20d80 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
20d90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20da0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
20db0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
20dc0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20dd0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
20de0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
20df0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20e00 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
20e10 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
20e20 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
20e30 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
20e40 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
20e50 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
20e60 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
20e70 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
20e80 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20e90 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53   C_SetOperationS
20ea0 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  tate)(CK_SESSION
20eb0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
20ec0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f  , CK_BYTE_PTR pO
20ed0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43  perationState, C
20ee0 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72 61 74  K_ULONG ulOperat
20ef0 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43 4b 5f  ionStateLen, CK_
20f00 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 45  OBJECT_HANDLE hE
20f10 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20 43 4b  ncryptionKey, CK
20f20 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
20f30 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4b 65  AuthenticationKe
20f40 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
20f50 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
20f60 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
20f70 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
20f80 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
20f90 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
20fa0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
20fb0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
20fc0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
20fd0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
20fe0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
20ff0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
21000 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
21010 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
21020 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
21030 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
21040 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
21050 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
21060 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
21070 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
21080 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28 43 4b  _RV, C_Login)(CK
21090 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
210a0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55 53 45  hSession, CK_USE
210b0 52 5f 54 59 50 45 20 75 73 65 72 54 79 70 65 2c  R_TYPE userType,
210c0 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54 52   CK_UTF8CHAR_PTR
210d0 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e 47 20   pPin, CK_ULONG 
210e0 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43 4b 5f  ulPinLen) {..CK_
210f0 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a  SLOT_ID slotID;.
21100 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
21110 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72 65  l;..int tries_re
21120 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 6c 6f  maining;..int lo
21130 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  gin_ret;...CACKE
21140 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21150 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
21160 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
21170 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
21180 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21190 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
211a0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
211b0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
211c0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
211d0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65  D);..}...if (hSe
211e0 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53  ssion == 0 || hS
211f0 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f  ession >= (sizeo
21200 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
21210 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
21220 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29  ey_sessions[0]))
21230 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21240 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21250 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f  .  Session out o
21260 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09  f range.");.....
21270 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
21280 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
21290 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 73  ID);..}...if (us
212a0 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f 55 53  erType != CKU_US
212b0 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ER) {...CACKEY_D
212c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
212d0 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73 75 70  or.  We only sup
212e0 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65 2c 20  port USER mode, 
212f0 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20 6d 6f  asked for %lu mo
21300 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  de.", (unsigned 
21310 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65 29 0a  long) userType).
21320 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 55 53  ...return(CKR_US
21330 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49 44 29  ER_TYPE_INVALID)
21340 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
21350 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
21360 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  ex_lock(cackey_b
21370 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
21380 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
21390 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
213a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
213b0 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64    Locking failed
213c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
213d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
213e0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
213f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
21400 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
21410 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
21420 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
21430 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45  glock);....CACKE
21440 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21450 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
21460 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
21470 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21480 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
21490 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f  VALID);..}...slo
214a0 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73  tID = cackey_ses
214b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
214c0 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c  slotID;...if (sl
214d0 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74  otID < 0 || slot
214e0 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  ID >= (sizeof(ca
214f0 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
21500 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
21510 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
21520 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
21530 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20  "Error. Invalid 
21540 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28  slot requested (
21550 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66  %lu), outside of
21560 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73   valid range", s
21570 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72  lotID);....retur
21580 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21590 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63  ROR);..}...if (c
215a0 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
215b0 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29  ID].active == 0)
215c0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
215d0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
215e0 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
215f0 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73  quested (%lu), s
21600 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  lot not currentl
21610 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49  y active", slotI
21620 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75  D);....cackey_mu
21630 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
21640 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72  y_biglock);....r
21650 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
21660 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6c  L_ERROR);..}...l
21670 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  ogin_ret = cacke
21680 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65 79 5f  y_login(&cackey_
21690 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 70  slots[slotID], p
216a0 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c 20 26  Pin, ulPinLen, &
216b0 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29  tries_remaining)
216c0 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  ;..if (login_ret
216d0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
216e0 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b 65 79  S_OK) {...cackey
216f0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
21700 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
21710 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20  ..if (login_ret 
21720 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  == CACKEY_PCSC_E
21730 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09 43 41  _LOCKED) {....CA
21740 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21750 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b 65 6e  F("Error.  Token
21760 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b 0a 0a   is locked.");..
21770 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
21780 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
21790 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f  ags |= CKF_USER_
217a0 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09 09 09  PIN_LOCKED;.....
217b0 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e 5f 4c  return(CKR_PIN_L
217c0 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c 73 65  OCKED);...} else
217d0 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74 20 3d   if (login_ret =
217e0 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
217f0 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43 41 43  BADPIN) {....CAC
21800 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21810 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61 6c 69  ("Error.  Invali
21820 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09 63 61  d PIN.");.....ca
21830 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
21840 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
21850 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43  = CKF_USER_PIN_C
21860 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09 69 66  OUNT_LOW;.....if
21870 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e   (tries_remainin
21880 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09 63 61  g == 1) {.....ca
21890 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
218a0 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 7c  D].token_flags |
218b0 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46  = CKF_USER_PIN_F
218c0 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d 0a 0a  INAL_TRY;....}..
218d0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49  ...return(CKR_PI
218e0 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a 09 09  N_INCORRECT);...
218f0 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  }....CACKEY_DEBU
21900 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21910 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72 20    Unknown error 
21920 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 63 61  returned from ca
21930 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28 25 69  ckey_login() (%i
21940 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29 3b 0a  )", login_ret);.
21950 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
21960 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
21970 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  ...cackey_slots[
21980 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c  slotID].token_fl
21990 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55 53 45  ags &= ~(CKF_USE
219a0 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c 20 43  R_PIN_LOCKED | C
219b0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f 55 4e  KF_USER_PIN_COUN
219c0 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f 47 49  T_LOW | CKF_LOGI
219d0 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43 4b 46  N_REQUIRED | CKF
219e0 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41 4c 5f  _USER_PIN_FINAL_
219f0 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79 5f 73  TRY);...cackey_s
21a00 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21a10 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
21a20 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e 53 3b  _USER_FUNCTIONS;
21a30 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
21a40 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
21a50 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
21a60 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
21a70 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
21a80 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
21a90 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
21aa0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
21ab0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
21ac0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
21ad0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
21ae0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
21af0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
21b00 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
21b10 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
21b20 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
21b30 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 4c  CTION(CK_RV, C_L
21b40 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53 49 4f  ogout)(CK_SESSIO
21b50 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
21b60 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44  n) {..CK_SLOT_ID
21b70 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20 6d 75   slotID;..int mu
21b80 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41  tex_retval;...CA
21b90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21ba0 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
21bb0 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
21bc0 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
21bd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21be0 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
21bf0 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
21c00 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
21c10 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
21c20 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  IZED);..}...if (
21c30 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c  hSession == 0 ||
21c40 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69   hSession >= (si
21c50 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
21c60 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63  ions) / sizeof(c
21c70 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30  ackey_sessions[0
21c80 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ]))) {...CACKEY_
21c90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
21ca0 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75  ror.  Session ou
21cb0 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09  t of range.");..
21cc0 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
21cd0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e  ESSION_HANDLE_IN
21ce0 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74  VALID);..}...mut
21cf0 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
21d00 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
21d10 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
21d20 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
21d30 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
21d40 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21d50 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20  Error.  Locking 
21d60 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
21d70 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
21d80 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
21d90 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
21da0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74  ns[hSession].act
21db0 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
21dc0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21dd0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21de0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
21df0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
21e00 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
21e10 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
21e20 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
21e30 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
21e40 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b  ...slotID = cack
21e50 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
21e60 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09  sion].slotID;...
21e70 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c  if (slotID < 0 |
21e80 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a  | slotID >= (siz
21e90 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
21ea0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
21eb0 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a  y_slots[0]))) {.
21ec0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21ed0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e  RINTF("Error. In
21ee0 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65  valid slot reque
21ef0 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73  sted (%lu), outs
21f00 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e  ide of valid ran
21f10 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ge", slotID);...
21f20 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21f30 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
21f40 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
21f50 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65  s[slotID].active
21f60 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   == 0) {...CACKE
21f70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21f80 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
21f90 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
21fa0 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75  lu), slot not cu
21fb0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c  rrently active",
21fc0 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63   slotID);....cac
21fd0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
21fe0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
21ff0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22000 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22010 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
22020 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
22030 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f 50 55  tate = CKS_RO_PU
22040 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a 09 63  BLIC_SESSION;..c
22050 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
22060 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20  ID].token_flags 
22070 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55  = CKF_LOGIN_REQU
22080 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  IRED;...mutex_re
22090 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
220a0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
220b0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
220c0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
220d0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
220e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
220f0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
22100 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
22110 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
22120 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
22130 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22140 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22150 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
22160 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
22170 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
22180 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
22190 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65 63 74  , C_CreateObject
221a0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
221b0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
221c0 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
221d0 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
221e0 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b 5f 4f  NG ulCount, CK_O
221f0 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
22200 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41   phObject) {..CA
22210 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22220 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22230 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22240 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22250 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22260 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22270 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22280 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22290 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
222a0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
222b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
222c0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
222d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
222e0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
222f0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22300 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
22310 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
22320 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
22330 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
22340 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 43  CTION(CK_RV, C_C
22350 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f 53 45  opyObject)(CK_SE
22360 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
22370 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54  ssion, CK_OBJECT
22380 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c  _HANDLE hObject,
22390 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
223a0 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
223b0 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43  ULONG ulCount, C
223c0 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f  K_OBJECT_HANDLE_
223d0 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63 74 29  PTR phNewObject)
223e0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
223f0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
22400 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
22410 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
22420 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22430 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22440 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
22450 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
22460 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
22470 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
22480 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22490 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
224a0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
224b0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
224c0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
224d0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
224e0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
224f0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
22500 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
22510 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
22520 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62 6a 65  V, C_DestroyObje
22530 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
22540 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
22550 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
22560 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43 41 43   hObject) {..CAC
22570 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22580 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
22590 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
225a0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
225b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
225c0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
225d0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
225e0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
225f0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
22600 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
22610 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22620 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
22630 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
22640 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
22650 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22660 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
22670 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
22680 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
22690 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
226a0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
226b0 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43 4b 5f  tObjectSize)(CK_
226c0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
226d0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
226e0 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
226f0 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
22700 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41 43 4b  pulSize) {..CACK
22710 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22720 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
22730 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
22740 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
22750 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22760 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
22770 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
22780 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
22790 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
227a0 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  ED);..}...CACKEY
227b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
227c0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e  eturning CKR_FUN
227d0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
227e0 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46  TED (%i)", CKR_F
227f0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22800 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e  ORTED);...return
22810 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f  (CKR_FUNCTION_NO
22820 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a  T_SUPPORTED);.}.
22830 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
22840 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74  ION(CK_RV, C_Get
22850 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 29 28  AttributeValue)(
22860 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
22870 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f  E hSession, CK_O
22880 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62  BJECT_HANDLE hOb
22890 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49 42 55  ject, CK_ATTRIBU
228a0 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74 65  TE_PTR pTemplate
228b0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75  , CK_ULONG ulCou
228c0 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52 49 42  nt) {..CK_ATTRIB
228d0 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a  UTE *curr_attr;.
228e0 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69  .struct cackey_i
228f0 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74  dentity *identit
22900 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  y;..unsigned lon
22910 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78 2c 20  g identity_idx, 
22920 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73 5f 61  attr_idx, sess_a
22930 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69 64 73  ttr_idx, num_ids
22940 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
22950 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76  val;..CK_RV retv
22960 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 43 4b  al = CKR_OK;..CK
22970 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75 65  _VOID_PTR pValue
22980 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56 61  ;..CK_ULONG ulVa
22990 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b 45 59  lueLen;...CACKEY
229a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
229b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
229c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
229d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
229e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
229f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
22a00 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
22a10 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
22a20 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
22a30 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
22a40 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
22a50 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
22a60 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22a70 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
22a80 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
22a90 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22aa0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22ab0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
22ac0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
22ad0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
22ae0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
22af0 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4f 62  D);..}...if (hOb
22b00 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43  ject == 0) {...C
22b10 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22b20 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62 6a 65  TF("Error.  Obje
22b30 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66  ct handle out of
22b40 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
22b50 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
22b60 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
22b70 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c 43 6f  );..}...if (ulCo
22b80 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  unt == 0) {.../*
22b90 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 2c 20   Short circuit, 
22ba0 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74 73 20  if zero objects 
22bb0 77 65 72 65 20 73 70 65 63 69 66 69 65 64 20 72  were specified r
22bc0 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65 6d 73  eturn zero items
22bd0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a   immediately */.
22be0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
22bf0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
22c00 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
22c10 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
22c20 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
22c30 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
22c40 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 3d 3d  if (pTemplate ==
22c50 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
22c60 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
22c70 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c 61 74  Error.  pTemplat
22c80 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  e is NULL.");...
22c90 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
22ca0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
22cb0 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20  .identity_idx = 
22cc0 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a 09 6d  hObject - 1;...m
22cd0 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
22ce0 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
22cf0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22d00 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
22d10 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
22d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22d30 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
22d40 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
22d50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
22d60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
22d70 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
22d80 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
22d90 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
22da0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
22db0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
22dc0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22dd0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22de0 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
22df0 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
22e00 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
22e10 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
22e20 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d 20 63  .}...num_ids = c
22e30 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
22e40 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
22e50 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69 66 20  ies_count;...if 
22e60 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3e 3d  (identity_idx >=
22e70 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09 63 61   num_ids) {...ca
22e80 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
22e90 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
22ea0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
22eb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
22ec0 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64 6c 65  .  Object handle
22ed0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
22ee0 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d 20 25  identity_idx = %
22ef0 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20 25 6c  lu, num_ids = %l
22f00 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u.", (unsigned l
22f10 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f 69 64  ong) identity_id
22f20 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  x, (unsigned lon
22f30 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a 09 09  g) num_ids);....
22f40 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a 45 43  return(CKR_OBJEC
22f50 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  T_HANDLE_INVALID
22f60 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69 74 79  );..}...identity
22f70 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
22f80 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
22f90 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74 69 74  entities[identit
22fa0 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20 28 61  y_idx];...for (a
22fb0 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74  ttr_idx = 0; att
22fc0 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e 74 3b  r_idx < ulCount;
22fd0 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a 09   attr_idx++) {..
22fe0 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26 70 54  .curr_attr = &pT
22ff0 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69 64 78  emplate[attr_idx
23000 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d 20 4e  ];....pValue = N
23010 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65 4c 65  ULL;...ulValueLe
23020 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31  n = (CK_LONG) -1
23030 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
23040 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b 69 6e  G_PRINTF("Lookin
23050 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65 20  g for attribute 
23060 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74 69 74  0x%08lx (identit
23070 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28 75 6e  y:%lu) ...", (un
23080 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
23090 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20 28 75  r_attr->type, (u
230a0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
230b0 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a 09 09  entity_idx);....
230c0 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69  for (sess_attr_i
230d0 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74  dx = 0; sess_att
230e0 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 79  r_idx < identity
230f0 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  ->attributes_cou
23100 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64  nt; sess_attr_id
23110 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28 69 64  x++) {....if (id
23120 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62 75 74  entity->attribut
23130 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78  es[sess_attr_idx
23140 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72 5f 61  ].type == curr_a
23150 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09 09 09  ttr->type) {....
23160 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23170 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75 6e 64  INTF(" ... found
23180 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20 25 70   it, pValue = %p
23190 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 25  , ulValueLen = %
231a0 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61  lu", identity->a
231b0 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61  ttributes[sess_a
231c0 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ttr_idx].pValue,
231d0 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
231e0 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
231f0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
23200 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61 6c 75  ;..........pValu
23210 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74  e = identity->at
23220 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74  tributes[sess_at
23230 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65 3b 0a  tr_idx].pValue;.
23240 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
23250 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69   identity->attri
23260 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f  butes[sess_attr_
23270 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 3b  idx].ulValueLen;
23280 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20  ....}...}....if 
23290 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c  (curr_attr->pVal
232a0 75 65 20 26 26 20 70 56 61 6c 75 65 29 20 7b 0a  ue && pValue) {.
232b0 09 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
232c0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20  ->ulValueLen >= 
232d0 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09  ulValueLen) {...
232e0 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61 74  ..memcpy(curr_at
232f0 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56 61 6c  tr->pValue, pVal
23300 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ue, ulValueLen);
23310 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
23320 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 28 43  .ulValueLen = (C
23330 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09 09 09  K_LONG) -1;.....
23340 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55  .retval = CKR_BU
23350 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a  FFER_TOO_SMALL;.
23360 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75 72 72  ...}...}....curr
23370 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65  _attr->ulValueLe
23380 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a  n = ulValueLen;.
23390 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
233a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
233b0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
233c0 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
233d0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
233e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
233f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
23400 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
23410 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
23420 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
23430 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65  OR);..}...if (re
23440 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54 54 52  tval == CKR_ATTR
23450 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c  IBUTE_TYPE_INVAL
23460 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ID) {...CACKEY_D
23470 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23480 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54 52 49  urning CKR_ATTRI
23490 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41 4c 49  BUTE_TYPE_INVALI
234a0 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29 20 72  D (%i)", (int) r
234b0 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73 65 20  etval);..} else 
234c0 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20 43 4b  if (retval == CK
234d0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
234e0 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
234f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
23500 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46 46 45  urning CKR_BUFFE
23510 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25 69 29  R_TOO_SMALL (%i)
23520 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
23530 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 72 65  ;..} else if (re
23540 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b 29 20  tval == CKR_OK) 
23550 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
23560 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23570 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
23580 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
23590 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
235a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
235b0 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20  "Returning %i", 
235c0 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 09  (int) retval);..
235d0 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61  }...return(retva
235e0 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  l);.}..CK_DEFINE
235f0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
23600 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56   C_SetAttributeV
23610 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  alue)(CK_SESSION
23620 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
23630 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
23640 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b 5f 41  LE hObject, CK_A
23650 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65  TTRIBUTE_PTR pTe
23660 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47  mplate, CK_ULONG
23670 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 41 43   ulCount) {..CAC
23680 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23690 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
236a0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
236b0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
236c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
236d0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
236e0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
236f0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
23700 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
23710 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
23720 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23730 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
23740 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
23750 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
23760 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23770 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
23780 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
23790 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
237a0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
237b0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69  TION(CK_RV, C_Fi
237c0 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29 28 43  ndObjectsInit)(C
237d0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
237e0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 41 54   hSession, CK_AT
237f0 54 52 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d  TRIBUTE_PTR pTem
23800 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
23810 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 53  ulCount) {..CK_S
23820 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09  LOT_ID slotID;..
23830 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69  CK_ULONG idx;..i
23840 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
23850 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23860 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
23870 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
23880 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
23890 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
238a0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
238b0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
238c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
238d0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
238e0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
238f0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
23900 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
23910 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
23920 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
23930 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
23940 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
23950 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23960 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
23970 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
23980 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
23990 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
239a0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
239b0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
239c0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
239d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
239e0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
239f0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
23a00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
23a10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
23a20 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
23a30 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
23a40 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
23a50 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
23a60 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
23a70 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
23a80 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
23a90 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
23aa0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
23ab0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
23ac0 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
23ad0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
23ae0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
23af0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
23b00 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b  );..}...if (cack
23b10 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
23b20 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74  sion].search_act
23b30 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
23b40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
23b50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
23b60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23b70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
23b80 61 72 63 68 20 61 6c 72 65 61 64 79 20 61 63 74  arch already act
23b90 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
23ba0 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
23bb0 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
23bc0 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
23bd0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
23be0 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
23bf0 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
23c00 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
23c10 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
23c20 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
23c30 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
23c40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23c50 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
23c60 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
23c70 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
23c80 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
23c90 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
23ca0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
23cb0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
23cc0 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
23cd0 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
23ce0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
23cf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
23d00 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
23d10 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
23d20 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
23d30 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
23d40 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
23d50 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
23d60 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
23d70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
23d80 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
23d90 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
23da0 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f 74 5f  ts[slotID].slot_
23db0 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43 4b 45  reset) {...CACKE
23dc0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23dd0 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62 65 65  The slot has bee
23de0 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20 77 65  n reset since we
23df0 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66 6f 72   last looked for
23e00 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d 20 72   identities -- r
23e10 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a 09 09  escanning");....
23e20 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
23e30 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
23e40 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c 4c  entities != NULL
23e50 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 66 72  ) {....cackey_fr
23e60 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28 63 61  ee_identities(ca
23e70 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
23e80 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
23e90 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  es, cackey_sessi
23ea0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
23eb0 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b  entities_count);
23ec0 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
23ed0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
23ee0 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55 4c 4c  dentities = NULL
23ef0 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  ;....cackey_sess
23f00 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
23f10 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
23f20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  = 0;...}....if (
23f30 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23f40 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20 4e 55  tID].label != NU
23f50 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61  LL) {....free(ca
23f60 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
23f70 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09 63 61  D].label);....ca
23f80 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
23f90 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b  D].label = NULL;
23fa0 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ...}....cackey_m
23fb0 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26  ark_slot_reset(&
23fc0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
23fd0 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65 79 5f  tID]);...cackey_
23fe0 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c  slots[slotID].sl
23ff0 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09 7d  ot_reset = 0;..}
24000 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65  ...if (cackey_se
24010 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24020 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d 20 4e  .identities == N
24030 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ULL) {...cackey_
24040 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24050 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20  n].identities = 
24060 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65 6e  cackey_read_iden
24070 74 69 74 69 65 73 28 26 63 61 63 6b 65 79 5f 73  tities(&cackey_s
24080 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 26 63  lots[slotID], &c
24090 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
240a0 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
240b0 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a  ies_count);..}..
240c0 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20 21  .if (pTemplate !
240d0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28  = NULL) {...if (
240e0 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20 7b 0a  ulCount != 0) {.
240f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
24100 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
24110 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
24120 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09 63 61  = ulCount;....ca
24130 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24140 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71  ession].search_q
24150 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28 75 6c  uery = malloc(ul
24160 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a  Count * sizeof(*
24170 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a 09 09  pTemplate));....
24180 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79 5f 73  .memcpy(cackey_s
24190 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
241a0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 2c 20  ].search_query, 
241b0 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43 6f 75  pTemplate, ulCou
241c0 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70 54 65  nt * sizeof(*pTe
241d0 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66 6f 72  mplate));....for
241e0 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c   (idx = 0; idx <
241f0 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b 2b 29   ulCount; idx++)
24200 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65 6d 70   {.....if (pTemp
24210 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75  late[idx].ulValu
24220 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 09  eLen == 0) {....
24230 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
24240 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
24250 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
24260 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  alue = NULL;....
24270 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09  ...continue;....
24280 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 73  .}......cackey_s
24290 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
242a0 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69  ].search_query[i
242b0 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d 61 6c  dx].pValue = mal
242c0 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b 69 64  loc(pTemplate[id
242d0 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  x].ulValueLen);.
242e0 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65 79 5f  .....if (cackey_
242f0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24300 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b  n].search_query[
24310 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09  idx].pValue) {..
24320 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65  ....memcpy(cacke
24330 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24340 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
24350 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c 20 70  y[idx].pValue, p
24360 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 70 56  Template[idx].pV
24370 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74 65 5b  alue, pTemplate[
24380 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
24390 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 7d  ;.....}....}...}
243a0 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63 6b 65   else {....cacke
243b0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
243c0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
243d0 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 09 09  y_count = 0;....
243e0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
243f0 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
24400 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b 0a 09  _query = NULL;..
24410 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  .}..} else {...i
24420 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29  f (ulCount != 0)
24430 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d 75 74   {....cackey_mut
24440 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
24450 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 43  _biglock);.....C
24460 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
24470 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72  TF("Error.  Sear
24480 63 68 20 71 75 65 72 79 20 73 70 65 63 69 66 69  ch query specifi
24490 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75 74 20  ed as NULL, but 
244a0 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72 79 20  number of query 
244b0 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63 69 66  terms not specif
244c0 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a 09 09  ied as 0.");....
244d0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
244e0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09 7d 0a  MENTS_BAD);...}.
244f0 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
24500 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
24510 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 20  rch_query_count 
24520 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 65  = 0;...cackey_se
24530 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24540 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20 3d 20  .search_query = 
24550 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65  NULL;..}...cacke
24560 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24570 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
24580 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65 79 5f  ve = 1;..cackey_
24590 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
245a0 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69  n].search_curr_i
245b0 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78 5f 72  d = 0;...mutex_r
245c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
245d0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
245e0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
245f0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
24600 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
24610 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
24620 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
24630 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
24640 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
24650 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
24660 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24670 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
24680 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f  _OK (%i)", CKR_O
24690 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  K);...return(CKR
246a0 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  _OK);.}..static 
246b0 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63 73 31  int cackey_pkcs1
246c0 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72 69 62  1_compare_attrib
246d0 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42 55 54  utes(CK_ATTRIBUT
246e0 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49 42 55  E *a, CK_ATTRIBU
246f0 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69 67 6e  TE *b) {..unsign
24700 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c 62 75  ed char *smallbu
24710 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a 09 73  f, *largebuf;..s
24720 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66 5f 6c  ize_t smallbuf_l
24730 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e  en, largebuf_len
24740 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70 65 20  ;...if (a->type 
24750 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a 09 09  != b->type) {...
24760 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a 0a 09  return(0);..}...
24770 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24780 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66 6f 75  NTF("    ... fou
24790 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79 70 65  nd matching type
247a0 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59   ...");...CACKEY
247b0 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
247c0 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76 61 6c  "    ... our val
247d0 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75 65 2c  ue:", a->pValue,
247e0 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b   a->ulValueLen);
247f0 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c 75 65  ...if (b->pValue
24800 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
24810 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
24820 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20 66 6f  F("       ... fo
24830 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d 61 74  und wildcard mat
24840 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
24850 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61 2d 3e  1);..}...if (a->
24860 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c 29 20  pValue == NULL) 
24870 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09  {...return(0);..
24880 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c 56 61  }.. .if (b->ulVa
24890 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75 6c 56  lueLen == a->ulV
248a0 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d 63 6d  alueLen && memcm
248b0 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e  p(a->pValue, b->
248c0 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56 61 6c  pValue, b->ulVal
248d0 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  ueLen) == 0) {..
248e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
248f0 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e  INTF("       ...
24900 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d 61 74   found exact mat
24910 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ch");....return(
24920 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68 20  1);..}...switch 
24930 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09 63 61  (a->type) {...ca
24940 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a 0a  se CKA_MODULUS:.
24950 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61 6c 75  ...if (a->ulValu
24960 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56 61 6c  eLen == b->ulVal
24970 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65  ueLen) {.....bre
24980 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  ak;....}.....if 
24990 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  (a->ulValueLen >
249a0 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 29 20   b->ulValueLen) 
249b0 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 20 3d  {.....smallbuf =
249c0 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09   b->pValue;.....
249d0 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d 20 62  smallbuf_len = b
249e0 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09  ->ulValueLen;...
249f0 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20 61 2d  ...largebuf = a-
24a00 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c 61 72  >pValue;.....lar
24a10 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d 3e 75  gebuf_len = a->u
24a20 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09 7d 20  lValueLen;....} 
24a30 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61 6c 6c  else {.....small
24a40 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75 65 3b  buf = a->pValue;
24a50 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65  .....smallbuf_le
24a60 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65  n = a->ulValueLe
24a70 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62 75 66  n;......largebuf
24a80 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = b->pValue;...
24a90 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d  ..largebuf_len =
24aa0 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   b->ulValueLen;.
24ab0 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28 3b 20  ...}.....for (; 
24ac0 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21 3d 20  largebuf_len != 
24ad0 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20 6c 61  smallbuf_len; la
24ae0 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65 62 75  rgebuf++,largebu
24af0 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09 09 69  f_len--) {.....i
24b00 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d 20 21  f (largebuf[0] !
24b10 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72 65 61  = 0) {......brea
24b20 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
24b30 09 09 69 66 20 28 6c 61 72 67 65 62 75 66 5f 6c  ..if (largebuf_l
24b40 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c  en != smallbuf_l
24b50 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61 6b 3b  en) {.....break;
24b60 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 6d 65  ....}.....if (me
24b70 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c 20 73  mcmp(largebuf, s
24b80 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c 62 75  mallbuf, smallbu
24b90 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b 0a 09  f_len) == 0) {..
24ba0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24bb0 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
24bc0 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f 78 69  .. found approxi
24bd0 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a 0a 09  mate match");...
24be0 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a 09 09  ...return(1);...
24bf0 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  .}.....break;..}
24c00 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
24c10 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
24c20 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
24c30 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53 45 53  dObjects)(CK_SES
24c40 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
24c50 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  sion, CK_OBJECT_
24c60 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f 62 6a  HANDLE_PTR phObj
24c70 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ect, CK_ULONG ul
24c80 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 2c 20  MaxObjectCount, 
24c90 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
24ca0 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b 0a 09  ObjectCount) {..
24cb0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
24cc0 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69 64 3b  entity *curr_id;
24cd0 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45 20 2a  ..CK_ATTRIBUTE *
24ce0 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b 5f 55  curr_attr;..CK_U
24cf0 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69 64 78  LONG curr_id_idx
24d00 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64  , curr_out_id_id
24d10 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78  x, curr_attr_idx
24d20 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 3b  , sess_attr_idx;
24d30 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74 63 68  ..CK_ULONG match
24d40 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76 5f 6d  ed_count, prev_m
24d50 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a 09 69  atched_count;..i
24d60 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
24d70 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
24d80 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
24d90 44 54 45 53 54 0a 09 73 74 72 75 63 74 20 74 69  DTEST..struct ti
24da0 6d 65 76 61 6c 20 73 74 61 72 74 2c 20 65 6e 64  meval start, end
24db0 3b 0a 09 75 69 6e 74 36 34 5f 74 20 73 74 61 72  ;..uint64_t star
24dc0 74 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74 3b 0a  t_int, end_int;.
24dd0 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45 59 5f  #endif...CACKEY_
24de0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
24df0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
24e00 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
24e10 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
24e20 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
24e30 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
24e40 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
24e50 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
24e60 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
24e70 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 4f 62  ;..}...if (pulOb
24e80 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e 55 4c  jectCount == NUL
24e90 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
24ea0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
24eb0 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43 6f 75  r.  pulObjectCou
24ec0 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  nt is NULL.");..
24ed0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
24ee0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
24ef0 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d  ..if (phObject =
24f00 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61 78 4f  = NULL && ulMaxO
24f10 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 30 29  bjectCount == 0)
24f20 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20 63 69   {.../* Short ci
24f30 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f 20 6f  rcuit, if zero o
24f40 62 6a 65 63 74 73 20 77 65 72 65 20 73 70 65 63  bjects were spec
24f50 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a 65 72  ified return zer
24f60 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69 61 74  o items immediat
24f70 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f 62 6a  ely */...*pulObj
24f80 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09  ectCount = 0;...
24f90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24fa0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
24fb0 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68 6f  CKR_OK (%i) (sho
24fc0 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43 4b  rt circuit)", CK
24fd0 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  R_OK);....return
24fe0 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 69  (CKR_OK);..}...i
24ff0 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d 20 4e  f (phObject == N
25000 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
25010 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
25020 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74 20 69  ror.  phObject i
25030 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
25040 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
25050 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66  TS_BAD);..}...if
25060 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75   (ulMaxObjectCou
25070 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  nt == 0) {...CAC
25080 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25090 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69 6d 75  ("Error.  Maximu
250a0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65  m number of obje
250b0 63 74 73 20 73 70 65 63 69 66 69 65 64 20 61 73  cts specified as
250c0 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72 65 74   zero.");....ret
250d0 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
250e0 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
250f0 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c  (hSession == 0 |
25100 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73  | hSession >= (s
25110 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
25120 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
25130 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
25140 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  0]))) {...CACKEY
25150 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25160 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f  rror.  Session o
25170 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a  ut of range.");.
25180 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
25190 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
251a0 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
251b0 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
251c0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
251d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
251e0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
251f0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
25200 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25210 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
25220 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
25230 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
25240 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
25250 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
25260 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
25270 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
25280 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
25290 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
252a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
252b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
252c0 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
252d0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
252e0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
252f0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
25300 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
25310 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
25320 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76 65  n].search_active
25330 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
25340 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
25350 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
25360 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25370 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61 72 63  F("Error.  Searc
25380 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  h not active.");
25390 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
253a0 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
253b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
253c0 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
253d0 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
253e0 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66  DTEST..gettimeof
253f0 64 61 79 28 26 73 74 61 72 74 2c 20 4e 55 4c 4c  day(&start, NULL
25400 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75 72 72  );.#endif...curr
25410 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20 30 3b  _out_id_idx = 0;
25420 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64 5f 69  ..for (curr_id_i
25430 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  dx = cackey_sess
25440 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25450 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b 20 63  earch_curr_id; c
25460 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63 61 63  urr_id_idx < cac
25470 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25480 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
25490 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d 61 78  s_count && ulMax
254a0 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63 75 72  ObjectCount; cur
254b0 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09 09  r_id_idx++) {...
254c0 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63 6b 65  curr_id = &cacke
254d0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
254e0 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 5b  ion].identities[
254f0 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a 0a 09  curr_id_idx];...
25500 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25510 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69 6e 67  INTF("Processing
25520 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22 2c 20   identity:%lu", 
25530 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
25540 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 0a 09  curr_id_idx);...
25550 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20 3d  .matched_count =
25560 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75 72 72   0;....for (curr
25570 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 63  _attr_idx = 0; c
25580 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c 20 63  urr_attr_idx < c
25590 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
255a0 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f  Session].search_
255b0 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63 75 72  query_count; cur
255c0 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b 0a  r_attr_idx++) {.
255d0 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65 64 5f  ...prev_matched_
255e0 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65 64 5f  count = matched_
255f0 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72 72 5f  count;.....curr_
25600 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79 5f 73  attr = &cackey_s
25610 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
25620 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5b 63  ].search_query[c
25630 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b 0a 0a  urr_attr_idx];..
25640 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25650 50 52 49 4e 54 46 28 22 20 20 43 68 65 63 6b 69  PRINTF("  Checki
25660 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74 65  ng for attribute
25670 20 25 73 20 28 30 78 25 30 38 6c 78 29 20 69 6e   %s (0x%08lx) in
25680 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e 2e 22   identity:%i..."
25690 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
256a0 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f 54 4f  UNC_ATTRIBUTE_TO
256b0 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72 2d 3e  _STR(curr_attr->
256c0 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e 65 64  type), (unsigned
256d0 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
256e0 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20 63 75  ->type, (int) cu
256f0 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 09 43  rr_id_idx);....C
25700 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
25710 54 42 55 46 28 22 20 20 20 20 56 61 6c 75 65 20  TBUF("    Value 
25720 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c 20 63  looking for:", c
25730 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65  urr_attr->pValue
25740 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75 6c 56  , curr_attr->ulV
25750 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 66 6f  alueLen);.....fo
25760 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69 64 78  r (sess_attr_idx
25770 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74 72 5f   = 0; sess_attr_
25780 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d 3e 61  idx < curr_id->a
25790 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e 74 3b  ttributes_count;
257a0 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78 2b 2b   sess_attr_idx++
257b0 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61 63 6b  ) {.....if (cack
257c0 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70 61 72  ey_pkcs11_compar
257d0 65 5f 61 74 74 72 69 62 75 74 65 73 28 26 63 75  e_attributes(&cu
257e0 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75 74 65  rr_id->attribute
257f0 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64 78 5d  s[sess_attr_idx]
25800 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20 7b 0a  , curr_attr)) {.
25810 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63 6f 75  .....matched_cou
25820 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72 65 61  nt++;.......brea
25830 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09  k;.....}....}...
25840 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74 74 72  ../* If the attr
25850 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f 74 20  ibute could not 
25860 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f 20 6e  be matched, do n
25870 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63 68 20  ot try to match 
25880 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74 72 69  additional attri
25890 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66 20 28  butes */....if (
258a0 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63 6f 75  prev_matched_cou
258b0 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f 63 6f  nt == matched_co
258c0 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  unt) {.....break
258d0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66  ;....}...}....if
258e0 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 20   (matched_count 
258f0 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  == cackey_sessio
25900 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61  ns[hSession].sea
25910 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 29  rch_query_count)
25920 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
25930 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e  UG_PRINTF("  ...
25940 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62 75 74   All %i attribut
25950 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
25960 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69 64 65  ound, adding ide
25970 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65 74 75  ntity:%i to retu
25980 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69 6e 74  rned list", (int
25990 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ) cackey_session
259a0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
259b0 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 2c 20  ch_query_count, 
259c0 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f 69 64  (int) curr_id_id
259d0 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65 63 74  x);.....phObject
259e0 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  [curr_out_id_idx
259f0 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64 78 20  ] = curr_id_idx 
25a00 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78 4f 62  + 1;.....ulMaxOb
25a10 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 09  jectCount--;....
25a20 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78  .curr_out_id_idx
25a30 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ++;...} else {..
25a40 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25a50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e 6f 74  RINTF("  ... Not
25a60 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20 66 6f   all %i (only fo
25a70 75 6e 64 20 25 69 29 20 61 74 74 72 69 62 75 74  und %i) attribut
25a80 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72 20 66  es checked for f
25a90 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69 6e 67  ound, not adding
25aa0 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c 20 28   identity:%i", (
25ab0 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73  int) cackey_sess
25ac0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
25ad0 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
25ae0 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68 65 64  t, (int) matched
25af0 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20 63 75  _count, (int) cu
25b00 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09 7d 0a  rr_id_idx);...}.
25b10 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  .}..cackey_sessi
25b20 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
25b30 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d 20 63  arch_curr_id = c
25b40 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a 70 75  urr_id_idx;..*pu
25b50 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 63  lObjectCount = c
25b60 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 3b 0a  urr_out_id_idx;.
25b70 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44  .#ifdef CACKEY_D
25b80 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50 45 45  EBUG_SEARCH_SPEE
25b90 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65 6f 66  DTEST..gettimeof
25ba0 64 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c 29 3b  day(&end, NULL);
25bb0 0a 09 73 74 61 72 74 5f 69 6e 74 20 3d 20 28 73  ..start_int = (s
25bc0 74 61 72 74 2e 74 76 5f 73 65 63 20 2a 20 31 30  tart.tv_sec * 10
25bd0 30 30 30 30 30 29 20 2b 20 73 74 61 72 74 2e 74  00000) + start.t
25be0 76 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69 6e 74  v_usec;..end_int
25bf0 20 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63 20 2a   = (end.tv_sec *
25c00 20 31 30 30 30 30 30 30 29 20 2b 20 65 6e 64 2e   1000000) + end.
25c10 74 76 5f 75 73 65 63 3b 0a 09 66 70 72 69 6e 74  tv_usec;..fprint
25c20 66 28 73 74 64 65 72 72 2c 20 22 53 65 61 72 63  f(stderr, "Searc
25c30 68 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63 72 6f  h took %lu micro
25c40 73 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75 6e 73  seconds\n", (uns
25c50 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65 6e 64  igned long) (end
25c60 5f 69 6e 74 20 2d 20 73 74 61 72 74 5f 69 6e 74  _int - start_int
25c70 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d 75 74  ));.#endif...mut
25c80 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
25c90 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25ca0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25cb0 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
25cc0 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
25cd0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
25ce0 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
25cf0 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
25d00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
25d10 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
25d20 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
25d30 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
25d40 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20 6e 75   CKR_OK (%i), nu
25d50 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c 75 22  m objects = %lu"
25d60 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c 4f 62  , CKR_OK, *pulOb
25d70 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09 72 65  jectCount);...re
25d80 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
25d90 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
25da0 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e  ION(CK_RV, C_Fin
25db0 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29 28 43  dObjectsFinal)(C
25dc0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
25dd0 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 4b   hSession) {..CK
25de0 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69 6e 74  _ULONG idx;..int
25df0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
25e00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25e10 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
25e20 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
25e30 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
25e40 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25e50 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
25e60 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
25e70 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
25e80 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
25e90 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
25ea0 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
25eb0 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
25ec0 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
25ed0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
25ee0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25ef0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
25f00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25f10 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
25f20 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
25f30 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
25f40 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
25f50 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
25f60 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
25f70 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
25f80 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
25f90 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
25fa0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
25fb0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25fc0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
25fd0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
25fe0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25ff0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
26000 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
26010 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26020 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
26030 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
26040 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26050 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
26060 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26070 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
26080 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
26090 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
260a0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
260b0 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
260c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
260d0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
260e0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
260f0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
26100 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
26110 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26120 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
26130 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  rch not active."
26140 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
26150 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
26160 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
26170 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69  }...cackey_sessi
26180 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
26190 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20 30 3b  arch_active = 0;
261a0 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b  ...for (idx = 0;
261b0 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f 73 65   idx < cackey_se
261c0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
261d0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
261e0 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09  unt; idx++) {...
261f0 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
26200 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
26210 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
26220 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66 72 65  pValue) {....fre
26230 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  e(cackey_session
26240 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
26250 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e 70 56  ch_query[idx].pV
26260 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  alue);...}..}...
26270 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73 73 69  if (cackey_sessi
26280 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
26290 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a 09 09  arch_query) {...
262a0 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73  free(cackey_sess
262b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
262c0 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a 09 7d  earch_query);..}
262d0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
262e0 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
262f0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
26300 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
26310 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
26320 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26330 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26340 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
26350 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26360 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
26370 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
26380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
26390 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
263a0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
263b0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
263c0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
263d0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45  CTION(CK_RV, C_E
263e0 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b 5f 53  ncryptInit)(CK_S
263f0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
26400 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
26410 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
26420 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
26430 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
26440 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26450 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26460 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26470 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26480 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26490 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
264a0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
264b0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
264c0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
264d0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
264e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
264f0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26500 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26510 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26520 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26530 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
26540 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
26550 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26560 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
26570 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
26580 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45 53 53  Encrypt)(CK_SESS
26590 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
265a0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
265b0 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47   pData, CK_ULONG
265c0 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42   ulDataLen, CK_B
265d0 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
265e0 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  edData, CK_ULONG
265f0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
26600 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43 41 43  dDataLen) {..CAC
26610 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26620 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
26630 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
26640 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
26650 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
26660 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
26670 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
26680 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
26690 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
266a0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
266b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
266c0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
266d0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
266e0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
266f0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26700 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
26710 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
26720 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
26730 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
26740 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 45 6e  TION(CK_RV, C_En
26750 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
26760 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
26770 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
26780 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
26790 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
267a0 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
267b0 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
267c0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
267d0 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
267e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
267f0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
26800 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
26810 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
26820 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26830 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
26840 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
26850 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
26860 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
26870 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
26880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26890 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
268a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
268b0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
268c0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
268d0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
268e0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
268f0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26900 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26910 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26920 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 29 28  C_EncryptFinal)(
26930 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
26940 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
26950 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45 6e 63  YTE_PTR pLastEnc
26960 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
26970 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61 73 74  LONG_PTR pulLast
26980 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
26990 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
269a0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
269b0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
269c0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
269d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
269e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
269f0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
26a00 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
26a10 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
26a20 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
26a30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26a40 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
26a50 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
26a60 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
26a70 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
26a80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26a90 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
26aa0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
26ab0 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
26ac0 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
26ad0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49 6e 69  RV, C_DecryptIni
26ae0 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  t)(CK_SESSION_HA
26af0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
26b00 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
26b10 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
26b20 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65  BJECT_HANDLE hKe
26b30 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  y) {..int mutex_
26b40 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d  retval;...hKey--
26b50 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
26b60 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
26b70 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
26b80 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
26b90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26ba0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
26bb0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
26bc0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
26bd0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
26be0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
26bf0 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d  ..if (pMechanism
26c00 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
26c10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26c20 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61  F("Error. pMecha
26c30 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  nism is NULL.");
26c40 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
26c50 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
26c60 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
26c70 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d  sm->mechanism !=
26c80 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b   CKM_RSA_PKCS) {
26c90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26ca0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
26cb0 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61  Mechanism->mecha
26cc0 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69  nism not specifi
26cd0 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b  ed as CKM_RSA_PK
26ce0 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  CS");....return(
26cf0 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41  CKR_MECHANISM_PA
26d00 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  RAM_INVALID);..}
26d10 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
26d20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
26d30 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
26d40 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
26d50 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
26d60 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
26d70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26d80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
26d90 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
26da0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
26db0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
26dc0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
26dd0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
26de0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
26df0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
26e00 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
26e10 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
26e20 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26e30 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
26e40 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
26e50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
26e60 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
26e70 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
26e80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
26e90 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
26ea0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
26eb0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
26ec0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
26ed0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
26ee0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
26ef0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
26f00 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
26f10 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
26f20 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
26f30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
26f40 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
26f50 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
26f60 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
26f70 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
26f80 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
26f90 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
26fa0 20 44 65 63 72 79 70 74 20 61 6c 72 65 61 64 79   Decrypt already
26fb0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22 29 3b   in progress.");
26fc0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
26fd0 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54 49 56  _OPERATION_ACTIV
26fe0 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 4b 65  E);..}...if (hKe
26ff0 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  y >= cackey_sess
27000 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
27010 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
27020 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
27030 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
27040 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
27050 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27060 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20 68 61  ("Error.  Key ha
27070 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67  ndle out of rang
27080 65 20 28 72 65 71 75 65 73 74 65 64 20 6b 65 79  e (requested key
27090 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75 20 69   %lu, only %lu i
270a0 64 65 6e 74 69 74 69 65 73 20 61 76 61 69 6c 61  dentities availa
270b0 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ble).", (unsigne
270c0 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20 28 75  d long) hKey, (u
270d0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 61  nsigned long) ca
270e0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
270f0 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
27100 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  es_count);....re
27110 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48 41 4e  turn(CKR_KEY_HAN
27120 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
27130 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
27140 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
27150 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 31 3b  rypt_active = 1;
27160 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
27170 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
27180 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 20 3d  rypt_mechanism =
27190 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
271a0 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65 79 5f  hanism;..cackey_
271b0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
271c0 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 5f  n].decrypt_mech_
271d0 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73  parm = pMechanis
271e0 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b 0a 09  m->pParameter;..
271f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27200 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
27210 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 20 3d  t_mech_parmlen =
27220 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75 6c 50   pMechanism->ulP
27230 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09 63 61  arameterLen;..ca
27240 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27250 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
27260 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61 63 6b  identity = &cack
27270 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27280 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
27290 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65 78 5f  [hKey];...mutex_
272a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
272b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
272c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
272d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
272e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
272f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27300 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
27310 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
27320 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
27330 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
27340 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27350 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
27360 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
27370 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
27380 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
27390 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
273a0 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29 28 43  RV, C_Decrypt)(C
273b0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
273c0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
273d0 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74 65  TE_PTR pEncrypte
273e0 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  dData, CK_ULONG 
273f0 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c  ulEncryptedDataL
27400 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
27410 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
27420 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
27430 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61 74 61  {..CK_ULONG data
27440 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61 74 61  len_update, data
27450 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b 5f 52  len_final;..CK_R
27460 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b 0a 09  V decrypt_ret;..
27470 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
27480 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
27490 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
274a0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
274b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
274c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
274d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
274e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
274f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27500 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
27510 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
27520 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c 65 6e  ..if (pulDataLen
27530 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
27540 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
27550 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44 61 74  F("Error. pulDat
27560 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  aLen is NULL.");
27570 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
27580 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
27590 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70 64 61  }...datalen_upda
275a0 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c 65 6e  te = *pulDataLen
275b0 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65 74 20  ;...decrypt_ret 
275c0 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64 61 74  = C_DecryptUpdat
275d0 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45 6e 63  e(hSession, pEnc
275e0 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c 45 6e  ryptedData, ulEn
275f0 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e 2c 20  cryptedDataLen, 
27600 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65 6e 5f  pData, &datalen_
27610 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28 64 65  update);..if (de
27620 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52  crypt_ret != CKR
27630 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
27640 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
27650 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55 70 64  ror.  DecryptUpd
27660 61 74 65 28 29 20 72 65 74 75 72 6e 65 64 20 66  ate() returned f
27670 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
27680 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
27690 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74  ong) decrypt_ret
276a0 29 3b 0a 0a 09 09 69 66 20 28 64 65 63 72 79 70  );....if (decryp
276b0 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42 55 46  t_ret != CKR_BUF
276c0 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29 20 7b  FER_TOO_SMALL) {
276d0 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ..../* Terminate
276e0 20 64 65 63 72 79 70 74 69 6f 6e 20 6f 70 65 72   decryption oper
276f0 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d 75 74  ation */.....mut
27700 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b  ex_retval = cack
27710 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
27720 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
27730 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
27740 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43  al != 0) {.....C
27750 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27760 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
27770 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
27780 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
27790 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
277a0 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63  ..}.....if (!cac
277b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
277c0 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b  ssion].active) {
277d0 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65  .....cackey_mute
277e0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
277f0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43  biglock);......C
27800 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27810 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
27820 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ion not active."
27830 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
27840 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
27850 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09  DLE_INVALID);...
27860 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
27870 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
27880 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63  sion].decrypt_ac
27890 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61 63 6b  tive) {.....cack
278a0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
278b0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
278c0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
278d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
278e0 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20 61  .  Decrypt not a
278f0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 09  ctive.");.......
27900 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52  .return(CKR_OPER
27910 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41  ATION_NOT_INITIA
27920 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a 09 09  LIZED);....}....
27930 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
27940 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
27950 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a  pt_active = 0;..
27960 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
27970 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
27980 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
27990 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28 6d 75  lock);....if (mu
279a0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
279b0 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45   {.....CACKEY_DE
279c0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
279d0 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
279e0 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09 72 65  iled.");......re
279f0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
27a00 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a 09 09  _ERROR);....}...
27a10 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63 72  }....return(decr
27a20 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09 69  ypt_ret);..}...i
27a30 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09 70 44  f (pData) {...pD
27a40 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e 5f 75  ata += datalen_u
27a50 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74 61 6c  pdate;..}..datal
27a60 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75 6c 44  en_final = *pulD
27a70 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c 65 6e  ataLen - datalen
27a80 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63 72 79  _update;...decry
27a90 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63 72 79  pt_ret = C_Decry
27aa0 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e  ptFinal(hSession
27ab0 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65  , pData, &datale
27ac0 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20 28 64  n_final);..if (d
27ad0 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43 4b  ecrypt_ret != CK
27ae0 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
27af0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
27b00 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 46 69  rror.  DecryptFi
27b10 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64 20 66  nal() returned f
27b20 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75  ailure (rv = %lu
27b30 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  ).", (unsigned l
27b40 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72 65 74  ong) decrypt_ret
27b50 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64 65 63  );....return(dec
27b60 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  rypt_ret);..}...
27b70 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20 64 61  *pulDataLen = da
27b80 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b 20 64  talen_update + d
27b90 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 0a 09  atalen_final;...
27ba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27bb0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
27bc0 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
27bd0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
27be0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  KR_OK);.}..CK_DE
27bf0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
27c00 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 55 70  _RV, C_DecryptUp
27c10 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e  date)(CK_SESSION
27c20 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
27c30 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
27c40 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
27c50 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74  _ULONG ulEncrypt
27c60 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59  edPartLen, CK_BY
27c70 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
27c80 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61  _ULONG_PTR pulPa
27c90 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74 69 63  rtLen) {..static
27ca0 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31 36 33   CK_BYTE buf[163
27cb0 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20 62 75  84];..ssize_t bu
27cc0 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49  flen;..CK_SLOT_I
27cd0 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f 52 56  D slotID;..CK_RV
27ce0 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45   retval = CKR_GE
27cf0 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e  NERAL_ERROR;..in
27d00 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
27d10 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27d20 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
27d30 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
27d40 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
27d50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27d60 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
27d70 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
27d80 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
27d90 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
27da0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
27db0 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
27dc0 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
27dd0 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
27de0 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
27df0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
27e00 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
27e10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
27e20 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
27e30 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
27e40 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
27e50 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
27e60 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
27e70 09 69 66 20 28 70 45 6e 63 72 79 70 74 65 64 50  .if (pEncryptedP
27e80 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75  art == NULL && u
27e90 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65  lEncryptedPartLe
27ea0 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53  n == 0) {.../* S
27eb0 68 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20  hort circuit if 
27ec0 77 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20  we are asked to 
27ed0 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e 67 2e  decrypt nothing.
27ee0 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59 5f 44  .. */...CACKEY_D
27ef0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
27f00 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
27f10 69 29 20 28 73 68 6f 72 74 20 63 69 72 63 75 69  i) (short circui
27f20 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  t)", CKR_OK);...
27f30 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
27f40 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63 72 79  ..}...if (pEncry
27f50 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  ptedPart == NULL
27f60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
27f70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27f80 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61 72 74  . pEncryptedPart
27f90 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20 75 6c   is NULL, but ul
27fa0 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
27fb0 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09   is not 0.");...
27fc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
27fd0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
27fe0 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74 65 64  .if (ulEncrypted
27ff0 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a  PartLen == 0) {.
28000 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28010 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 75 6c  RINTF("Error. ul
28020 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e  EncryptedPartLen
28030 20 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74   is 0, but pPart
28040 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b   is not NULL.");
28050 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
28060 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
28070 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72 74 4c  }...if (pulPartL
28080 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
28090 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
280a0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 50  NTF("Error. pulP
280b0 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  artLen is NULL."
280c0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
280d0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
280e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
280f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
28100 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
28110 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
28120 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
28130 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28140 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28150 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
28160 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
28170 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
28180 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
28190 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
281a0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
281b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
281c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
281d0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
281e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
281f0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
28200 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
28210 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
28220 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
28230 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
28240 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
28250 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79  [hSession].decry
28260 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63  pt_active) {...c
28270 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
28280 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
28290 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
282a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
282b0 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74 20  r.  Decrypt not 
282c0 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
282d0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41  return(CKR_OPERA
282e0 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TION_NOT_INITIAL
282f0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  IZED);..}...slot
28300 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  ID = cackey_sess
28310 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
28320 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73 6c 6f  lotID;...if (slo
28330 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f 74 49  tID < 0 || slotI
28340 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63  D >= (sizeof(cac
28350 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a  key_slots) / siz
28360 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
28370 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
28380 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
28390 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73  Error. Invalid s
283a0 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25  lot requested (%
283b0 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f 66 20  lu), outside of 
283c0 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20 73 6c  valid range", sl
283d0 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75 72 6e  otID);....return
283e0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
283f0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  OR);..}...if (ca
28400 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
28410 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30 29 20  D].active == 0) 
28420 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28430 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28440 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
28450 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 73 6c  uested (%lu), sl
28460 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  ot not currently
28470 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74 49 44   active", slotID
28480 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  );....cackey_mut
28490 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
284a0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65  _biglock);....re
284b0 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
284c0 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 77  _ERROR);..}...sw
284d0 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73 65 73  itch (cackey_ses
284e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
284f0 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73  decrypt_mechanis
28500 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
28510 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
28520 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65 63 72  Ask card to decr
28530 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c 65 6e  ypt */....buflen
28540 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e 64 65   = cackey_signde
28550 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f 73 6c  crypt(&cackey_sl
28560 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63 61 63  ots[slotID], cac
28570 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
28580 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 69  ssion].decrypt_i
28590 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72 79 70  dentity, pEncryp
285a0 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63 72 79  tedPart, ulEncry
285b0 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62 75 66  ptedPartLen, buf
285c0 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 30  , sizeof(buf), 0
285d0 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28 62 75  , 1);.....if (bu
285e0 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09 09 09  flen < 0) {.....
285f0 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20 66 61  /* Decryption fa
28600 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69 66 20  iled. */.....if 
28610 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43 4b 45  (buflen == CACKE
28620 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c 4f 47  Y_PCSC_E_NEEDLOG
28630 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61  IN) {......retva
28640 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e 4f 54  l = CKR_USER_NOT
28650 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09 09 09  _LOGGED_IN;.....
28660 7d 20 65 6c 73 65 20 69 66 20 28 62 75 66 6c 65  } else if (bufle
28670 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  n == CACKEY_PCSC
28680 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 20  _E_TOKENABSENT) 
28690 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20  {......retval = 
286a0 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d 4f 56  CKR_DEVICE_REMOV
286b0 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 7b  ED;.....} else {
286c0 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43  ......retval = C
286d0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
286e0 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65 6c 73  ;.....}....} els
286f0 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e 65 64  e if (((unsigned
28700 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29 20 3e   long) buflen) >
28710 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26 26 20   *pulPartLen && 
28720 70 50 61 72 74 29 20 7b 0a 09 09 09 09 2f 2a 20  pPart) {...../* 
28730 44 65 63 72 79 70 74 65 64 20 64 61 74 61 20 74  Decrypted data t
28740 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09 09 09  oo large */.....
28750 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42 55 46  retval = CKR_BUF
28760 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b 0a 09  FER_TOO_SMALL;..
28770 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 69  ..} else {.....i
28780 66 20 28 70 50 61 72 74 29 20 7b 0a 09 09 09 09  f (pPart) {.....
28790 09 6d 65 6d 63 70 79 28 70 50 61 72 74 2c 20 62  .memcpy(pPart, b
287a0 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09 09  uf, buflen);....
287b0 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61 72 74  .}......*pulPart
287c0 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 0a 09  Len = buflen;...
287d0 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
287e0 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62 72 65  OK;....}.....bre
287f0 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  ak;..}...mutex_r
28800 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
28810 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28820 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
28830 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
28840 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
28850 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28860 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
28870 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65  failed.");....re
28880 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
28890 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41  _ERROR);..}...CA
288a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
288b0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  F("Returning %i"
288c0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
288d0 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c  ...return(retval
288e0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
288f0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
28900 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c 29 28  C_DecryptFinal)(
28910 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
28920 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
28930 59 54 45 5f 50 54 52 20 70 4c 61 73 74 50 61 72  YTE_PTR pLastPar
28940 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
28950 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 29 20  pulLastPartLen) 
28960 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
28970 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d 69 6e  val;..int termin
28980 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20 31 3b  ate_decrypt = 1;
28990 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
289a0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
289b0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
289c0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
289d0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
289e0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
289f0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
28a00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28a10 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
28a20 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
28a30 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
28a40 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
28a50 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
28a60 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
28a70 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
28a80 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
28a90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28aa0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
28ab0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
28ac0 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
28ad0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
28ae0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
28af0 0a 09 69 66 20 28 70 75 6c 4c 61 73 74 50 61 72  ..if (pulLastPar
28b00 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tLen == NULL) {.
28b10 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28b20 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
28b30 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 69 73 20  lLastPartLen is 
28b40 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
28b50 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
28b60 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  _BAD);..}...mute
28b70 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
28b80 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
28b90 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
28ba0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
28bb0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
28bc0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
28bd0 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66  rror.  Locking f
28be0 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
28bf0 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
28c00 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
28c10 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  (!cackey_session
28c20 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69  s[hSession].acti
28c30 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
28c40 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28c50 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
28c60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
28c70 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
28c80 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e  sion not active.
28c90 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
28ca0 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
28cb0 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
28cc0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
28cd0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28ce0 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76 65 29  .decrypt_active)
28cf0 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
28d00 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
28d10 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
28d20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28d30 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70  ("Error.  Decryp
28d40 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  t not active.");
28d50 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
28d60 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
28d70 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
28d80 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72 74 4c 65  ..*pulLastPartLe
28d90 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70 4c 61  n = 0;...if (pLa
28da0 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 29 20  stPart == NULL) 
28db0 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f 64 65  {...terminate_de
28dc0 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a 0a 09  crypt = 0;..}...
28dd0 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 64 65  if (terminate_de
28de0 63 72 79 70 74 29 20 7b 0a 09 09 63 61 63 6b 65  crypt) {...cacke
28df0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
28e00 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74  ion].decrypt_act
28e10 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 6d 75  ive = 0;..}...mu
28e20 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
28e30 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
28e40 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
28e50 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
28e60 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
28e70 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
28e80 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63  F("Error.  Unloc
28e90 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
28ea0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
28eb0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
28ec0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28ed0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
28ee0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
28ef0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72  CKR_OK);...retur
28f00 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b  n(CKR_OK);.}..CK
28f10 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
28f20 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74  (CK_RV, C_Digest
28f30 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
28f40 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
28f50 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
28f60 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 29 20 7b  TR pMechanism) {
28f70 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
28f80 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
28f90 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
28fa0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
28fb0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28fc0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
28fd0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
28fe0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
28ff0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
29000 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
29010 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29020 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
29030 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29040 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
29050 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29060 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
29070 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
29080 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29090 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
290a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
290b0 20 43 5f 44 69 67 65 73 74 29 28 43 4b 5f 53 45   C_Digest)(CK_SE
290c0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
290d0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
290e0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
290f0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
29100 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67 65 73  _BYTE_PTR pDiges
29110 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20  t, CK_ULONG_PTR 
29120 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20 7b 0a  pulDigestLen) {.
29130 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
29140 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
29150 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
29160 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
29170 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29180 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
29190 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
291a0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
291b0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
291c0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
291d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
291e0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
291f0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
29200 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
29210 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29220 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
29230 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
29240 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29250 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
29260 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
29270 43 5f 44 69 67 65 73 74 55 70 64 61 74 65 29 28  C_DigestUpdate)(
29280 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
29290 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
292a0 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
292b0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65  K_ULONG ulPartLe
292c0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
292d0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
292e0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
292f0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
29300 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
29310 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29320 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
29330 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
29340 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
29350 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
29360 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
29370 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
29380 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
29390 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
293a0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
293b0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
293c0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
293d0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
293e0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
293f0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
29400 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 4b 65 79  _RV, C_DigestKey
29410 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29420 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
29430 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
29440 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
29450 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
29460 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
29470 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29480 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29490 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
294a0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
294b0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
294c0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
294d0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
294e0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
294f0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29500 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
29510 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
29520 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
29530 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29540 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
29550 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29560 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
29570 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
29580 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 46  CK_RV, C_DigestF
29590 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49 4f 4e  inal)(CK_SESSION
295a0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
295b0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
295c0 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  igest, CK_ULONG_
295d0 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e  PTR pulDigestLen
295e0 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
295f0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
29600 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
29610 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
29620 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29630 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29640 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29650 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29660 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29670 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29680 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29690 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
296a0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
296b0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
296c0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
296d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
296e0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
296f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
29700 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
29710 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
29720 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74 29 28  RV, C_SignInit)(
29730 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
29740 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
29750 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
29760 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
29770 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
29780 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  {..int mutex_ret
29790 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b 0a 0a  val;...hKey--;..
297a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
297b0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
297c0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
297d0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
297e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
297f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
29800 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
29810 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
29820 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
29830 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
29840 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20 3d 3d  f (pMechanism ==
29850 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
29860 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29870 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e 69 73  Error. pMechanis
29880 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  m is NULL.");...
29890 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
298a0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
298b0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 2d  .if (pMechanism-
298c0 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20 43 4b  >mechanism != CK
298d0 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a 09 09  M_RSA_PKCS) {...
298e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
298f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
29900 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73  hanism->mechanis
29910 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20  m not specified 
29920 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 22  as CKM_RSA_PKCS"
29930 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
29940 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52 41 4d  _MECHANISM_PARAM
29950 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
29960 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20  if (hSession == 
29970 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d  0 || hSession >=
29980 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f   (sizeof(cackey_
29990 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65  sessions) / size
299a0 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
299b0 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ns[0]))) {...CAC
299c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
299d0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
299e0 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22  n out of range."
299f0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
29a00 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  KR_SESSION_HANDL
29a10 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a  E_INVALID);..}..
29a20 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
29a30 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
29a40 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
29a50 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
29a60 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
29a70 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29a80 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
29a90 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
29aa0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
29ab0 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
29ac0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
29ad0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29ae0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
29af0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
29b00 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
29b10 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
29b20 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
29b30 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
29b40 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
29b50 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
29b60 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
29b70 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
29b80 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29b90 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
29ba0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
29bb0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
29bc0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
29bd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
29be0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
29bf0 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f 67 72  already in progr
29c00 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ess.");......ret
29c10 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f  urn(CKR_OPERATIO
29c20 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a 0a 09  N_ACTIVE);..}...
29c30 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61 63 6b  if (hKey >= cack
29c40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
29c50 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73  sion].identities
29c60 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61 63 6b  _count) {...cack
29c70 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
29c80 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
29c90 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
29ca0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29cb0 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75 74 20   Key handle out 
29cc0 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75 65 73  of range (reques
29cd0 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f 6e 6c  ted key %lu, onl
29ce0 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69 65 73  y %lu identities
29cf0 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c 20 28   available).", (
29d00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 68  unsigned long) h
29d10 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  Key, (unsigned l
29d20 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65 73 73  ong) cackey_sess
29d30 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
29d40 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 29  dentities_count)
29d50 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
29d60 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  KEY_HANDLE_INVAL
29d70 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79  ID);..}...cackey
29d80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29d90 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  on].sign_active 
29da0 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65  = 1;...cackey_se
29db0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
29dc0 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73 6d 20  .sign_mechanism 
29dd0 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65  = pMechanism->me
29de0 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63 6b 65  chanism;...cacke
29df0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
29e00 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c 65 6e  ion].sign_buflen
29e10 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65 79 5f   = 128;..cackey_
29e20 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29e30 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64 20  n].sign_bufused 
29e40 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73 65 73  = 0;..cackey_ses
29e50 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
29e60 73 69 67 6e 5f 62 75 66 20 3d 20 6d 61 6c 6c 6f  sign_buf = mallo
29e70 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79  c(sizeof(*cackey
29e80 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
29e90 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20 2a 20  on].sign_buf) * 
29ea0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
29eb0 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
29ec0 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b 45 59  uflen);...CACKEY
29ed0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
29ee0 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67 6e 5f  ession %lu sign_
29ef0 69 64 65 6e 74 69 74 79 20 69 73 20 25 70 20 28  identity is %p (
29f00 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29 22 2c  identity #%lu)",
29f10 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
29f20 20 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f 69 64   hSession, (void
29f30 20 2a 29 20 26 63 61 63 6b 65 79 5f 73 65 73 73   *) &cackey_sess
29f40 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69  ions[hSession].i
29f50 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 2c  dentities[hKey],
29f60 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
29f70 20 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65 79 5f   hKey);..cackey_
29f80 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
29f90 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
29fa0 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69   = &cackey_sessi
29fb0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64  ons[hSession].id
29fc0 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d 3b 0a  entities[hKey];.
29fd0 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
29fe0 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e   cackey_mutex_un
29ff0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
2a000 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
2a010 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
2a020 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a030 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55  RINTF("Error.  U
2a040 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e  nlocking failed.
2a050 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2a060 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
2a070 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2a080 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2a090 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69  rning CKR_OK (%i
2a0a0 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72  )", CKR_OK);...r
2a0b0 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d  eturn(CKR_OK);.}
2a0c0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2a0d0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69  TION(CK_RV, C_Si
2a0e0 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  gn)(CK_SESSION_H
2a0f0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2a100 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74  CK_BYTE_PTR pDat
2a110 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61  a, CK_ULONG ulDa
2a120 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  taLen, CK_BYTE_P
2a130 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43  TR pSignature, C
2a140 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53  K_ULONG_PTR pulS
2a150 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
2a160 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 74  unsigned long st
2a170 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73 65 64  art_sign_bufused
2a180 3b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f 72 65  ;..CK_RV sign_re
2a190 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65  t;..int mutex_re
2a1a0 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  tval;...CACKEY_D
2a1b0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2a1c0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2a1d0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2a1e0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2a1f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a200 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2a210 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2a220 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2a230 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2a240 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69  ..}...if (hSessi
2a250 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73  on == 0 || hSess
2a260 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  ion >= (sizeof(c
2a270 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20  ackey_sessions) 
2a280 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
2a290 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b  sessions[0]))) {
2a2a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2a2b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2a2c0 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72  Session out of r
2a2d0 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  ange.");......re
2a2e0 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2a2f0 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2a300 3b 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73 69 67  ;..}...start_sig
2a310 6e 5f 62 75 66 75 73 65 64 20 3d 20 63 61 63 6b  n_bufused = cack
2a320 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a330 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
2a340 65 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74 20 3d  ed;...sign_ret =
2a350 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28 68 53   C_SignUpdate(hS
2a360 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c 20 75  ession, pData, u
2a370 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66 20 28  lDataLen);..if (
2a380 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b 52 5f  sign_ret != CKR_
2a390 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  OK) {...CACKEY_D
2a3a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2a3b0 6f 72 2e 20 20 53 69 67 6e 55 70 64 61 74 65 28  or.  SignUpdate(
2a3c0 29 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 75  ) returned failu
2a3d0 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c  re (rv = %lu).",
2a3e0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2a3f0 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 69   sign_ret);....i
2a400 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43  f (sign_ret != C
2a410 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d  KR_BUFFER_TOO_SM
2a420 41 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65 78 5f  ALL) {....mutex_
2a430 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
2a440 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65  mutex_lock(cacke
2a450 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69  y_biglock);....i
2a460 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
2a470 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b  != 0) {.....CACK
2a480 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a490 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
2a4a0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09   failed.");.....
2a4b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2a4c0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d  RAL_ERROR);....}
2a4d0 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79  .....if (!cackey
2a4e0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2a4f0 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
2a500 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
2a510 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2a520 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41 43 4b  lock);......CACK
2a530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a540 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2a550 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2a560 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  .......return(CK
2a570 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2a580 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09 7d 0a  _INVALID);....}.
2a590 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ....if (!cackey_
2a5a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a5b0 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 29 20  n].sign_active) 
2a5c0 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74  {.....cackey_mut
2a5d0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2a5e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09  _biglock);......
2a5f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a600 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
2a610 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2a620 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28 43  ........return(C
2a630 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
2a640 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2a650 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73  ..}.....cackey_s
2a660 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2a670 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
2a680 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74  0;.....mutex_ret
2a690 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
2a6a0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2a6b0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66  _biglock);....if
2a6c0 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
2a6d0 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  = 0) {.....CACKE
2a6e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2a6f0 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
2a700 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
2a710 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2a720 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09  ERAL_ERROR);....
2a730 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28  }...}....return(
2a740 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a 09  sign_ret);..}...
2a750 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53 69 67  sign_ret = C_Sig
2a760 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f 6e 2c  nFinal(hSession,
2a770 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70 75 6c   pSignature, pul
2a780 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 09  SignatureLen);..
2a790 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20  if (sign_ret != 
2a7a0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66 20 28  CKR_OK) {...if (
2a7b0 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b 52 5f  sign_ret == CKR_
2a7c0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2a7d0 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
2a7e0 42 55 47 5f 50 52 49 4e 54 46 28 22 53 69 67 6e  BUG_PRINTF("Sign
2a7f0 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64  Final() returned
2a800 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
2a810 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c 75 29  SMALL (rv = %lu)
2a820 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e  , undoing C_Sign
2a830 55 70 64 61 74 65 28 29 22 2c 20 28 75 6e 73 69  Update()", (unsi
2a840 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e 5f  gned long) sign_
2a850 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79  ret);.....cackey
2a860 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2a870 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65 64  on].sign_bufused
2a880 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f 62 75   = start_sign_bu
2a890 66 75 73 65 64 3b 0a 0a 09 09 09 72 65 74 75 72  fused;.....retur
2a8a0 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 09 7d  n(sign_ret);...}
2a8b0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2a8c0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a8d0 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 72 65 74   SignFinal() ret
2a8e0 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20 28 72  urned failure (r
2a8f0 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e 73  v = %lu).", (uns
2a900 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67 6e  igned long) sign
2a910 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e  _ret);....return
2a920 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a 0a  (sign_ret);..}..
2a930 09 69 66 20 28 70 53 69 67 6e 61 74 75 72 65 20  .if (pSignature 
2a940 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2a950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a960 28 22 70 53 69 67 6e 61 74 75 72 65 20 73 70 65  ("pSignature spe
2a970 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20  cified as NULL, 
2a980 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e 55 70  undoing C_SignUp
2a990 64 61 74 65 28 29 22 29 3b 0a 0a 09 09 63 61 63  date()");....cac
2a9a0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a9b0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75  ssion].sign_bufu
2a9c0 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e  sed = start_sign
2a9d0 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 72 65 74  _bufused;....ret
2a9e0 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
2a9f0 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2aa00 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2aa10 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
2aa20 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
2aa30 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
2aa40 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2aa50 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 55  N(CK_RV, C_SignU
2aa60 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2aa70 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2aa80 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2aa90 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Part, CK_ULONG u
2aaa0 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69 6e 74  lPartLen) {..int
2aab0 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a   mutex_retval;..
2aac0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2aad0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2aae0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2aaf0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2ab00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ab10 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2ab20 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2ab30 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2ab40 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ab50 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69  IALIZED);..}...i
2ab60 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2ab70 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2ab80 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2ab90 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2aba0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2abb0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2abc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2abd0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2abe0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2abf0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2ac00 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2ac10 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2ac20 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c  if (pPart == NUL
2ac30 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e 20 3d  L && ulPartLen =
2ac40 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72  = 0) {.../* Shor
2ac50 74 20 63 69 72 63 75 69 74 20 69 66 20 77 65 20  t circuit if we 
2ac60 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73 69 67  are asked to sig
2ac70 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a 2f 0a  n nothing... */.
2ac80 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ac90 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2aca0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73 68   CKR_OK (%i) (sh
2acb0 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20 43  ort circuit)", C
2acc0 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75 72  KR_OK);....retur
2acd0 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(CKR_OK);..}...
2ace0 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e 55 4c  if (pPart == NUL
2acf0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
2ad00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2ad10 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55 4c 4c  r. pPart is NULL
2ad20 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65 6e 20  , but ulPartLen 
2ad30 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a 09 09  is not 0.");....
2ad40 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
2ad50 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
2ad60 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20 3d 3d  if (ulPartLen ==
2ad70 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2ad80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2ad90 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20 69 73  or. ulPartLen is
2ada0 20 30 2c 20 62 75 74 20 70 50 61 72 74 20 69 73   0, but pPart is
2adb0 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09   not NULL.");...
2adc0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2add0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2ade0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
2adf0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
2ae00 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2ae10 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
2ae20 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
2ae30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ae40 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
2ae50 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2ae60 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2ae70 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2ae80 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
2ae90 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2aea0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
2aeb0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
2aec0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2aed0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
2aee0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2aef0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
2af00 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
2af10 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
2af20 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
2af30 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
2af40 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2af50 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
2af60 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
2af70 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2af80 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
2af90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2afa0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e  TF("Error.  Sign
2afb0 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
2afc0 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
2afd0 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e  OPERATION_NOT_IN
2afe0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2aff0 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f  .switch (cackey_
2b000 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b010 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
2b020 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d 5f  m) {...case CKM_
2b030 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a 20  RSA_PKCS:..../* 
2b040 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72 65 63  Accumulate direc
2b050 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28 28 63  tly */....if ((c
2b060 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b070 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b080 66 75 73 65 64 20 2b 20 75 6c 50 61 72 74 4c 65  fused + ulPartLe
2b090 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 65 73 73  n) > cackey_sess
2b0a0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b0b0 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a 09 09  ign_buflen) {...
2b0c0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
2b0d0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b0e0 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a 0a 09  _buflen *= 2;...
2b0f0 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
2b100 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2b110 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f 63 28  n_buf = realloc(
2b120 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2b130 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2b140 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61 63 6b  uf, sizeof(*cack
2b150 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b160 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20  sion].sign_buf) 
2b170 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  * cackey_session
2b180 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b190 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d 0a 0a  _buflen);....}..
2b1a0 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
2b1b0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2b1c0 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b 20 63  on].sign_buf + c
2b1d0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b1e0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b1f0 66 75 73 65 64 2c 20 70 50 61 72 74 2c 20 75 6c  fused, pPart, ul
2b200 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09 63 61  PartLen);.....ca
2b210 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b220 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2b230 75 73 65 64 20 2b 3d 20 75 6c 50 61 72 74 4c 65  used += ulPartLe
2b240 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d  n;.....break;..}
2b250 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2b260 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  = cackey_mutex_u
2b270 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
2b280 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
2b290 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
2b2a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b2b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2b2c0 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64  Unlocking failed
2b2d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2b2e0 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52  KR_GENERAL_ERROR
2b2f0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2b300 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2b310 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2b320 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2b330 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2b340 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2b350 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
2b360 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53  ignFinal)(CK_SES
2b370 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2b380 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2b390 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2b3a0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
2b3b0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 73  gnatureLen) {..s
2b3c0 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20 73 69  tatic CK_BYTE si
2b3d0 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73 73 69  gbuf[1024];..ssi
2b3e0 7a 65 5f 74 20 73 69 67 62 75 66 6c 65 6e 3b 0a  ze_t sigbuflen;.
2b3f0 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  .CK_SLOT_ID slot
2b400 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74 76 61  ID;..CK_RV retva
2b410 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  l = CKR_GENERAL_
2b420 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65 72 6d  ERROR;..int term
2b430 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a  inate_sign = 1;.
2b440 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
2b450 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
2b460 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2b470 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2b480 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2b490 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b4a0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b4b0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2b4c0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2b4d0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2b4e0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2b4f0 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e 61 74  ...if (pulSignat
2b500 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  ureLen == NULL) 
2b510 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2b520 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b530 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20  pulSignatureLen 
2b540 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
2b550 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
2b560 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
2b570 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
2b580 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
2b590 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
2b5a0 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
2b5b0 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
2b5c0 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
2b5d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2b5e0 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
2b5f0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
2b600 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2b610 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
2b620 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
2b630 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
2b640 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
2b650 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
2b660 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
2b670 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
2b680 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b690 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2b6a0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2b6b0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
2b6c0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
2b6d0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
2b6e0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2b6f0 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
2b700 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2b710 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2b720 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2b730 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2b740 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
2b750 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......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 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
2b790 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b7a0 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
2b7b0 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74  ) {...cackey_mut
2b7c0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
2b7d0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41  _biglock);....CA
2b7e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b7f0 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67 6e 20  F("Error.  Sign 
2b800 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09  not active.");..
2b810 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ....return(CKR_O
2b820 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49  PERATION_NOT_INI
2b830 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2b840 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f  slotID = cackey_
2b850 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b860 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20  n].slotID;...if 
2b870 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73  (slotID < 0 || s
2b880 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66  lotID >= (sizeof
2b890 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
2b8a0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
2b8b0 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  lots[0]))) {...C
2b8c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b8d0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
2b8e0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
2b8f0 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65  d (%lu), outside
2b900 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22   of valid range"
2b910 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65  , slotID);....re
2b920 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c  turn(CKR_GENERAL
2b930 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66  _ERROR);..}...if
2b940 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
2b950 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d  lotID].active ==
2b960 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2b970 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2b980 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74  or. Invalid slot
2b990 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29   requested (%lu)
2b9a0 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65  , slot not curre
2b9b0 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c  ntly active", sl
2b9c0 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79  otID);....cackey
2b9d0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
2b9e0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
2b9f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
2ba00 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
2ba10 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65 79  ..switch (cackey
2ba20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ba30 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69  on].sign_mechani
2ba40 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 4d  sm) {...case CKM
2ba50 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f 2a  _RSA_PKCS:..../*
2ba60 20 41 73 6b 20 63 61 72 64 20 74 6f 20 73 69 67   Ask card to sig
2ba70 6e 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59 5f 44  n */....CACKEY_D
2ba80 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41 73 6b  EBUG_PRINTF("Ask
2ba90 69 6e 67 20 74 6f 20 73 69 67 6e 20 66 72 6f 6d  ing to sign from
2baa0 20 69 64 65 6e 74 69 74 79 20 25 70 20 69 6e 20   identity %p in 
2bab0 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20 28 76  session %lu", (v
2bac0 6f 69 64 20 2a 29 20 63 61 63 6b 65 79 5f 73 65  oid *) cackey_se
2bad0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2bae0 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20  .sign_identity, 
2baf0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2bb00 68 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09 73 69  hSession);....si
2bb10 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b 65 79  gbuflen = cackey
2bb20 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26 63 61  _signdecrypt(&ca
2bb30 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
2bb40 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69  D], cackey_sessi
2bb50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2bb60 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63 61 63  gn_identity, cac
2bb70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bb80 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 2c  ssion].sign_buf,
2bb90 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2bba0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2bbb0 62 75 66 75 73 65 64 2c 20 73 69 67 62 75 66 2c  bufused, sigbuf,
2bbc0 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66 29 2c   sizeof(sigbuf),
2bbd0 20 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66 20 28   1, 0);.....if (
2bbe0 73 69 67 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b  sigbuflen < 0) {
2bbf0 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e 67 20  ...../* Signing 
2bc00 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69  failed. */.....i
2bc10 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20  f (sigbuflen == 
2bc20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
2bc30 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09  EDLOGIN) {......
2bc40 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45  retval = CKR_USE
2bc50 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b  R_NOT_LOGGED_IN;
2bc60 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  .....} else if (
2bc70 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  sigbuflen == CAC
2bc80 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
2bc90 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09 09 72  ABSENT) {......r
2bca0 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45 56 49  etval = CKR_DEVI
2bcb0 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09 09 09  CE_REMOVED;.....
2bcc0 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 72 65  } else {......re
2bcd0 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52  tval = CKR_GENER
2bce0 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09 7d 0a  AL_ERROR;.....}.
2bcf0 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28 28 28  ...} else if (((
2bd00 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73  unsigned long) s
2bd10 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70 75 6c  igbuflen) > *pul
2bd20 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26 26 20  SignatureLen && 
2bd30 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a 09 09  pSignature) {...
2bd40 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61 74 61  ../* Signed data
2bd50 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09   too large */...
2bd60 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2bd70 52 49 4e 54 46 28 22 72 65 74 76 61 6c 20 3d 20  RINTF("retval = 
2bd80 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
2bd90 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c 65 6e  MALL;  sigbuflen
2bda0 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67 6e 61   = %lu, pulSigna
2bdb0 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22 2c 20  tureLen = %lu", 
2bdc0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
2bdd0 73 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e 73 69  sigbuflen, (unsi
2bde0 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75 6c 53  gned long) *pulS
2bdf0 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a 0a 09  ignatureLen);...
2be00 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
2be10 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
2be20 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61 74 65  ;......terminate
2be30 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09 7d 20  _sign = 0;....} 
2be40 65 6c 73 65 20 7b 0a 09 09 09 09 74 65 72 6d 69  else {.....termi
2be50 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 0a  nate_sign = 0;..
2be60 09 09 09 09 69 66 20 28 70 53 69 67 6e 61 74 75  ....if (pSignatu
2be70 72 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d 63 70  re) {......memcp
2be80 79 28 70 53 69 67 6e 61 74 75 72 65 2c 20 73 69  y(pSignature, si
2be90 67 62 75 66 2c 20 73 69 67 62 75 66 6c 65 6e 29  gbuf, sigbuflen)
2bea0 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e 61 74  ;.......terminat
2beb0 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09 09 09  e_sign = 1;.....
2bec0 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67 6e 61  }......*pulSigna
2bed0 74 75 72 65 4c 65 6e 20 3d 20 73 69 67 62 75 66  tureLen = sigbuf
2bee0 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76 61 6c  len;......retval
2bef0 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09 7d 0a   = CKR_OK;....}.
2bf00 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
2bf10 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f 73 69  if (terminate_si
2bf20 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61 63 6b  gn) {...if (cack
2bf30 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2bf40 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20  sion].sign_buf) 
2bf50 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  {....free(cackey
2bf60 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2bf70 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b 0a 09  on].sign_buf);..
2bf80 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73  .}....cackey_ses
2bf90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2bfa0 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b  sign_active = 0;
2bfb0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
2bfc0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
2bfd0 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
2bfe0 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
2bff0 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
2c000 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2c010 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2c020 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
2c030 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
2c040 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
2c050 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
2c060 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c070 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c 20 28  Returning %i", (
2c080 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a 0a 09  int) retval);...
2c090 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2c0a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
2c0b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53  CTION(CK_RV, C_S
2c0c0 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 29 28  ignRecoverInit)(
2c0d0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c0e0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2c0f0 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2c100 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2c110 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20  CT_HANDLE hKey) 
2c120 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2c130 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2c140 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2c150 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2c160 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c170 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2c180 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2c190 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2c1a0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2c1b0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2c1c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c1d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2c1e0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2c1f0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2c200 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2c210 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2c220 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2c230 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2c240 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2c250 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2c260 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 29  , C_SignRecover)
2c270 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2c280 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2c290 42 59 54 45 5f 50 54 52 20 70 44 61 74 61 2c 20  BYTE_PTR pData, 
2c2a0 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74 61 4c  CK_ULONG ulDataL
2c2b0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2c2c0 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55  pSignature, CK_U
2c2d0 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69 67 6e  LONG_PTR pulSign
2c2e0 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
2c2f0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c300 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2c310 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2c320 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2c330 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c340 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2c350 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2c360 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2c370 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2c380 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2c390 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c3a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2c3b0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c3c0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2c3d0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c3e0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2c3f0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2c400 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2c410 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2c420 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
2c430 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53 45 53  rifyInit)(CK_SES
2c440 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2c450 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49  sion, CK_MECHANI
2c460 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73  SM_PTR pMechanis
2c470 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e  m, CK_OBJECT_HAN
2c480 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43 41 43  DLE hKey) {..CAC
2c490 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c4a0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2c4b0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2c4c0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2c4d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c4e0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2c4f0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2c500 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2c510 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2c520 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2c530 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c540 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2c550 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c560 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2c570 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c580 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2c590 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2c5a0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2c5b0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2c5c0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
2c5d0 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  rify)(CK_SESSION
2c5e0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2c5f0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2c600 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2c610 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
2c620 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
2c630 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69 67 6e   CK_ULONG ulSign
2c640 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43 41 43  atureLen) {..CAC
2c650 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c660 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2c670 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2c680 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2c690 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2c6a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2c6b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2c6c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2c6d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2c6e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2c6f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2c700 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2c710 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2c720 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2c730 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2c740 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2c750 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2c760 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2c770 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2c780 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 56 65  TION(CK_RV, C_Ve
2c790 72 69 66 79 55 70 64 61 74 65 29 28 43 4b 5f 53  rifyUpdate)(CK_S
2c7a0 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2c7b0 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2c7c0 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2c7d0 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b  ONG ulPartLen) {
2c7e0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2c7f0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2c800 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2c810 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2c820 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c830 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2c840 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2c850 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2c860 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2c870 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2c880 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c890 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2c8a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2c8b0 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2c8c0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2c8d0 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2c8e0 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2c8f0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2c900 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2c910 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2c920 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 29 28   C_VerifyFinal)(
2c930 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2c940 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42  E hSession, CK_B
2c950 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75  YTE_PTR pSignatu
2c960 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53  re, CK_ULONG ulS
2c970 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09  ignatureLen) {..
2c980 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c990 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2c9a0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2c9b0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2c9c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2c9d0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2c9e0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2c9f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2ca00 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2ca10 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2ca20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ca30 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2ca40 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2ca50 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2ca60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ca70 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2ca80 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2ca90 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2caa0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2cab0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2cac0 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
2cad0 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  it)(CK_SESSION_H
2cae0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2caf0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2cb00 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2cb10 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b  OBJECT_HANDLE hK
2cb20 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2cb30 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2cb40 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2cb50 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2cb60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2cb70 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2cb80 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2cb90 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2cba0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2cbb0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2cbc0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2cbd0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2cbe0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2cbf0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2cc00 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2cc10 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2cc20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2cc30 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2cc40 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2cc50 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2cc60 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79 52 65  K_RV, C_VerifyRe
2cc70 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53 49 4f  cover)(CK_SESSIO
2cc80 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2cc90 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2cca0 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f 55 4c  Signature, CK_UL
2ccb0 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72 65 4c  ONG ulSignatureL
2ccc0 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  en, CK_BYTE_PTR 
2ccd0 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 5f  pData, CK_ULONG_
2cce0 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e 29 20  PTR pulDataLen) 
2ccf0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
2cd00 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2cd10 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2cd20 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2cd30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2cd40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2cd50 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2cd60 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2cd70 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2cd80 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2cd90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2cda0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
2cdb0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2cdc0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
2cdd0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
2cde0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
2cdf0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
2ce00 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2ce10 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
2ce20 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
2ce30 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72 79 70  , C_DigestEncryp
2ce40 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  tUpdate)(CK_SESS
2ce50 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2ce60 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2ce70 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2ce80 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42   ulPartLen, CK_B
2ce90 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70 74  YTE_PTR pEncrypt
2cea0 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47  edPart, CK_ULONG
2ceb0 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70 74 65  _PTR pulEncrypte
2cec0 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43  dPartLen) {..CAC
2ced0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cee0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2cef0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2cf00 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2cf10 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2cf20 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2cf30 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2cf40 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2cf50 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2cf60 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2cf70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2cf80 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2cf90 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2cfa0 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2cfb0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2cfc0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2cfd0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2cfe0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2cff0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2d000 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 65  TION(CK_RV, C_De
2d010 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
2d020 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  e)(CK_SESSION_HA
2d030 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2d040 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72  K_BYTE_PTR pEncr
2d050 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c  yptedPart, CK_UL
2d060 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65 64 50  ONG ulEncryptedP
2d070 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f  artLen, CK_BYTE_
2d080 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c  PTR pPart, CK_UL
2d090 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72 74 4c  ONG_PTR pulPartL
2d0a0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
2d0b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2d0c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2d0d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2d0e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2d0f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2d100 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2d110 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2d120 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2d130 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2d140 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2d150 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2d160 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2d170 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2d180 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2d190 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d1a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2d1b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d1c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2d1d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2d1e0 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e 63 72  K_RV, C_SignEncr
2d1f0 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
2d200 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2d210 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2d220 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2d230 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
2d240 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2d250 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2d260 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
2d270 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
2d280 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d290 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2d2a0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2d2b0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2d2c0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d2d0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2d2e0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2d2f0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2d300 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2d310 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2d320 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d330 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2d340 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d350 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2d360 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d370 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2d380 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2d390 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d3a0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2d3b0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2d3c0 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
2d3d0 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2d3e0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2d3f0 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2d400 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2d410 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
2d420 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
2d430 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2d440 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
2d450 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2d460 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2d470 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2d480 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2d490 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2d4a0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d4b0 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2d4c0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2d4d0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2d4e0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d4f0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2d500 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2d510 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2d520 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d530 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2d540 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d550 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2d560 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d570 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2d580 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d590 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65 72 61  (CK_RV, C_Genera
2d5a0 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f  teKey)(CK_SESSIO
2d5b0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2d5c0 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f  n, CK_MECHANISM_
2d5d0 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20  PTR pMechanism, 
2d5e0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
2d5f0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
2d600 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
2d610 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
2d620 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
2d630 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d640 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2d650 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2d660 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2d670 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2d680 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2d690 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2d6a0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2d6b0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2d6c0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2d6d0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2d6e0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2d6f0 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d700 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2d710 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d720 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2d730 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2d740 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2d750 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2d760 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65  TION(CK_RV, C_Ge
2d770 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29 28 43  nerateKeyPair)(C
2d780 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2d790 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45   hSession, CK_ME
2d7a0 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63  CHANISM_PTR pMec
2d7b0 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54 52 49  hanism, CK_ATTRI
2d7c0 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c 69 63  BUTE_PTR pPublic
2d7d0 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  KeyTemplate, CK_
2d7e0 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63 4b 65  ULONG ulPublicKe
2d7f0 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c  yAttributeCount,
2d800 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
2d810 52 20 70 50 72 69 76 61 74 65 4b 65 79 54 65 6d  R pPrivateKeyTem
2d820 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20  plate, CK_ULONG 
2d830 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74 74 72  ulPrivateKeyAttr
2d840 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f  ibuteCount, CK_O
2d850 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52  BJECT_HANDLE_PTR
2d860 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20 43 4b   phPublicKey, CK
2d870 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
2d880 54 52 20 70 68 50 72 69 76 61 74 65 4b 65 79 29  TR phPrivateKey)
2d890 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2d8a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2d8b0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2d8c0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2d8d0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d8e0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2d8f0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2d900 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2d910 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2d920 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2d930 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d940 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2d950 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2d960 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2d970 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2d980 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2d990 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2d9a0 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d9b0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2d9c0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2d9d0 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28 43 4b  V, C_WrapKey)(CK
2d9e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2d9f0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
2da00 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
2da10 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
2da20 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70 69 6e  _HANDLE hWrappin
2da30 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f  gKey, CK_OBJECT_
2da40 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43 4b 5f  HANDLE hKey, CK_
2da50 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70 65  BYTE_PTR pWrappe
2da60 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50  dKey, CK_ULONG_P
2da70 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b 65 79  TR pulWrappedKey
2da80 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
2da90 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2daa0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
2dab0 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
2dac0 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
2dad0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2dae0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
2daf0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
2db00 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
2db10 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2db20 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2db30 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2db40 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2db50 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
2db60 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
2db70 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2db80 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
2db90 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2dba0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
2dbb0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
2dbc0 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61 70 4b  CK_RV, C_UnwrapK
2dbd0 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
2dbe0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
2dbf0 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52  CK_MECHANISM_PTR
2dc00 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f   pMechanism, CK_
2dc10 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 55  OBJECT_HANDLE hU
2dc20 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20 43 4b  nwrappingKey, CK
2dc30 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70 70  _BYTE_PTR pWrapp
2dc40 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47 20  edKey, CK_ULONG 
2dc50 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65 6e 2c  ulWrappedKeyLen,
2dc60 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54   CK_ATTRIBUTE_PT
2dc70 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f  R pTemplate, CK_
2dc80 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62 75 74  ULONG ulAttribut
2dc90 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a 45 43  eCount, CK_OBJEC
2dca0 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4b  T_HANDLE_PTR phK
2dcb0 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  ey) {..CACKEY_DE
2dcc0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2dcd0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2dce0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2dcf0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2dd00 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2dd10 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2dd20 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2dd30 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2dd40 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2dd50 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
2dd60 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
2dd70 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
2dd80 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
2dd90 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2dda0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2ddb0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
2ddc0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2ddd0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
2dde0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
2ddf0 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65 4b 65  K_RV, C_DeriveKe
2de00 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  y)(CK_SESSION_HA
2de10 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2de20 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20  K_MECHANISM_PTR 
2de30 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f  pMechanism, CK_O
2de40 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 42 61  BJECT_HANDLE hBa
2de50 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52 49 42  seKey, CK_ATTRIB
2de60 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61 74  UTE_PTR pTemplat
2de70 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74  e, CK_ULONG ulAt
2de80 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
2de90 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
2dea0 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43 41 43  TR phKey) {..CAC
2deb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2dec0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
2ded0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
2dee0 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
2def0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2df00 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
2df10 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
2df20 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
2df30 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
2df40 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
2df50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2df60 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55  Returning CKR_FU
2df70 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2df80 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f  RTED (%i)", CKR_
2df90 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2dfa0 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72  PORTED);...retur
2dfb0 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  n(CKR_FUNCTION_N
2dfc0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d  OT_SUPPORTED);.}
2dfd0 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43  ..CK_DEFINE_FUNC
2dfe0 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 65  TION(CK_RV, C_Se
2dff0 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53 45 53  edRandom)(CK_SES
2e000 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
2e010 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  sion, CK_BYTE_PT
2e020 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c 4f 4e  R pSeed, CK_ULON
2e030 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b 0a 09  G ulSeedLen) {..
2e040 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e050 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
2e060 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
2e070 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
2e080 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e090 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
2e0a0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
2e0b0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
2e0c0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
2e0d0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
2e0e0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e0f0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2e100 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
2e110 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
2e120 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e130 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
2e140 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2e150 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e160 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2e170 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2e180 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f 6d 29  _GenerateRandom)
2e190 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2e1a0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2e1b0 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64 6f 6d  BYTE_PTR pRandom
2e1c0 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  Data, CK_ULONG u
2e1d0 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a 09 43  lRandomLen) {..C
2e1e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e1f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e200 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2e210 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2e220 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e230 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2e240 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2e250 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2e260 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2e270 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2e280 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e290 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2e2a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e2b0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2e2c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e2d0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2e2e0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2e2f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e300 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61 74 65  .}../* Deprecate
2e310 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b  d Function */.CK
2e320 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2e330 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46 75 6e  (CK_RV, C_GetFun
2e340 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43 4b 5f  ctionStatus)(CK_
2e350 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2e360 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41 43 4b  Session) {..CACK
2e370 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2e380 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41  "Called.");...CA
2e390 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e3a0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
2e3b0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
2e3c0 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20 43 4b  RALLEL (%i)", CK
2e3d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50  R_FUNCTION_NOT_P
2e3e0 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65 74 75  ARALLEL);...retu
2e3f0 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
2e400 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a  NOT_PARALLEL);..
2e410 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53 65 73  .hSession = hSes
2e420 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65 73 73  sion; /* Supress
2e430 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
2e440 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f   warning */.}../
2e450 2a 20 44 65 70 72 65 63 61 74 65 64 20 46 75 6e  * Deprecated Fun
2e460 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45 46 49  ction */.CK_DEFI
2e470 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2e480 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e 63 74  V, C_CancelFunct
2e490 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ion)(CK_SESSION_
2e4a0 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 29  HANDLE hSession)
2e4b0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2e4c0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2e4d0 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ");...CACKEY_DEB
2e4e0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2e4f0 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
2e500 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 20 28  N_NOT_PARALLEL (
2e510 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
2e520 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29  ON_NOT_PARALLEL)
2e530 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2e540 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41  UNCTION_NOT_PARA
2e550 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73 69 6f  LLEL);...hSessio
2e560 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20 2f 2a  n = hSession; /*
2e570 20 53 75 70 72 65 73 73 20 75 6e 75 73 65 64 20   Supress unused 
2e580 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69 6e 67  variable warning
2e590 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45   */.}..CK_DEFINE
2e5a0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2e5b0 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69   C_GetFunctionLi
2e5c0 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f  st)(CK_FUNCTION_
2e5d0 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70 70 46  LIST_PTR_PTR ppF
2e5e0 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b 0a 09  unctionList) {..
2e5f0 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49 53 54  CK_FUNCTION_LIST
2e600 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e 4c 69  _PTR pFunctionLi
2e610 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  st;...CACKEY_DEB
2e620 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2e630 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70 46 75  d.");...if (ppFu
2e640 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20 4e 55  nctionList == NU
2e650 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
2e660 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e670 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e 4c 69  or. ppFunctionLi
2e680 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a  st is NULL.");..
2e690 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2e6a0 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2e6b0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20  ..pFunctionList 
2e6c0 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
2e6d0 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 29  *pFunctionList))
2e6e0 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ;...pFunctionLis
2e6f0 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  t->version.major
2e700 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
2e710 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
2e720 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  E) >> 16) & 0xff
2e730 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2e740 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  ->version.minor 
2e750 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
2e760 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
2e770 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
2e780 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2e790 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20 3d 20  >C_Initialize = 
2e7a0 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a 09 70  C_Initialize;..p
2e7b0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2e7c0 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46 69 6e  Finalize = C_Fin
2e7d0 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74 69 6f  alize;..pFunctio
2e7e0 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e 66 6f  nList->C_GetInfo
2e7f0 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a 09 70   = C_GetInfo;..p
2e800 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2e810 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20 43 5f  GetSlotList = C_
2e820 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09 70 46  GetSlotList;..pF
2e830 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2e840 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43 5f 47  etSlotInfo = C_G
2e850 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70 46 75  etSlotInfo;..pFu
2e860 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2e870 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43 5f 47  tTokenInfo = C_G
2e880 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09 70 46  etTokenInfo;..pF
2e890 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57  unctionList->C_W
2e8a0 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e 74 20  aitForSlotEvent 
2e8b0 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45  = C_WaitForSlotE
2e8c0 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  vent;..pFunction
2e8d0 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63 68 61  List->C_GetMecha
2e8e0 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47 65 74  nismList = C_Get
2e8f0 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b 0a 09  MechanismList;..
2e900 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2e910 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49 6e 66  _GetMechanismInf
2e920 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61 6e 69  o = C_GetMechani
2e930 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63 74 69  smInfo;..pFuncti
2e940 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74 54 6f  onList->C_InitTo
2e950 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f 6b 65  ken = C_InitToke
2e960 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  n;..pFunctionLis
2e970 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d 20 43  t->C_InitPIN = C
2e980 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75 6e 63  _InitPIN;..pFunc
2e990 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 50  tionList->C_SetP
2e9a0 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b 0a 09  IN = C_SetPIN;..
2e9b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2e9c0 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d 20 43  _OpenSession = C
2e9d0 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 09 70  _OpenSession;..p
2e9e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2e9f0 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d 20 43  CloseSession = C
2ea00 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b 0a 09  _CloseSession;..
2ea10 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ea20 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69 6f 6e  _CloseAllSession
2ea30 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c 53 65  s = C_CloseAllSe
2ea40 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63 74 69  ssions;..pFuncti
2ea50 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53 65 73  onList->C_GetSes
2ea60 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47 65 74  sionInfo = C_Get
2ea70 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09 70 46  SessionInfo;..pF
2ea80 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47  unctionList->C_G
2ea90 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65  etOperationState
2eaa0 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74 69 6f   = C_GetOperatio
2eab0 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  nState;..pFuncti
2eac0 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f 70 65  onList->C_SetOpe
2ead0 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20 43 5f  rationState = C_
2eae0 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61 74  SetOperationStat
2eaf0 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  e;..pFunctionLis
2eb00 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43 5f 4c  t->C_Login = C_L
2eb10 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  ogin;..pFunction
2eb20 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74 20 3d  List->C_Logout =
2eb30 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46 75 6e   C_Logout;..pFun
2eb40 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 72 65  ctionList->C_Cre
2eb50 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f 43 72  ateObject = C_Cr
2eb60 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70 46 75  eateObject;..pFu
2eb70 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43 6f  nctionList->C_Co
2eb80 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43 6f 70  pyObject = C_Cop
2eb90 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e 63 74  yObject;..pFunct
2eba0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73 74 72  ionList->C_Destr
2ebb0 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44 65 73  oyObject = C_Des
2ebc0 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75  troyObject;..pFu
2ebd0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2ebe0 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20 43 5f  tObjectSize = C_
2ebf0 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b 0a 09  GetObjectSize;..
2ec00 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2ec10 5f 47 65 74 41 74 74 72 69 62 75 74 65 56 61 6c  _GetAttributeVal
2ec20 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72 69 62  ue = C_GetAttrib
2ec30 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63  uteValue;..pFunc
2ec40 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 41  tionList->C_SetA
2ec50 74 74 72 69 62 75 74 65 56 61 6c 75 65 20 3d 20  ttributeValue = 
2ec60 43 5f 53 65 74 41 74 74 72 69 62 75 74 65 56 61  C_SetAttributeVa
2ec70 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  lue;..pFunctionL
2ec80 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a 65 63  ist->C_FindObjec
2ec90 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e 64 4f  tsInit = C_FindO
2eca0 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70 46 75  bjectsInit;..pFu
2ecb0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69  nctionList->C_Fi
2ecc0 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f 46 69  ndObjects = C_Fi
2ecd0 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46 75 6e  ndObjects;..pFun
2ece0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e  ctionList->C_Fin
2ecf0 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20 3d 20  dObjectsFinal = 
2ed00 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e  C_FindObjectsFin
2ed10 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  al;..pFunctionLi
2ed20 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49 6e 69  st->C_EncryptIni
2ed30 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49 6e 69  t = C_EncryptIni
2ed40 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  t;..pFunctionLis
2ed50 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d 20 43  t->C_Encrypt = C
2ed60 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75 6e 63  _Encrypt;..pFunc
2ed70 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e 63 72  tionList->C_Encr
2ed80 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f 45 6e  yptUpdate = C_En
2ed90 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46  cryptUpdate;..pF
2eda0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45  unctionList->C_E
2edb0 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20 43 5f  ncryptFinal = C_
2edc0 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a 09 70  EncryptFinal;..p
2edd0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2ede0 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20 43 5f  DecryptInit = C_
2edf0 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09 70 46  DecryptInit;..pF
2ee00 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2ee10 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63 72 79  ecrypt = C_Decry
2ee20 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  pt;..pFunctionLi
2ee30 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55 70 64  st->C_DecryptUpd
2ee40 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 55  ate = C_DecryptU
2ee50 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
2ee60 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74  nList->C_Decrypt
2ee70 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72 79 70  Final = C_Decryp
2ee80 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69  tFinal;..pFuncti
2ee90 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
2eea0 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73 74 49  Init = C_DigestI
2eeb0 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
2eec0 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20 3d 20  ist->C_Digest = 
2eed0 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75 6e 63  C_Digest;..pFunc
2eee0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
2eef0 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44 69 67  stUpdate = C_Dig
2ef00 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  estUpdate;..pFun
2ef10 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67  ctionList->C_Dig
2ef20 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67 65 73  estKey = C_Diges
2ef30 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  tKey;..pFunction
2ef40 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 46 69  List->C_DigestFi
2ef50 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74 46 69  nal = C_DigestFi
2ef60 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nal;..pFunctionL
2ef70 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69 74 20  ist->C_SignInit 
2ef80 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a 09 70  = C_SignInit;..p
2ef90 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2efa0 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b 0a 09  Sign = C_Sign;..
2efb0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2efc0 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20 43 5f  _SignUpdate = C_
2efd0 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70 46 75  SignUpdate;..pFu
2efe0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69  nctionList->C_Si
2eff0 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69 67 6e  gnFinal = C_Sign
2f000 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
2f010 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52 65 63  nList->C_SignRec
2f020 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53 69 67  overInit = C_Sig
2f030 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70  nRecoverInit;..p
2f040 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f050 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20 43 5f  SignRecover = C_
2f060 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09 70 46  SignRecover;..pF
2f070 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56  unctionList->C_V
2f080 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f 56 65  erifyInit = C_Ve
2f090 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75 6e 63  rifyInit;..pFunc
2f0a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
2f0b0 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b 0a 09  fy = C_Verify;..
2f0c0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f0d0 5f 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20  _VerifyUpdate = 
2f0e0 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 3b 0a  C_VerifyUpdate;.
2f0f0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f100 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20 3d 20  C_VerifyFinal = 
2f110 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b 0a 09  C_VerifyFinal;..
2f120 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f130 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72 49 6e  _VerifyRecoverIn
2f140 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52 65 63  it = C_VerifyRec
2f150 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75 6e 63  overInit;..pFunc
2f160 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65 72 69  tionList->C_Veri
2f170 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f 56 65  fyRecover = C_Ve
2f180 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09 70 46  rifyRecover;..pF
2f190 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2f1a0 69 67 65 73 74 45 6e 63 72 79 70 74 55 70 64 61  igestEncryptUpda
2f1b0 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45 6e 63  te = C_DigestEnc
2f1c0 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70 46 75  ryptUpdate;..pFu
2f1d0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65  nctionList->C_De
2f1e0 63 72 79 70 74 44 69 67 65 73 74 55 70 64 61 74  cryptDigestUpdat
2f1f0 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44 69 67  e = C_DecryptDig
2f200 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e  estUpdate;..pFun
2f210 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67  ctionList->C_Sig
2f220 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65 20 3d  nEncryptUpdate =
2f230 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74 55 70   C_SignEncryptUp
2f240 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  date;..pFunction
2f250 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 56  List->C_DecryptV
2f260 65 72 69 66 79 55 70 64 61 74 65 20 3d 20 43 5f  erifyUpdate = C_
2f270 44 65 63 72 79 70 74 56 65 72 69 66 79 55 70 64  DecryptVerifyUpd
2f280 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2f290 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b  ist->C_GenerateK
2f2a0 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74 65 4b  ey = C_GenerateK
2f2b0 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
2f2c0 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 4b 65  st->C_GenerateKe
2f2d0 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65 72 61  yPair = C_Genera
2f2e0 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46 75 6e  teKeyPair;..pFun
2f2f0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57 72 61  ctionList->C_Wra
2f300 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b 65 79  pKey = C_WrapKey
2f310 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f320 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20 3d 20  ->C_UnwrapKey = 
2f330 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09 70 46  C_UnwrapKey;..pF
2f340 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2f350 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44 65 72  eriveKey = C_Der
2f360 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  iveKey;..pFuncti
2f370 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64 52 61  onList->C_SeedRa
2f380 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52 61 6e  ndom = C_SeedRan
2f390 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  dom;..pFunctionL
2f3a0 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65 52  ist->C_GenerateR
2f3b0 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65 72 61  andom = C_Genera
2f3c0 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63  teRandom;..pFunc
2f3d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46  tionList->C_GetF
2f3e0 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20 3d 20  unctionStatus = 
2f3f0 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53 74 61  C_GetFunctionSta
2f400 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  tus;..pFunctionL
2f410 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46 75 6e  ist->C_CancelFun
2f420 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63 65 6c  ction = C_Cancel
2f430 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75 6e 63  Function;..pFunc
2f440 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 46  tionList->C_GetF
2f450 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20 43 5f  unctionList = C_
2f460 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 3b  GetFunctionList;
2f470 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e 4c 69  ...*ppFunctionLi
2f480 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e 4c 69  st = pFunctionLi
2f490 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  st;...CACKEY_DEB
2f4a0 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2f4b0 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2f4c0 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2f4d0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2f4e0 0a                                               .