Hex Artifact Content

Artifact ddd6381c905b7fe0936dc0597b4d1f01145aca2e:


0000: 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f 4e 46  #ifdef HAVE_CONF
0010: 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 22 63  IG_H.#include "c
0020: 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 66 0a  onfig.h".#endif.
0030: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 57 49 4e  .#ifdef HAVE_WIN
0040: 54 59 50 45 53 5f 48 0a 23 20 20 69 6e 63 6c 75  TYPES_H.#  inclu
0050: 64 65 20 3c 77 69 6e 74 79 70 65 73 2e 68 3e 0a  de <wintypes.h>.
0060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0070: 56 45 5f 50 43 53 43 4c 49 54 45 5f 48 0a 23 20  VE_PCSCLITE_H.# 
0080: 20 69 6e 63 6c 75 64 65 20 3c 70 63 73 63 6c 69   include <pcscli
0090: 74 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  te.h>.#endif.#if
00a0: 64 65 66 20 48 41 56 45 5f 57 49 4e 53 43 41 52  def HAVE_WINSCAR
00b0: 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  D_H.#  include <
00c0: 77 69 6e 73 63 61 72 64 2e 68 3e 0a 23 65 6e 64  winscard.h>.#end
00d0: 69 66 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53  if.#ifdef HAVE_S
00e0: 54 44 49 4e 54 5f 48 0a 23 20 20 69 6e 63 6c 75  TDINT_H.#  inclu
00f0: 64 65 20 3c 73 74 64 69 6e 74 2e 68 3e 0a 23 65  de <stdint.h>.#e
0100: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0110: 5f 49 4e 54 54 59 50 45 53 5f 48 0a 23 20 20 69  _INTTYPES_H.#  i
0120: 6e 63 6c 75 64 65 20 3c 69 6e 74 74 79 70 65 73  nclude <inttypes
0130: 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  .h>.#endif.#ifde
0140: 66 20 48 41 56 45 5f 53 54 44 4c 49 42 5f 48 0a  f HAVE_STDLIB_H.
0150: 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  #  include <stdl
0160: 69 62 2e 68 3e 0a 23 65 6e 64 69 66 0a 23 69 66  ib.h>.#endif.#if
0170: 64 65 66 20 48 41 56 45 5f 55 4e 49 53 54 44 5f  def HAVE_UNISTD_
0180: 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 75 6e  H.#  include <un
0190: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
01a0: 69 66 64 65 66 20 48 41 56 45 5f 53 54 52 49 4e  ifdef HAVE_STRIN
01b0: 47 5f 48 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  G_H.#  include <
01c0: 73 74 72 69 6e 67 2e 68 3e 0a 23 65 6e 64 69 66  string.h>.#endif
01d0: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 50 54 48  .#ifdef HAVE_PTH
01e0: 52 45 41 44 5f 48 0a 23 20 20 69 6e 63 6c 75 64  READ_H.#  includ
01f0: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 65  e <pthread.h>.#e
0200: 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41 56 45  ndif.#ifdef HAVE
0210: 5f 4c 49 4d 49 54 53 5f 48 0a 23 20 20 69 6e 63  _LIMITS_H.#  inc
0220: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
0230: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0240: 56 45 5f 53 54 44 49 4f 5f 48 0a 23 20 20 69 6e  VE_STDIO_H.#  in
0250: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a  clude <stdio.h>.
0260: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 48 41  #endif.#ifdef HA
0270: 56 45 5f 5a 4c 49 42 5f 48 0a 23 20 20 69 66 64  VE_ZLIB_H.#  ifd
0280: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20  ef HAVE_LIBZ.#  
0290: 20 20 69 6e 63 6c 75 64 65 20 3c 7a 6c 69 62 2e    include <zlib.
02a0: 68 3e 0a 23 20 20 65 6e 64 69 66 0a 23 65 6c 73  h>.#  endif.#els
02b0: 65 0a 23 20 20 69 66 64 65 66 20 48 41 56 45 5f  e.#  ifdef HAVE_
02c0: 4c 49 42 5a 0a 23 20 20 20 20 75 6e 64 65 66 20  LIBZ.#    undef 
02d0: 48 41 56 45 5f 4c 49 42 5a 0a 23 20 20 65 6e 64  HAVE_LIBZ.#  end
02e0: 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
02f0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 53 45   CACKEY_DEBUG_SE
0300: 41 52 43 48 5f 53 50 45 45 44 54 45 53 54 0a 23  ARCH_SPEEDTEST.#
0310: 20 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74    include <sys/t
0320: 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ime.h>.#endif..#
0330: 64 65 66 69 6e 65 20 43 4b 5f 50 54 52 20 2a 0a  define CK_PTR *.
0340: 23 64 65 66 69 6e 65 20 43 4b 5f 44 45 46 49 4e  #define CK_DEFIN
0350: 45 5f 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72  E_FUNCTION(retur
0360: 6e 54 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74  nType, name) ret
0370: 75 72 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65  urnType name.#de
0380: 66 69 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f  fine CK_DECLARE_
0390: 46 55 4e 43 54 49 4f 4e 28 72 65 74 75 72 6e 54  FUNCTION(returnT
03a0: 79 70 65 2c 20 6e 61 6d 65 29 20 72 65 74 75 72  ype, name) retur
03b0: 6e 54 79 70 65 20 6e 61 6d 65 0a 23 64 65 66 69  nType name.#defi
03c0: 6e 65 20 43 4b 5f 44 45 43 4c 41 52 45 5f 46 55  ne CK_DECLARE_FU
03d0: 4e 43 54 49 4f 4e 5f 50 4f 49 4e 54 45 52 28 72  NCTION_POINTER(r
03e0: 65 74 75 72 6e 54 79 70 65 2c 20 6e 61 6d 65 29  eturnType, name)
03f0: 20 72 65 74 75 72 6e 54 79 70 65 20 28 2a 20 6e   returnType (* n
0400: 61 6d 65 29 0a 23 64 65 66 69 6e 65 20 43 4b 5f  ame).#define CK_
0410: 43 41 4c 4c 42 41 43 4b 5f 46 55 4e 43 54 49 4f  CALLBACK_FUNCTIO
0420: 4e 28 72 65 74 75 72 6e 54 79 70 65 2c 20 6e 61  N(returnType, na
0430: 6d 65 29 20 72 65 74 75 72 6e 54 79 70 65 20 28  me) returnType (
0440: 2a 20 6e 61 6d 65 29 0a 23 69 66 6e 64 65 66 20  * name).#ifndef 
0450: 4e 55 4c 4c 5f 50 54 52 0a 23 20 20 64 65 66 69  NULL_PTR.#  defi
0460: 6e 65 20 4e 55 4c 4c 5f 50 54 52 20 30 0a 23 65  ne NULL_PTR 0.#e
0470: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0480: 70 6b 63 73 31 31 2e 68 22 0a 23 69 6e 63 6c 75  pkcs11.h".#inclu
0490: 64 65 20 22 70 6b 63 73 31 31 6e 2e 68 22 0a 23  de "pkcs11n.h".#
04a0: 69 6e 63 6c 75 64 65 20 22 61 73 6e 31 2d 78 35  include "asn1-x5
04b0: 30 39 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  09.h".#include "
04c0: 73 68 61 31 2e 68 22 0a 23 69 6e 63 6c 75 64 65  sha1.h".#include
04d0: 20 22 6d 64 35 2e 68 22 0a 0a 2f 2a 0a 20 2a 20   "md5.h"../*. * 
04e0: 49 6e 63 6c 75 64 65 20 74 68 65 73 65 20 73 6f  Include these so
04f0: 75 72 63 65 20 66 69 6c 65 73 20 69 6e 20 74 68  urce files in th
0500: 69 73 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 75  is translation u
0510: 6e 69 74 20 73 6f 20 74 68 61 74 20 77 65 20 63  nit so that we c
0520: 61 6e 20 62 69 6e 64 20 74 6f 0a 20 2a 20 66 75  an bind to. * fu
0530: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6e 6f 74 20  nctions and not 
0540: 69 6e 63 6c 75 64 65 20 61 6e 79 20 73 79 6d 62  include any symb
0550: 6f 6c 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75  ols in the outpu
0560: 74 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 2e  t shared object.
0570: 0a 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 61  . */.#include "a
0580: 73 6e 31 2d 78 35 30 39 2e 63 22 0a 23 69 6e 63  sn1-x509.c".#inc
0590: 6c 75 64 65 20 22 73 68 61 31 2e 63 22 0a 23 69  lude "sha1.c".#i
05a0: 6e 63 6c 75 64 65 20 22 6d 64 35 2e 63 22 0a 0a  nclude "md5.c"..
05b0: 23 69 66 6e 64 65 66 20 43 41 43 4b 45 59 5f 43  #ifndef CACKEY_C
05c0: 52 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f  RYPTOKI_VERSION_
05d0: 43 4f 44 45 0a 23 20 20 64 65 66 69 6e 65 20 43  CODE.#  define C
05e0: 41 43 4b 45 59 5f 43 52 59 50 54 4f 4b 49 5f 56  ACKEY_CRYPTOKI_V
05f0: 45 52 53 49 4f 4e 5f 43 4f 44 45 20 30 78 30 32  ERSION_CODE 0x02
0600: 31 65 30 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  1e00.#endif../* 
0610: 47 53 43 2d 49 53 20 76 32 2e 31 20 44 65 66 69  GSC-IS v2.1 Defi
0620: 6e 69 74 69 6f 6e 73 20 2a 2f 0a 2f 2a 2a 20 43  nitions */./** C
0630: 6c 61 73 73 65 73 20 2a 2a 2f 0a 23 64 65 66 69  lasses **/.#defi
0640: 6e 65 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49  ne GSCIS_CLASS_I
0650: 53 4f 37 38 31 36 20 20 20 20 20 20 20 20 20 20  SO7816          
0660: 20 30 78 30 30 0a 23 64 65 66 69 6e 65 20 47 53   0x00.#define GS
0670: 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f 42 41 4c  CIS_CLASS_GLOBAL
0680: 5f 50 4c 41 54 46 4f 52 4d 20 20 20 30 78 38 30  _PLATFORM   0x80
0690: 0a 0a 2f 2a 2a 20 49 6e 73 74 72 75 63 74 69 6f  ../** Instructio
06a0: 6e 73 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47  ns **/.#define G
06b0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
06c0: 45 53 50 4f 4e 53 45 20 20 20 20 20 20 30 78 43  ESPONSE      0xC
06d0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
06e0: 49 4e 53 54 52 5f 52 45 41 44 5f 42 49 4e 41 52  INSTR_READ_BINAR
06f0: 59 20 20 20 20 20 20 20 30 78 42 30 0a 23 64 65  Y       0xB0.#de
0700: 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52  fine GSCIS_INSTR
0710: 5f 55 50 44 41 54 45 5f 42 49 4e 41 52 59 20 20  _UPDATE_BINARY  
0720: 20 20 20 30 78 44 36 0a 23 64 65 66 69 6e 65 20     0xD6.#define 
0730: 47 53 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45  GSCIS_INSTR_SELE
0740: 43 54 20 20 20 20 20 20 20 20 20 20 20 20 30 78  CT            0x
0750: 41 34 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  A4.#define GSCIS
0760: 5f 49 4e 53 54 52 5f 45 58 54 45 52 4e 41 4c 5f  _INSTR_EXTERNAL_
0770: 41 55 54 48 20 20 20 20 20 30 78 38 32 0a 23 64  AUTH     0x82.#d
0780: 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53 54  efine GSCIS_INST
0790: 52 5f 47 45 54 5f 43 48 41 4c 4c 45 4e 47 45 20  R_GET_CHALLENGE 
07a0: 20 20 20 20 30 78 38 34 0a 23 64 65 66 69 6e 65      0x84.#define
07b0: 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 49 4e 54   GSCIS_INSTR_INT
07c0: 45 52 4e 41 4c 5f 41 55 54 48 20 20 20 20 20 30  ERNAL_AUTH     0
07d0: 78 38 38 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x88.#define GSCI
07e0: 53 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 20  S_INSTR_VERIFY  
07f0: 20 20 20 20 20 20 20 20 20 20 30 78 32 30 0a 23            0x20.#
0800: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e 53  define GSCIS_INS
0810: 54 52 5f 53 49 47 4e 20 20 20 20 20 20 20 20 20  TR_SIGN         
0820: 20 20 20 20 20 30 78 32 41 0a 23 64 65 66 69 6e       0x2A.#defin
0830: 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 47 45  e GSCIS_INSTR_GE
0840: 54 5f 50 52 4f 50 20 20 20 20 20 20 20 20 20 20  T_PROP          
0850: 30 78 35 36 0a 23 64 65 66 69 6e 65 20 47 53 43  0x56.#define GSC
0860: 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 41 43 52  IS_INSTR_GET_ACR
0870: 20 20 20 20 20 20 20 20 20 20 20 30 78 34 43 0a             0x4C.
0880: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 49 4e  #define GSCIS_IN
0890: 53 54 52 5f 52 45 41 44 5f 42 55 46 46 45 52 20  STR_READ_BUFFER 
08a0: 20 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69        0x52.#defi
08b0: 6e 65 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 53  ne GSCIS_INSTR_S
08c0: 49 47 4e 44 45 43 52 59 50 54 20 20 20 20 20 20  IGNDECRYPT      
08d0: 20 30 78 34 32 0a 0a 23 64 65 66 69 6e 65 20 47   0x42..#define G
08e0: 53 43 49 53 5f 50 41 52 41 4d 5f 53 45 4c 45 43  SCIS_PARAM_SELEC
08f0: 54 5f 41 50 50 4c 45 54 20 20 20 20 20 30 78 30  T_APPLET     0x0
0900: 34 0a 0a 2f 2a 2a 20 54 61 67 73 20 2a 2a 2f 0a  4../** Tags **/.
0910: 2f 2a 2a 2a 20 43 43 43 20 54 61 67 73 20 2a 2a  /*** CCC Tags **
0920: 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  */.#define GSCIS
0930: 5f 54 41 47 5f 43 41 52 44 49 44 20 20 20 20 20  _TAG_CARDID     
0940: 20 20 20 20 20 20 20 20 20 30 78 46 30 0a 23 64           0xF0.#d
0950: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0960: 43 43 43 5f 56 45 52 20 20 20 20 20 20 20 20 20  CCC_VER         
0970: 20 20 20 20 30 78 46 31 0a 23 64 65 66 69 6e 65      0xF1.#define
0980: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
0990: 45 52 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ER             0
09a0: 78 46 32 0a 23 64 65 66 69 6e 65 20 47 53 43 49  xF2.#define GSCI
09b0: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 20 20 20  S_TAG_CARDURL   
09c0: 20 20 20 20 20 20 20 20 20 20 30 78 46 33 0a 23            0xF3.#
09d0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
09e0: 5f 50 4b 43 53 31 35 20 20 20 20 20 20 20 20 20  _PKCS15         
09f0: 20 20 20 20 20 30 78 46 34 0a 23 64 65 66 69 6e       0xF4.#defin
0a00: 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  e GSCIS_TAG_REG_
0a10: 44 41 54 41 5f 4d 4f 44 45 4c 20 20 20 20 20 20  DATA_MODEL      
0a20: 30 78 46 35 0a 23 64 65 66 69 6e 65 20 47 53 43  0xF5.#define GSC
0a30: 49 53 5f 54 41 47 5f 41 43 52 5f 54 41 42 4c 45  IS_TAG_ACR_TABLE
0a40: 20 20 20 20 20 20 20 20 20 20 20 30 78 46 36 0a             0xF6.
0a50: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0a60: 47 5f 43 41 52 44 5f 41 50 44 55 20 20 20 20 20  G_CARD_APDU     
0a70: 20 20 20 20 20 20 30 78 46 37 0a 23 64 65 66 69        0xF7.#defi
0a80: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44  ne GSCIS_TAG_RED
0a90: 49 52 45 43 54 49 4f 4e 20 20 20 20 20 20 20 20  IRECTION        
0aa0: 20 30 78 46 41 0a 23 64 65 66 69 6e 65 20 47 53   0xFA.#define GS
0ab0: 43 49 53 5f 54 41 47 5f 43 54 20 20 20 20 20 20  CIS_TAG_CT      
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 30 78 46 42              0xFB
0ad0: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0ae0: 41 47 5f 53 54 20 20 20 20 20 20 20 20 20 20 20  AG_ST           
0af0: 20 20 20 20 20 20 20 30 78 46 43 0a 23 64 65 66         0xFC.#def
0b00: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45  ine GSCIS_TAG_NE
0b10: 58 54 43 43 43 20 20 20 20 20 20 20 20 20 20 20  XTCCC           
0b20: 20 20 30 78 46 44 0a 0a 2f 2a 2a 2a 20 47 65 6e    0xFD../*** Gen
0b30: 65 72 61 6c 20 2d 20 45 46 20 32 32 30 30 20 2a  eral - EF 2200 *
0b40: 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49  **/.#define GSCI
0b50: 53 5f 54 41 47 5f 46 4e 41 4d 45 20 20 20 20 20  S_TAG_FNAME     
0b60: 20 20 20 20 20 20 20 20 20 20 30 78 30 31 0a 23            0x01.#
0b70: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0b80: 5f 4d 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20  _MNAME          
0b90: 20 20 20 20 20 30 78 30 32 0a 23 64 65 66 69 6e       0x02.#defin
0ba0: 65 20 47 53 43 49 53 5f 54 41 47 5f 4c 4e 41 4d  e GSCIS_TAG_LNAM
0bb0: 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E               
0bc0: 30 78 30 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x03.#define GSC
0bd0: 49 53 5f 54 41 47 5f 53 55 46 46 49 58 20 20 20  IS_TAG_SUFFIX   
0be0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 34 0a             0x04.
0bf0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0c00: 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 20 20 20  G_GOVT_AGENCY   
0c10: 20 20 20 20 20 20 30 78 30 35 0a 23 64 65 66 69        0x05.#defi
0c20: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52  ne GSCIS_TAG_BUR
0c30: 45 41 55 20 20 20 20 20 20 20 20 20 20 20 20 20  EAU             
0c40: 20 30 78 30 36 0a 23 64 65 66 69 6e 65 20 47 53   0x06.#define GS
0c50: 43 49 53 5f 54 41 47 5f 42 55 52 45 41 55 5f 43  CIS_TAG_BUREAU_C
0c60: 4f 44 45 20 20 20 20 20 20 20 20 20 30 78 30 37  ODE         0x07
0c70: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
0c80: 41 47 5f 44 45 50 54 5f 43 4f 44 45 20 20 20 20  AG_DEPT_CODE    
0c90: 20 20 20 20 20 20 20 30 78 30 38 0a 23 64 65 66         0x08.#def
0ca0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 54 49  ine GSCIS_TAG_TI
0cb0: 54 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  TLE             
0cc0: 20 20 30 78 30 39 0a 23 64 65 66 69 6e 65 20 47    0x09.#define G
0cd0: 53 43 49 53 5f 54 41 47 5f 42 55 49 4c 44 49 4e  SCIS_TAG_BUILDIN
0ce0: 47 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  G            0x1
0cf0: 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  0.#define GSCIS_
0d00: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 31  TAG_OFFICE_ADDR1
0d10: 20 20 20 20 20 20 20 20 30 78 31 31 0a 23 64 65          0x11.#de
0d20: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4f  fine GSCIS_TAG_O
0d30: 46 46 49 43 45 5f 41 44 44 52 32 20 20 20 20 20  FFICE_ADDR2     
0d40: 20 20 20 30 78 31 32 0a 23 64 65 66 69 6e 65 20     0x12.#define 
0d50: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
0d60: 5f 43 49 54 59 20 20 20 20 20 20 20 20 20 30 78  _CITY         0x
0d70: 31 33 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53  13.#define GSCIS
0d80: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54 41 54  _TAG_OFFICE_STAT
0d90: 45 20 20 20 20 20 20 20 20 30 78 31 34 0a 23 64  E        0x14.#d
0da0: 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f  efine GSCIS_TAG_
0db0: 4f 46 46 49 43 45 5f 5a 49 50 20 20 20 20 20 20  OFFICE_ZIP      
0dc0: 20 20 20 20 30 78 31 35 0a 23 64 65 66 69 6e 65      0x15.#define
0dd0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
0de0: 45 5f 43 4f 55 4e 54 52 59 20 20 20 20 20 20 30  E_COUNTRY      0
0df0: 78 31 36 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x16.#define GSCI
0e00: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
0e10: 4e 45 20 20 20 20 20 20 20 20 30 78 31 37 0a 23  NE        0x17.#
0e20: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
0e30: 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58  _OFFICE_PHONE_EX
0e40: 54 20 20 20 20 30 78 31 38 0a 23 64 65 66 69 6e  T    0x18.#defin
0e50: 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  e GSCIS_TAG_OFFI
0e60: 43 45 5f 46 41 58 20 20 20 20 20 20 20 20 20 20  CE_FAX          
0e70: 30 78 31 39 0a 23 64 65 66 69 6e 65 20 47 53 43  0x19.#define GSC
0e80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d  IS_TAG_OFFICE_EM
0e90: 41 49 4c 20 20 20 20 20 20 20 20 30 78 31 41 0a  AIL        0x1A.
0ea0: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0eb0: 47 5f 4f 46 46 49 43 45 5f 52 4f 4f 4d 20 20 20  G_OFFICE_ROOM   
0ec0: 20 20 20 20 20 20 30 78 31 42 0a 23 64 65 66 69        0x1B.#defi
0ed0: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  ne GSCIS_TAG_NON
0ee0: 47 4f 56 5f 41 47 45 4e 43 59 20 20 20 20 20 20  GOV_AGENCY      
0ef0: 20 30 78 31 43 0a 23 64 65 66 69 6e 65 20 47 53   0x1C.#define GS
0f00: 43 49 53 5f 54 41 47 5f 53 53 4e 5f 44 45 53 49  CIS_TAG_SSN_DESI
0f10: 47 4e 41 54 4f 52 20 20 20 20 20 20 30 78 31 44  GNATOR      0x1D
0f20: 0a 0a 2f 2a 2a 2a 20 50 49 49 20 2d 20 45 46 20  ../*** PII - EF 
0f30: 32 31 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e  2100 ***/.#defin
0f40: 65 20 47 53 43 49 53 5f 54 41 47 5f 53 53 4e 20  e GSCIS_TAG_SSN 
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 47 53 43  0x20.#define GSC
0f70: 49 53 5f 54 41 47 5f 44 4f 42 20 20 20 20 20 20  IS_TAG_DOB      
0f80: 20 20 20 20 20 20 20 20 20 20 20 30 78 32 31 0a             0x21.
0f90: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
0fa0: 47 5f 47 45 4e 44 45 52 20 20 20 20 20 20 20 20  G_GENDER        
0fb0: 20 20 20 20 20 20 30 78 32 32 0a 0a 2f 2a 2a 2a        0x22../***
0fc0: 20 4c 6f 67 69 6e 20 49 6e 66 6f 72 6d 61 74 69   Login Informati
0fd0: 6f 6e 20 2d 20 45 46 20 34 30 30 30 20 2a 2a 2a  on - EF 4000 ***
0fe0: 2f 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f  /.#define GSCIS_
0ff0: 54 41 47 5f 55 53 45 52 49 44 20 20 20 20 20 20  TAG_USERID      
1000: 20 20 20 20 20 20 20 20 30 78 34 30 0a 23 64 65          0x40.#de
1010: 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 44  fine GSCIS_TAG_D
1020: 4f 4d 41 49 4e 20 20 20 20 20 20 20 20 20 20 20  OMAIN           
1030: 20 20 20 30 78 34 31 0a 23 64 65 66 69 6e 65 20     0x41.#define 
1040: 47 53 43 49 53 5f 54 41 47 5f 50 41 53 53 57 4f  GSCIS_TAG_PASSWO
1050: 52 44 20 20 20 20 20 20 20 20 20 20 20 20 30 78  RD            0x
1060: 34 32 0a 0a 2f 2a 2a 2a 20 43 61 72 64 20 49 6e  42../*** Card In
1070: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 45 46 20 35  formation - EF 5
1080: 30 30 30 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65  000 ***/.#define
1090: 20 47 53 43 49 53 5f 54 41 47 5f 49 53 53 55 45   GSCIS_TAG_ISSUE
10a0: 52 49 44 20 20 20 20 20 20 20 20 20 20 20 20 30  RID            0
10b0: 78 35 30 0a 23 64 65 66 69 6e 65 20 47 53 43 49  x50.#define GSCI
10c0: 53 5f 54 41 47 5f 53 45 52 4e 4f 20 20 20 20 20  S_TAG_SERNO     
10d0: 20 20 20 20 20 20 20 20 20 20 30 78 35 31 0a 23            0x51.#
10e0: 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41 47  define GSCIS_TAG
10f0: 5f 49 53 53 55 45 5f 44 41 54 45 20 20 20 20 20  _ISSUE_DATE     
1100: 20 20 20 20 20 30 78 35 32 0a 23 64 65 66 69 6e       0x52.#defin
1110: 65 20 47 53 43 49 53 5f 54 41 47 5f 45 58 50 49  e GSCIS_TAG_EXPI
1120: 52 45 5f 44 41 54 45 20 20 20 20 20 20 20 20 20  RE_DATE         
1130: 30 78 35 33 0a 23 64 65 66 69 6e 65 20 47 53 43  0x53.#define GSC
1140: 49 53 5f 54 41 47 5f 43 41 52 44 5f 54 59 50 45  IS_TAG_CARD_TYPE
1150: 20 20 20 20 20 20 20 20 20 20 20 30 78 35 34 0a             0x54.
1160: 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54 41  #define GSCIS_TA
1170: 47 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 20  G_SECURITY_CODE 
1180: 20 20 20 20 20 20 30 78 35 37 0a 23 64 65 66 69        0x57.#defi
1190: 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  ne GSCIS_TAG_CAR
11a0: 44 49 44 5f 41 49 44 20 20 20 20 20 20 20 20 20  DID_AID         
11b0: 20 30 78 35 38 0a 0a 2f 2a 2a 2a 20 50 49 56 20   0x58../*** PIV 
11c0: 43 6f 64 65 73 20 2a 2a 2a 2f 0a 23 64 65 66 69  Codes ***/.#defi
11d0: 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f  ne NISTSP800_73_
11e0: 33 5f 49 4e 53 54 52 5f 47 45 54 5f 44 41 54 41  3_INSTR_GET_DATA
11f0: 20 30 78 43 42 0a 23 64 65 66 69 6e 65 20 4e 49   0xCB.#define NI
1200: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
1210: 54 52 5f 47 45 4e 41 55 54 48 20 20 30 78 38 37  TR_GENAUTH  0x87
1220: 0a 0a 2f 2a 2a 2a 20 50 4b 49 20 49 6e 66 6f 72  ../*** PKI Infor
1230: 6d 61 74 69 6f 6e 20 2d 20 45 46 20 37 30 30 30  mation - EF 7000
1240: 20 2a 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 47 53   ***/.#define GS
1250: 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43  CIS_TAG_CERTIFIC
1260: 41 54 45 20 20 20 20 20 20 20 20 20 30 78 37 30  ATE         0x70
1270: 0a 23 64 65 66 69 6e 65 20 47 53 43 49 53 5f 54  .#define GSCIS_T
1280: 41 47 5f 43 45 52 54 5f 49 53 53 55 45 5f 44 41  AG_CERT_ISSUE_DA
1290: 54 45 20 20 20 20 20 30 78 37 31 0a 23 64 65 66  TE     0x71.#def
12a0: 69 6e 65 20 47 53 43 49 53 5f 54 41 47 5f 43 45  ine GSCIS_TAG_CE
12b0: 52 54 5f 45 58 50 49 52 45 5f 44 41 54 45 20 20  RT_EXPIRE_DATE  
12c0: 20 20 30 78 37 32 0a 0a 2f 2a 2a 20 41 70 70 6c    0x72../** Appl
12d0: 65 74 20 49 44 73 20 2a 2a 2f 0a 23 64 65 66 69  et IDs **/.#defi
12e0: 6e 65 20 47 53 43 49 53 5f 41 49 44 5f 43 43 43  ne GSCIS_AID_CCC
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30   0xA0, 0x00, 0x0
1310: 30 2c 20 30 78 30 31 2c 20 30 78 31 36 2c 20 30  0, 0x01, 0x16, 0
1320: 78 44 42 2c 20 30 78 30 30 0a 23 64 65 66 69 6e  xDB, 0x00.#defin
1330: 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  e NISTSP800_73_3
1340: 5f 50 49 56 5f 41 49 44 20 20 20 20 20 20 20 20  _PIV_AID        
1350: 30 78 41 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0xA0, 0x00, 0x00
1360: 2c 20 30 78 30 33 2c 20 30 78 30 38 2c 20 30 78  , 0x03, 0x08, 0x
1370: 30 30 2c 20 30 78 30 30 2c 20 30 78 31 30 2c 20  00, 0x00, 0x10, 
1380: 30 78 30 30 2c 20 30 78 30 31 2c 20 30 78 30 30  0x00, 0x01, 0x00
1390: 0a 0a 2f 2a 20 50 49 56 20 49 44 73 20 2a 2f 0a  ../* PIV IDs */.
13a0: 2f 2a 2a 20 4b 65 79 20 49 64 65 6e 74 69 66 69  /** Key Identifi
13b0: 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30 30  ers (NIST SP 800
13c0: 2d 37 38 2d 33 2c 20 54 61 62 6c 65 20 36 2d 31  -78-3, Table 6-1
13d0: 20 2a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 49 53   **/.#define NIS
13e0: 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f  TSP800_78_3_KEY_
13f0: 50 49 56 41 55 54 48 20 20 20 30 78 39 41 0a 23  PIVAUTH   0x9A.#
1400: 64 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30  define NISTSP800
1410: 5f 37 38 5f 33 5f 4b 45 59 5f 53 49 47 4e 41 54  _78_3_KEY_SIGNAT
1420: 55 52 45 20 30 78 39 43 0a 23 64 65 66 69 6e 65  URE 0x9C.#define
1430: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
1440: 4b 45 59 5f 4b 45 59 4d 47 54 20 20 20 20 30 78  KEY_KEYMGT    0x
1450: 39 44 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  9D.#define NISTS
1460: 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 43 41  P800_78_3_KEY_CA
1470: 52 44 41 55 54 48 20 20 30 78 39 45 0a 0a 2f 2a  RDAUTH  0x9E../*
1480: 2a 20 41 6c 67 6f 72 69 74 68 6d 20 49 64 65 6e  * Algorithm Iden
1490: 74 69 66 69 65 72 73 20 28 4e 49 53 54 20 53 50  tifiers (NIST SP
14a0: 20 38 30 30 2d 37 38 2d 33 2c 20 54 61 62 6c 65   800-78-3, Table
14b0: 20 36 2d 32 20 2a 2a 2f 0a 23 64 65 66 69 6e 65   6-2 **/.#define
14c0: 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f   NISTSP800_78_3_
14d0: 41 4c 47 4f 5f 52 53 41 31 30 32 34 20 20 30 78  ALGO_RSA1024  0x
14e0: 30 36 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53  06.#define NISTS
14f0: 50 38 30 30 5f 37 38 5f 33 5f 41 4c 47 4f 5f 52  P800_78_3_ALGO_R
1500: 53 41 32 30 34 38 20 20 30 78 30 37 0a 0a 2f 2a  SA2048  0x07../*
1510: 2a 20 4f 62 6a 65 63 74 20 49 64 65 6e 74 69 66  * Object Identif
1520: 69 65 72 73 20 28 4e 49 53 54 20 53 50 20 38 30  iers (NIST SP 80
1530: 30 2d 37 33 2d 33 20 50 61 72 74 20 31 2c 20 54  0-73-3 Part 1, T
1540: 61 62 6c 65 20 32 29 20 2a 2a 2f 0a 23 64 65 66  able 2) **/.#def
1550: 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f 37 33  ine NISTSP800_73
1560: 5f 33 5f 4f 49 44 5f 50 49 56 41 55 54 48 20 20  _3_OID_PIVAUTH  
1570: 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30 78 30   0x5F, 0xC1, 0x0
1580: 35 0a 23 64 65 66 69 6e 65 20 4e 49 53 54 53 50  5.#define NISTSP
1590: 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 53 49 47  800_73_3_OID_SIG
15a0: 4e 41 54 55 52 45 20 30 78 35 46 2c 20 30 78 43  NATURE 0x5F, 0xC
15b0: 31 2c 20 30 78 30 41 0a 23 64 65 66 69 6e 65 20  1, 0x0A.#define 
15c0: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
15d0: 49 44 5f 4b 45 59 4d 47 54 20 20 20 20 30 78 35  ID_KEYMGT    0x5
15e0: 46 2c 20 30 78 43 31 2c 20 30 78 30 42 0a 23 64  F, 0xC1, 0x0B.#d
15f0: 65 66 69 6e 65 20 4e 49 53 54 53 50 38 30 30 5f  efine NISTSP800_
1600: 37 33 5f 33 5f 4f 49 44 5f 43 41 52 44 41 55 54  73_3_OID_CARDAUT
1610: 48 20 20 30 78 35 46 2c 20 30 78 43 31 2c 20 30  H  0x5F, 0xC1, 0
1620: 78 30 31 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20  x01../* Maximum 
1630: 73 69 7a 65 20 6f 66 20 64 61 74 61 20 70 6f 72  size of data por
1640: 74 69 6f 6e 20 6f 66 20 41 50 44 55 73 20 2a 2f  tion of APDUs */
1650: 0a 2f 2a 2a 20 44 6f 20 6e 6f 74 20 73 65 74 20  ./** Do not set 
1660: 74 68 69 73 20 61 62 6f 76 65 20 32 35 30 20 2a  this above 250 *
1670: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 41 43 4b 45  */.#define CACKE
1680: 59 5f 41 50 44 55 5f 4d 54 55 20 20 20 20 20 20  Y_APDU_MTU      
1690: 20 20 20 20 20 20 20 20 20 32 35 30 0a 0a 2f 2a           250../*
16a0: 20 41 54 52 20 49 66 20 6e 6f 74 20 61 76 61 69   ATR If not avai
16b0: 6c 61 62 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66  lable */.#ifndef
16c0: 20 4d 41 58 5f 41 54 52 5f 53 49 5a 45 0a 23 64   MAX_ATR_SIZE.#d
16d0: 65 66 69 6e 65 20 4d 41 58 5f 41 54 52 5f 53 49  efine MAX_ATR_SI
16e0: 5a 45 20 31 30 32 34 0a 23 65 6e 64 69 66 0a 0a  ZE 1024.#endif..
16f0: 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 44 45  #ifdef CACKEY_DE
1700: 42 55 47 0a 23 20 20 69 66 64 65 66 20 48 41 56  BUG.#  ifdef HAV
1710: 45 5f 54 49 4d 45 5f 48 0a 23 20 20 20 20 69 6e  E_TIME_H.#    in
1720: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
1730: 74 61 74 69 63 20 74 69 6d 65 5f 74 20 63 61 63  tatic time_t cac
1740: 6b 65 79 5f 64 65 62 75 67 5f 73 74 61 72 74 5f  key_debug_start_
1750: 74 69 6d 65 20 3d 20 30 3b 0a 73 74 61 74 69 63  time = 0;.static
1760: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 43   unsigned long C
1770: 41 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54  ACKEY_DEBUG_GETT
1780: 49 4d 45 28 76 6f 69 64 29 20 7b 0a 09 69 66 20  IME(void) {..if 
1790: 28 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73 74  (cackey_debug_st
17a0: 61 72 74 5f 74 69 6d 65 20 3d 3d 20 30 29 20 7b  art_time == 0) {
17b0: 0a 09 09 63 61 63 6b 65 79 5f 64 65 62 75 67 5f  ...cackey_debug_
17c0: 73 74 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d  start_time = tim
17d0: 65 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 72 65  e(NULL);..}...re
17e0: 74 75 72 6e 28 74 69 6d 65 28 4e 55 4c 4c 29 20  turn(time(NULL) 
17f0: 2d 20 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 73  - cackey_debug_s
1800: 74 61 72 74 5f 74 69 6d 65 29 3b 0a 7d 0a 23 20  tart_time);.}.# 
1810: 20 65 6c 73 65 0a 73 74 61 74 69 63 20 75 6e 73   else.static uns
1820: 69 67 6e 65 64 20 6c 6f 6e 67 20 43 41 43 4b 45  igned long CACKE
1830: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
1840: 76 6f 69 64 29 20 7b 0a 09 72 65 74 75 72 6e 28  void) {..return(
1850: 30 29 3b 0a 7d 0a 23 20 20 65 6e 64 69 66 0a 0a  0);.}.#  endif..
1860: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
1870: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 78 2e  _DEBUG_PRINTF(x.
1880: 2e 2e 29 20 7b 20 5c 0a 09 73 74 61 74 69 63 20  ..) { \..static 
1890: 63 68 61 72 20 62 75 66 5f 75 73 65 72 5b 34 30  char buf_user[40
18a0: 39 36 5d 20 3d 20 7b 30 7d 3b 20 5c 0a 09 73 6e  96] = {0}; \..sn
18b0: 70 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 2c  printf(buf_user,
18c0: 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65 72   sizeof(buf_user
18d0: 29 2c 20 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73  ), x); \..buf_us
18e0: 65 72 5b 73 69 7a 65 6f 66 28 62 75 66 5f 75 73  er[sizeof(buf_us
18f0: 65 72 29 20 2d 20 31 5d 20 3d 20 27 5c 30 27 3b  er) - 1] = '\0';
1900: 20 5c 0a 09 66 70 72 69 6e 74 66 28 63 61 63 6b   \..fprintf(cack
1910: 65 79 5f 64 65 62 75 67 5f 66 64 28 29 2c 20 22  ey_debug_fd(), "
1920: 5b 25 6c 75 5d 3a 20 25 73 28 29 3a 25 69 3a 20  [%lu]: %s():%i: 
1930: 25 73 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  %s\n", CACKEY_DE
1940: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1950: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1960: 5f 2c 20 62 75 66 5f 75 73 65 72 29 3b 20 5c 0a  _, buf_user); \.
1970: 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f 64  .fflush(cackey_d
1980: 65 62 75 67 5f 66 64 28 29 29 3b 20 5c 0a 7d 0a  ebug_fd()); \.}.
1990: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
19a0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
19b0: 66 2c 20 78 2c 20 79 29 20 7b 20 5c 0a 09 73 74  f, x, y) { \..st
19c0: 61 74 69 63 20 63 68 61 72 20 62 75 66 5f 75 73  atic char buf_us
19d0: 65 72 5b 34 30 39 36 5d 20 3d 20 7b 30 7d 2c 20  er[4096] = {0}, 
19e0: 2a 62 75 66 5f 75 73 65 72 5f 70 3b 20 5c 0a 09  *buf_user_p; \..
19f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 62 75  unsigned long bu
1a00: 66 5f 75 73 65 72 5f 73 69 7a 65 3b 20 5c 0a 09  f_user_size; \..
1a10: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 54  unsigned char *T
1a20: 4d 50 42 55 46 3b 20 5c 0a 09 75 6e 73 69 67 6e  MPBUF; \..unsign
1a30: 65 64 20 6c 6f 6e 67 20 69 64 78 3b 20 5c 0a 09  ed long idx; \..
1a40: 69 6e 74 20 73 6e 70 72 69 6e 74 66 5f 72 65 74  int snprintf_ret
1a50: 3b 20 5c 0a 09 54 4d 50 42 55 46 20 3d 20 28 75  ; \..TMPBUF = (u
1a60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
1a70: 28 78 29 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72  (x); \..buf_user
1a80: 5f 70 20 3d 20 62 75 66 5f 75 73 65 72 3b 20 5c  _p = buf_user; \
1a90: 0a 09 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20  ..buf_user_size 
1aa0: 3d 20 73 69 7a 65 6f 66 28 62 75 66 5f 75 73 65  = sizeof(buf_use
1ab0: 72 29 3b 20 5c 0a 09 66 6f 72 20 28 69 64 78 20  r); \..for (idx 
1ac0: 3d 20 31 3b 20 69 64 78 20 3c 20 28 79 29 3b 20  = 1; idx < (y); 
1ad0: 69 64 78 2b 2b 29 20 7b 20 5c 0a 09 09 69 66 20  idx++) { \...if 
1ae0: 28 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 20 3c  (buf_user_size <
1af0: 3d 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61  = 0) { \....brea
1b00: 6b 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 73 6e  k; \...}; \...sn
1b10: 70 72 69 6e 74 66 5f 72 65 74 20 3d 20 73 6e 70  printf_ret = snp
1b20: 72 69 6e 74 66 28 62 75 66 5f 75 73 65 72 5f 70  rintf(buf_user_p
1b30: 2c 20 62 75 66 5f 75 73 65 72 5f 73 69 7a 65 2c  , buf_user_size,
1b40: 20 22 2c 20 25 30 32 78 22 2c 20 54 4d 50 42 55   ", %02x", TMPBU
1b50: 46 5b 69 64 78 5d 29 3b 20 5c 0a 09 09 69 66 20  F[idx]); \...if 
1b60: 28 73 6e 70 72 69 6e 74 66 5f 72 65 74 20 3c 3d  (snprintf_ret <=
1b70: 20 30 29 20 7b 20 5c 0a 09 09 09 62 72 65 61 6b   0) { \....break
1b80: 3b 20 5c 0a 09 09 7d 3b 20 5c 0a 09 09 62 75 66  ; \...}; \...buf
1b90: 5f 75 73 65 72 5f 70 20 2b 3d 20 73 6e 70 72 69  _user_p += snpri
1ba0: 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 09 62 75 66  ntf_ret; \...buf
1bb0: 5f 75 73 65 72 5f 73 69 7a 65 20 2d 3d 20 73 6e  _user_size -= sn
1bc0: 70 72 69 6e 74 66 5f 72 65 74 3b 20 5c 0a 09 7d  printf_ret; \..}
1bd0: 3b 20 5c 0a 09 62 75 66 5f 75 73 65 72 5b 73 69  ; \..buf_user[si
1be0: 7a 65 6f 66 28 62 75 66 5f 75 73 65 72 29 20 2d  zeof(buf_user) -
1bf0: 20 31 5d 20 3d 20 27 5c 30 27 3b 20 5c 0a 09 66   1] = '\0'; \..f
1c00: 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65  printf(cackey_de
1c10: 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d  bug_fd(), "[%lu]
1c20: 3a 20 25 73 28 29 3a 25 69 3a 20 25 73 20 20 28  : %s():%i: %s  (
1c30: 25 73 2f 25 6c 75 20 3d 20 7b 25 30 32 78 25 73  %s/%lu = {%02x%s
1c40: 7d 29 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45  })\n", CACKEY_DE
1c50: 42 55 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 5f  BUG_GETTIME(), _
1c60: 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f  _func__, __LINE_
1c70: 5f 2c 20 66 2c 20 23 78 2c 20 28 75 6e 73 69 67  _, f, #x, (unsig
1c80: 6e 65 64 20 6c 6f 6e 67 29 20 28 79 29 2c 20 54  ned long) (y), T
1c90: 4d 50 42 55 46 5b 30 5d 2c 20 62 75 66 5f 75 73  MPBUF[0], buf_us
1ca0: 65 72 29 3b 20 5c 0a 09 66 66 6c 75 73 68 28 63  er); \..fflush(c
1cb0: 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28 29  ackey_debug_fd()
1cc0: 29 3b 20 5c 0a 7d 0a 23 20 20 64 65 66 69 6e 65  ); \.}.#  define
1cd0: 20 66 72 65 65 28 78 29 20 7b 20 43 41 43 4b 45   free(x) { CACKE
1ce0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1cf0: 46 52 45 45 28 25 70 29 20 28 25 73 29 22 2c 20  FREE(%p) (%s)", 
1d00: 28 76 6f 69 64 20 2a 29 20 78 2c 20 23 78 29 3b  (void *) x, #x);
1d10: 20 66 72 65 65 28 78 29 3b 20 7d 0a 0a 73 74 61   free(x); }..sta
1d20: 74 69 63 20 46 49 4c 45 20 2a 63 61 63 6b 65 79  tic FILE *cackey
1d30: 5f 64 65 62 75 67 5f 66 64 28 76 6f 69 64 29 20  _debug_fd(void) 
1d40: 7b 0a 09 73 74 61 74 69 63 20 46 49 4c 45 20 2a  {..static FILE *
1d50: 66 64 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61 72  fd = NULL;..char
1d60: 20 2a 6c 6f 67 66 69 6c 65 3b 0a 0a 09 69 66 20   *logfile;...if 
1d70: 28 66 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (fd != NULL) {..
1d80: 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 09 7d 0a  .return(fd);..}.
1d90: 0a 09 2f 2a 0a 09 20 2a 20 4c 6f 67 20 74 6f 20  ../*.. * Log to 
1da0: 73 74 64 65 72 72 20 69 6e 69 74 69 61 6c 6c 79  stderr initially
1db0: 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 64   so we can use d
1dc0: 65 62 75 67 67 69 6e 67 20 77 69 74 68 69 6e 0a  ebugging within.
1dd0: 09 20 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  . * this functio
1de0: 6e 20 77 69 74 68 6f 75 74 20 67 65 74 74 69 6e  n without gettin
1df0: 67 20 69 6e 74 6f 20 61 6e 20 69 6e 66 69 6e 69  g into an infini
1e00: 74 65 20 6c 6f 6f 70 0a 09 20 2a 2f 0a 09 66 64  te loop.. */..fd
1e10: 20 3d 20 73 74 64 65 72 72 3b 0a 0a 09 6c 6f 67   = stderr;...log
1e20: 66 69 6c 65 20 3d 20 67 65 74 65 6e 76 28 22 43  file = getenv("C
1e30: 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c 4f 47 46  ACKEY_DEBUG_LOGF
1e40: 49 4c 45 22 29 3b 0a 09 69 66 20 28 6c 6f 67 66  ILE");..if (logf
1e50: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
1e60: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1e70: 49 4e 54 46 28 22 46 6f 75 6e 64 20 65 6e 76 69  INTF("Found envi
1e80: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
1e90: 3a 20 25 73 22 2c 20 6c 6f 67 66 69 6c 65 29 3b  : %s", logfile);
1ea0: 0a 0a 09 09 6c 6f 67 66 69 6c 65 20 3d 20 73 74  ....logfile = st
1eb0: 72 63 68 72 28 6c 6f 67 66 69 6c 65 2c 20 27 3d  rchr(logfile, '=
1ec0: 27 29 3b 0a 09 09 69 66 20 28 6c 6f 67 66 69 6c  ');...if (logfil
1ed0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09  e == NULL) {....
1ee0: 6c 6f 67 66 69 6c 65 20 3d 20 67 65 74 65 6e 76  logfile = getenv
1ef0: 28 22 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 4c  ("CACKEY_DEBUG_L
1f00: 4f 47 46 49 4c 45 22 29 3b 0a 09 09 7d 20 65 6c  OGFILE");...} el
1f10: 73 65 20 7b 0a 09 09 09 6c 6f 67 66 69 6c 65 2b  se {....logfile+
1f20: 2b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20 28  +;...}..}...if (
1f30: 6c 6f 67 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  logfile != NULL)
1f40: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f50: 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64 20  G_PRINTF("Found 
1f60: 6c 6f 67 20 66 69 6c 65 3a 20 25 73 22 2c 20 6c  log file: %s", l
1f70: 6f 67 66 69 6c 65 29 3b 0a 0a 09 09 66 64 20 3d  ogfile);....fd =
1f80: 20 66 6f 70 65 6e 28 6c 6f 67 66 69 6c 65 2c 20   fopen(logfile, 
1f90: 22 61 22 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 66  "a");..}...if (f
1fa0: 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66  d == NULL) {...f
1fb0: 64 20 3d 20 73 74 64 65 72 72 3b 0a 09 7d 0a 0a  d = stderr;..}..
1fc0: 09 69 66 20 28 66 64 20 3d 3d 20 73 74 64 65 72  .if (fd == stder
1fd0: 72 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  r) {...CACKEY_DE
1fe0: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
1ff0: 72 6e 69 6e 67 20 73 74 64 65 72 72 22 29 3b 0a  rning stderr");.
2000: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41 43 4b  .} else {...CACK
2010: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2020: 22 52 65 74 75 72 6e 69 6e 67 20 25 70 22 2c 20  "Returning %p", 
2030: 28 76 6f 69 64 20 2a 29 20 66 64 29 3b 0a 09 7d  (void *) fd);..}
2040: 0a 0a 09 72 65 74 75 72 6e 28 66 64 29 3b 0a 7d  ...return(fd);.}
2050: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 43  ..static void *C
2060: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
2070: 5f 4d 41 4c 4c 4f 43 28 73 69 7a 65 5f 74 20 73  _MALLOC(size_t s
2080: 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ize, const char 
2090: 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69 6e 65 29  *func, int line)
20a0: 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74 76 61 6c   {..void *retval
20b0: 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c  ;...retval = mal
20c0: 6c 6f 63 28 73 69 7a 65 29 3b 0a 0a 09 66 70 72  loc(size);...fpr
20d0: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
20e0: 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20  g_fd(), "[%lu]: 
20f0: 25 73 28 29 3a 25 69 3a 20 4d 41 4c 4c 4f 43 28  %s():%i: MALLOC(
2100: 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41 43 4b 45  ) = %p\n", CACKE
2110: 59 5f 44 45 42 55 47 5f 47 45 54 54 49 4d 45 28  Y_DEBUG_GETTIME(
2120: 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65 2c 20 72  ), func, line, r
2130: 65 74 76 61 6c 29 3b 0a 09 66 66 6c 75 73 68 28  etval);..fflush(
2140: 63 61 63 6b 65 79 5f 64 65 62 75 67 5f 66 64 28  cackey_debug_fd(
2150: 29 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ));...return(ret
2160: 76 61 6c 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  val);.}..static 
2170: 76 6f 69 64 20 2a 43 41 43 4b 45 59 5f 44 45 42  void *CACKEY_DEB
2180: 55 47 5f 46 55 4e 43 5f 52 45 41 4c 4c 4f 43 28  UG_FUNC_REALLOC(
2190: 76 6f 69 64 20 2a 70 74 72 2c 20 73 69 7a 65 5f  void *ptr, size_
21a0: 74 20 73 69 7a 65 2c 20 63 6f 6e 73 74 20 63 68  t size, const ch
21b0: 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c 69  ar *func, int li
21c0: 6e 65 29 20 7b 0a 09 76 6f 69 64 20 2a 72 65 74  ne) {..void *ret
21d0: 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d 20  val;...retval = 
21e0: 72 65 61 6c 6c 6f 63 28 70 74 72 2c 20 73 69 7a  realloc(ptr, siz
21f0: 65 29 3b 0a 0a 09 69 66 20 28 72 65 74 76 61 6c  e);...if (retval
2200: 20 21 3d 20 70 74 72 29 20 7b 0a 09 09 66 70 72   != ptr) {...fpr
2210: 69 6e 74 66 28 63 61 63 6b 65 79 5f 64 65 62 75  intf(cackey_debu
2220: 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75 5d 3a 20  g_fd(), "[%lu]: 
2230: 25 73 28 29 3a 25 69 3a 20 52 45 41 4c 4c 4f 43  %s():%i: REALLOC
2240: 28 25 70 29 20 3d 20 25 70 5c 6e 22 2c 20 43 41  (%p) = %p\n", CA
2250: 43 4b 45 59 5f 44 45 42 55 47 5f 47 45 54 54 49  CKEY_DEBUG_GETTI
2260: 4d 45 28 29 2c 20 66 75 6e 63 2c 20 6c 69 6e 65  ME(), func, line
2270: 2c 20 70 74 72 2c 20 72 65 74 76 61 6c 29 3b 0a  , ptr, retval);.
2280: 09 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79 5f  ..fflush(cackey_
2290: 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 09 7d 0a  debug_fd());..}.
22a0: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  ..if (retval == 
22b0: 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
22c0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
22d0: 2a 2a 2a 20 45 52 52 4f 52 20 2a 2a 2a 20 72 65  *** ERROR *** re
22e0: 61 6c 6c 6f 63 20 72 65 74 75 72 6e 65 64 20 4e  alloc returned N
22f0: 55 4c 4c 20 28 73 69 7a 65 20 3d 20 25 6c 75 29  ULL (size = %lu)
2300: 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2310: 67 29 20 73 69 7a 65 29 3b 0a 09 7d 0a 0a 09 72  g) size);..}...r
2320: 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d  eturn(retval);.}
2330: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 43  ..static char *C
2340: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
2350: 5f 53 54 52 44 55 50 28 63 6f 6e 73 74 20 63 68  _STRDUP(const ch
2360: 61 72 20 2a 70 74 72 2c 20 63 6f 6e 73 74 20 63  ar *ptr, const c
2370: 68 61 72 20 2a 66 75 6e 63 2c 20 69 6e 74 20 6c  har *func, int l
2380: 69 6e 65 29 20 7b 0a 09 63 68 61 72 20 2a 72 65  ine) {..char *re
2390: 74 76 61 6c 3b 0a 0a 09 72 65 74 76 61 6c 20 3d  tval;...retval =
23a0: 20 73 74 72 64 75 70 28 70 74 72 29 3b 0a 0a 09   strdup(ptr);...
23b0: 66 70 72 69 6e 74 66 28 63 61 63 6b 65 79 5f 64  fprintf(cackey_d
23c0: 65 62 75 67 5f 66 64 28 29 2c 20 22 5b 25 6c 75  ebug_fd(), "[%lu
23d0: 5d 3a 20 25 73 28 29 3a 25 69 3a 20 53 54 52 44  ]: %s():%i: STRD
23e0: 55 50 5f 4d 41 4c 4c 4f 43 28 29 20 3d 20 25 70  UP_MALLOC() = %p
23f0: 5c 6e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55  \n", CACKEY_DEBU
2400: 47 5f 47 45 54 54 49 4d 45 28 29 2c 20 66 75 6e  G_GETTIME(), fun
2410: 63 2c 20 6c 69 6e 65 2c 20 72 65 74 76 61 6c 29  c, line, retval)
2420: 3b 0a 09 66 66 6c 75 73 68 28 63 61 63 6b 65 79  ;..fflush(cackey
2430: 5f 64 65 62 75 67 5f 66 64 28 29 29 3b 0a 0a 09  _debug_fd());...
2440: 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a  return(retval);.
2450: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
2460: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
2470: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
2480: 54 52 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  TR(unsigned char
2490: 20 74 61 67 29 20 7b 0a 09 73 77 69 74 63 68 20   tag) {..switch 
24a0: 28 74 61 67 29 20 7b 0a 09 09 63 61 73 65 20 47  (tag) {...case G
24b0: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 3a  SCIS_TAG_CARDID:
24c0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
24d0: 53 5f 54 41 47 5f 43 41 52 44 49 44 22 29 3b 0a  S_TAG_CARDID");.
24e0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
24f0: 5f 43 43 43 5f 56 45 52 3a 0a 09 09 09 72 65 74  _CCC_VER:....ret
2500: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
2510: 43 43 5f 56 45 52 22 29 3b 0a 09 09 63 61 73 65  CC_VER");...case
2520: 20 47 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56   GSCIS_TAG_CCG_V
2530: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ER:....return("G
2540: 53 43 49 53 5f 54 41 47 5f 43 43 47 5f 56 45 52  SCIS_TAG_CCG_VER
2550: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2560: 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09 09  _TAG_CARDURL:...
2570: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2580: 41 47 5f 43 41 52 44 55 52 4c 22 29 3b 0a 09 09  AG_CARDURL");...
2590: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 50  case GSCIS_TAG_P
25a0: 4b 43 53 31 35 3a 0a 09 09 09 72 65 74 75 72 6e  KCS15:....return
25b0: 28 22 47 53 43 49 53 5f 54 41 47 5f 50 4b 43 53  ("GSCIS_TAG_PKCS
25c0: 31 35 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  15");...case GSC
25d0: 49 53 5f 54 41 47 5f 52 45 47 5f 44 41 54 41 5f  IS_TAG_REG_DATA_
25e0: 4d 4f 44 45 4c 3a 0a 09 09 09 72 65 74 75 72 6e  MODEL:....return
25f0: 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 47 5f  ("GSCIS_TAG_REG_
2600: 44 41 54 41 5f 4d 4f 44 45 4c 22 29 3b 0a 09 09  DATA_MODEL");...
2610: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 41  case GSCIS_TAG_A
2620: 43 52 5f 54 41 42 4c 45 3a 0a 09 09 09 72 65 74  CR_TABLE:....ret
2630: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 41  urn("GSCIS_TAG_A
2640: 43 52 5f 54 41 42 4c 45 22 29 3b 0a 09 09 63 61  CR_TABLE");...ca
2650: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52  se GSCIS_TAG_CAR
2660: 44 5f 41 50 44 55 3a 0a 09 09 09 72 65 74 75 72  D_APDU:....retur
2670: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43 41 52  n("GSCIS_TAG_CAR
2680: 44 5f 41 50 44 55 22 29 3b 0a 09 09 63 61 73 65  D_APDU");...case
2690: 20 47 53 43 49 53 5f 54 41 47 5f 52 45 44 49 52   GSCIS_TAG_REDIR
26a0: 45 43 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  ECTION:....retur
26b0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 52 45 44  n("GSCIS_TAG_RED
26c0: 49 52 45 43 54 49 4f 4e 22 29 3b 0a 09 09 63 61  IRECTION");...ca
26d0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 43 54 3a  se GSCIS_TAG_CT:
26e0: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
26f0: 53 5f 54 41 47 5f 43 54 22 29 3b 0a 09 09 63 61  S_TAG_CT");...ca
2700: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53 54 3a  se GSCIS_TAG_ST:
2710: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2720: 53 5f 54 41 47 5f 53 54 22 29 3b 0a 09 09 63 61  S_TAG_ST");...ca
2730: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4e 45 58  se GSCIS_TAG_NEX
2740: 54 43 43 43 3a 0a 09 09 09 72 65 74 75 72 6e 28  TCCC:....return(
2750: 22 47 53 43 49 53 5f 54 41 47 5f 4e 45 58 54 43  "GSCIS_TAG_NEXTC
2760: 43 43 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  CC");...case GSC
2770: 49 53 5f 54 41 47 5f 46 4e 41 4d 45 3a 0a 09 09  IS_TAG_FNAME:...
2780: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2790: 41 47 5f 46 4e 41 4d 45 22 29 3b 0a 09 09 63 61  AG_FNAME");...ca
27a0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4d 4e 41  se GSCIS_TAG_MNA
27b0: 4d 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  ME:....return("G
27c0: 53 43 49 53 5f 54 41 47 5f 4d 4e 41 4d 45 22 29  SCIS_TAG_MNAME")
27d0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
27e0: 41 47 5f 4c 4e 41 4d 45 3a 0a 09 09 09 72 65 74  AG_LNAME:....ret
27f0: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4c  urn("GSCIS_TAG_L
2800: 4e 41 4d 45 22 29 3b 0a 09 09 63 61 73 65 20 47  NAME");...case G
2810: 53 43 49 53 5f 54 41 47 5f 53 55 46 46 49 58 3a  SCIS_TAG_SUFFIX:
2820: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2830: 53 5f 54 41 47 5f 53 55 46 46 49 58 22 29 3b 0a  S_TAG_SUFFIX");.
2840: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2850: 5f 47 4f 56 54 5f 41 47 45 4e 43 59 3a 0a 09 09  _GOVT_AGENCY:...
2860: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2870: 41 47 5f 47 4f 56 54 5f 41 47 45 4e 43 59 22 29  AG_GOVT_AGENCY")
2880: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2890: 41 47 5f 42 55 52 45 41 55 3a 0a 09 09 09 72 65  AG_BUREAU:....re
28a0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
28b0: 42 55 52 45 41 55 22 29 3b 0a 09 09 63 61 73 65  BUREAU");...case
28c0: 20 47 53 43 49 53 5f 54 41 47 5f 42 55 52 45 41   GSCIS_TAG_BUREA
28d0: 55 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  U_CODE:....retur
28e0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 42 55 52  n("GSCIS_TAG_BUR
28f0: 45 41 55 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61  EAU_CODE");...ca
2900: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 44 45 50  se GSCIS_TAG_DEP
2910: 54 5f 43 4f 44 45 3a 0a 09 09 09 72 65 74 75 72  T_CODE:....retur
2920: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 44 45 50  n("GSCIS_TAG_DEP
2930: 54 5f 43 4f 44 45 22 29 3b 0a 09 09 63 61 73 65  T_CODE");...case
2940: 20 47 53 43 49 53 5f 54 41 47 5f 54 49 54 4c 45   GSCIS_TAG_TITLE
2950: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2960: 49 53 5f 54 41 47 5f 54 49 54 4c 45 22 29 3b 0a  IS_TAG_TITLE");.
2970: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2980: 5f 42 55 49 4c 44 49 4e 47 3a 0a 09 09 09 72 65  _BUILDING:....re
2990: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
29a0: 42 55 49 4c 44 49 4e 47 22 29 3b 0a 09 09 63 61  BUILDING");...ca
29b0: 73 65 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46  se GSCIS_TAG_OFF
29c0: 49 43 45 5f 41 44 44 52 31 3a 0a 09 09 09 72 65  ICE_ADDR1:....re
29d0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
29e0: 4f 46 46 49 43 45 5f 41 44 44 52 31 22 29 3b 0a  OFFICE_ADDR1");.
29f0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2a00: 5f 4f 46 46 49 43 45 5f 41 44 44 52 32 3a 0a 09  _OFFICE_ADDR2:..
2a10: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2a20: 54 41 47 5f 4f 46 46 49 43 45 5f 41 44 44 52 32  TAG_OFFICE_ADDR2
2a30: 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53  ");...case GSCIS
2a40: 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49 54 59  _TAG_OFFICE_CITY
2a50: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2a60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 43 49  IS_TAG_OFFICE_CI
2a70: 54 59 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  TY");...case GSC
2a80: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 53 54  IS_TAG_OFFICE_ST
2a90: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
2aa0: 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45  GSCIS_TAG_OFFICE
2ab0: 5f 53 54 41 54 45 22 29 3b 0a 09 09 63 61 73 65  _STATE");...case
2ac0: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2ad0: 45 5f 5a 49 50 3a 0a 09 09 09 72 65 74 75 72 6e  E_ZIP:....return
2ae0: 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49  ("GSCIS_TAG_OFFI
2af0: 43 45 5f 5a 49 50 22 29 3b 0a 09 09 63 61 73 65  CE_ZIP");...case
2b00: 20 47 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43   GSCIS_TAG_OFFIC
2b10: 45 5f 43 4f 55 4e 54 52 59 3a 0a 09 09 09 72 65  E_COUNTRY:....re
2b20: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2b30: 4f 46 46 49 43 45 5f 43 4f 55 4e 54 52 59 22 29  OFFICE_COUNTRY")
2b40: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2b50: 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f 4e 45 3a  AG_OFFICE_PHONE:
2b60: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2b70: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48 4f  S_TAG_OFFICE_PHO
2b80: 4e 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  NE");...case GSC
2b90: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 50 48  IS_TAG_OFFICE_PH
2ba0: 4f 4e 45 5f 45 58 54 3a 0a 09 09 09 72 65 74 75  ONE_EXT:....retu
2bb0: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4f 46  rn("GSCIS_TAG_OF
2bc0: 46 49 43 45 5f 50 48 4f 4e 45 5f 45 58 54 22 29  FICE_PHONE_EXT")
2bd0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2be0: 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 3a 0a 09  AG_OFFICE_FAX:..
2bf0: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2c00: 54 41 47 5f 4f 46 46 49 43 45 5f 46 41 58 22 29  TAG_OFFICE_FAX")
2c10: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2c20: 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41 49 4c 3a  AG_OFFICE_EMAIL:
2c30: 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49  ....return("GSCI
2c40: 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 45 4d 41  S_TAG_OFFICE_EMA
2c50: 49 4c 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  IL");...case GSC
2c60: 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f 52 4f  IS_TAG_OFFICE_RO
2c70: 4f 4d 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  OM:....return("G
2c80: 53 43 49 53 5f 54 41 47 5f 4f 46 46 49 43 45 5f  SCIS_TAG_OFFICE_
2c90: 52 4f 4f 4d 22 29 3b 0a 09 09 63 61 73 65 20 47  ROOM");...case G
2ca0: 53 43 49 53 5f 54 41 47 5f 4e 4f 4e 47 4f 56 5f  SCIS_TAG_NONGOV_
2cb0: 41 47 45 4e 43 59 3a 0a 09 09 09 72 65 74 75 72  AGENCY:....retur
2cc0: 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 4e 4f 4e  n("GSCIS_TAG_NON
2cd0: 47 4f 56 5f 41 47 45 4e 43 59 22 29 3b 0a 09 09  GOV_AGENCY");...
2ce0: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 53  case GSCIS_TAG_S
2cf0: 53 4e 5f 44 45 53 49 47 4e 41 54 4f 52 3a 0a 09  SN_DESIGNATOR:..
2d00: 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f  ..return("GSCIS_
2d10: 54 41 47 5f 53 53 4e 5f 44 45 53 49 47 4e 41 54  TAG_SSN_DESIGNAT
2d20: 4f 52 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  OR");...case GSC
2d30: 49 53 5f 54 41 47 5f 53 53 4e 3a 0a 09 09 09 72  IS_TAG_SSN:....r
2d40: 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47  eturn("GSCIS_TAG
2d50: 5f 53 53 4e 22 29 3b 0a 09 09 63 61 73 65 20 47  _SSN");...case G
2d60: 53 43 49 53 5f 54 41 47 5f 44 4f 42 3a 0a 09 09  SCIS_TAG_DOB:...
2d70: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2d80: 41 47 5f 44 4f 42 22 29 3b 0a 09 09 63 61 73 65  AG_DOB");...case
2d90: 20 47 53 43 49 53 5f 54 41 47 5f 47 45 4e 44 45   GSCIS_TAG_GENDE
2da0: 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  R:....return("GS
2db0: 43 49 53 5f 54 41 47 5f 47 45 4e 44 45 52 22 29  CIS_TAG_GENDER")
2dc0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2dd0: 41 47 5f 55 53 45 52 49 44 3a 0a 09 09 09 72 65  AG_USERID:....re
2de0: 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f  turn("GSCIS_TAG_
2df0: 55 53 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65  USERID");...case
2e00: 20 47 53 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49   GSCIS_TAG_DOMAI
2e10: 4e 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  N:....return("GS
2e20: 43 49 53 5f 54 41 47 5f 44 4f 4d 41 49 4e 22 29  CIS_TAG_DOMAIN")
2e30: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2e40: 41 47 5f 50 41 53 53 57 4f 52 44 3a 0a 09 09 09  AG_PASSWORD:....
2e50: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2e60: 47 5f 50 41 53 53 57 4f 52 44 22 29 3b 0a 09 09  G_PASSWORD");...
2e70: 63 61 73 65 20 47 53 43 49 53 5f 54 41 47 5f 49  case GSCIS_TAG_I
2e80: 53 53 55 45 52 49 44 3a 0a 09 09 09 72 65 74 75  SSUERID:....retu
2e90: 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 49 53  rn("GSCIS_TAG_IS
2ea0: 53 55 45 52 49 44 22 29 3b 0a 09 09 63 61 73 65  SUERID");...case
2eb0: 20 47 53 43 49 53 5f 54 41 47 5f 53 45 52 4e 4f   GSCIS_TAG_SERNO
2ec0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53 43  :....return("GSC
2ed0: 49 53 5f 54 41 47 5f 53 45 52 4e 4f 22 29 3b 0a  IS_TAG_SERNO");.
2ee0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2ef0: 5f 49 53 53 55 45 5f 44 41 54 45 3a 0a 09 09 09  _ISSUE_DATE:....
2f00: 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54 41  return("GSCIS_TA
2f10: 47 5f 49 53 53 55 45 5f 44 41 54 45 22 29 3b 0a  G_ISSUE_DATE");.
2f20: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2f30: 5f 45 58 50 49 52 45 5f 44 41 54 45 3a 0a 09 09  _EXPIRE_DATE:...
2f40: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f50: 41 47 5f 45 58 50 49 52 45 5f 44 41 54 45 22 29  AG_EXPIRE_DATE")
2f60: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
2f70: 41 47 5f 43 41 52 44 5f 54 59 50 45 3a 0a 09 09  AG_CARD_TYPE:...
2f80: 09 72 65 74 75 72 6e 28 22 47 53 43 49 53 5f 54  .return("GSCIS_T
2f90: 41 47 5f 43 41 52 44 5f 54 59 50 45 22 29 3b 0a  AG_CARD_TYPE");.
2fa0: 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41 47  ..case GSCIS_TAG
2fb0: 5f 53 45 43 55 52 49 54 59 5f 43 4f 44 45 3a 0a  _SECURITY_CODE:.
2fc0: 09 09 09 72 65 74 75 72 6e 28 22 47 53 43 49 53  ...return("GSCIS
2fd0: 5f 54 41 47 5f 53 45 43 55 52 49 54 59 5f 43 4f  _TAG_SECURITY_CO
2fe0: 44 45 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  DE");...case GSC
2ff0: 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41 49  IS_TAG_CARDID_AI
3000: 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47 53  D:....return("GS
3010: 43 49 53 5f 54 41 47 5f 43 41 52 44 49 44 5f 41  CIS_TAG_CARDID_A
3020: 49 44 22 29 3b 0a 09 09 63 61 73 65 20 47 53 43  ID");...case GSC
3030: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
3040: 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 47  TE:....return("G
3050: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49  SCIS_TAG_CERTIFI
3060: 43 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 47  CATE");...case G
3070: 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 49 53  SCIS_TAG_CERT_IS
3080: 53 55 45 5f 44 41 54 45 3a 0a 09 09 09 72 65 74  SUE_DATE:....ret
3090: 75 72 6e 28 22 47 53 43 49 53 5f 54 41 47 5f 43  urn("GSCIS_TAG_C
30a0: 45 52 54 5f 49 53 53 55 45 5f 44 41 54 45 22 29  ERT_ISSUE_DATE")
30b0: 3b 0a 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ;...case GSCIS_T
30c0: 41 47 5f 43 45 52 54 5f 45 58 50 49 52 45 5f 44  AG_CERT_EXPIRE_D
30d0: 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ATE:....return("
30e0: 47 53 43 49 53 5f 54 41 47 5f 43 45 52 54 5f 45  GSCIS_TAG_CERT_E
30f0: 58 50 49 52 45 5f 44 41 54 45 22 29 3b 0a 09 7d  XPIRE_DATE");..}
3100: 0a 0a 09 72 65 74 75 72 6e 28 22 55 4e 4b 4e 4f  ...return("UNKNO
3110: 57 4e 22 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  WN");.}..static 
3120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 43 41 43 4b  const char *CACK
3130: 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43  EY_DEBUG_FUNC_SC
3140: 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 4c 4f  ARDERR_TO_STR(LO
3150: 4e 47 20 72 65 74 63 6f 64 65 29 20 7b 0a 09 73  NG retcode) {..s
3160: 77 69 74 63 68 20 28 72 65 74 63 6f 64 65 29 20  witch (retcode) 
3170: 7b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 53  {...case SCARD_S
3180: 5f 53 55 43 43 45 53 53 3a 0a 09 09 09 72 65 74  _SUCCESS:....ret
3190: 75 72 6e 28 22 53 43 41 52 44 5f 53 5f 53 55 43  urn("SCARD_S_SUC
31a0: 43 45 53 53 22 29 3b 0a 09 09 63 61 73 65 20 53  CESS");...case S
31b0: 43 41 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44  CARD_E_CANCELLED
31c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
31d0: 52 44 5f 45 5f 43 41 4e 43 45 4c 4c 45 44 22 29  RD_E_CANCELLED")
31e0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
31f0: 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 3a 0a 09  _CANT_DISPOSE:..
3200: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3210: 45 5f 43 41 4e 54 5f 44 49 53 50 4f 53 45 22 29  E_CANT_DISPOSE")
3220: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3230: 5f 49 4e 53 55 46 46 49 43 49 45 4e 54 5f 42 55  _INSUFFICIENT_BU
3240: 46 46 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  FFER:....return(
3250: 22 53 43 41 52 44 5f 45 5f 49 4e 53 55 46 46 49  "SCARD_E_INSUFFI
3260: 43 49 45 4e 54 5f 42 55 46 46 45 52 22 29 3b 0a  CIENT_BUFFER");.
3270: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
3280: 4e 56 41 4c 49 44 5f 41 54 52 3a 0a 09 09 09 72  NVALID_ATR:....r
3290: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49  eturn("SCARD_E_I
32a0: 4e 56 41 4c 49 44 5f 41 54 52 22 29 3b 0a 09 09  NVALID_ATR");...
32b0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56  case SCARD_E_INV
32c0: 41 4c 49 44 5f 48 41 4e 44 4c 45 3a 0a 09 09 09  ALID_HANDLE:....
32d0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
32e0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 22 29  INVALID_HANDLE")
32f0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3300: 5f 49 4e 56 41 4c 49 44 5f 50 41 52 41 4d 45 54  _INVALID_PARAMET
3310: 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53  ER:....return("S
3320: 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f 50  CARD_E_INVALID_P
3330: 41 52 41 4d 45 54 45 52 22 29 3b 0a 09 09 63 61  ARAMETER");...ca
3340: 73 65 20 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c  se SCARD_E_INVAL
3350: 49 44 5f 54 41 52 47 45 54 3a 0a 09 09 09 72 65  ID_TARGET:....re
3360: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 49 4e  turn("SCARD_E_IN
3370: 56 41 4c 49 44 5f 54 41 52 47 45 54 22 29 3b 0a  VALID_TARGET");.
3380: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 49  ..case SCARD_E_I
3390: 4e 56 41 4c 49 44 5f 56 41 4c 55 45 3a 0a 09 09  NVALID_VALUE:...
33a0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
33b0: 5f 49 4e 56 41 4c 49 44 5f 56 41 4c 55 45 22 29  _INVALID_VALUE")
33c0: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
33d0: 5f 4e 4f 5f 4d 45 4d 4f 52 59 3a 0a 09 09 09 72  _NO_MEMORY:....r
33e0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 4e  eturn("SCARD_E_N
33f0: 4f 5f 4d 45 4d 4f 52 59 22 29 3b 0a 09 09 63 61  O_MEMORY");...ca
3400: 73 65 20 53 43 41 52 44 5f 45 5f 55 4e 4b 4e 4f  se SCARD_E_UNKNO
3410: 57 4e 5f 52 45 41 44 45 52 3a 0a 09 09 09 72 65  WN_READER:....re
3420: 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55 4e  turn("SCARD_E_UN
3430: 4b 4e 4f 57 4e 5f 52 45 41 44 45 52 22 29 3b 0a  KNOWN_READER");.
3440: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 54  ..case SCARD_E_T
3450: 49 4d 45 4f 55 54 3a 0a 09 09 09 72 65 74 75 72  IMEOUT:....retur
3460: 6e 28 22 53 43 41 52 44 5f 45 5f 54 49 4d 45 4f  n("SCARD_E_TIMEO
3470: 55 54 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  UT");...case SCA
3480: 52 44 5f 45 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RD_E_SHARING_VIO
3490: 4c 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75 72  LATION:....retur
34a0: 6e 28 22 53 43 41 52 44 5f 45 5f 53 48 41 52 49  n("SCARD_E_SHARI
34b0: 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 22 29 3b 0a  NG_VIOLATION");.
34c0: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
34d0: 4f 5f 53 4d 41 52 54 43 41 52 44 3a 0a 09 09 09  O_SMARTCARD:....
34e0: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
34f0: 4e 4f 5f 53 4d 41 52 54 43 41 52 44 22 29 3b 0a  NO_SMARTCARD");.
3500: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 55  ..case SCARD_E_U
3510: 4e 4b 4e 4f 57 4e 5f 43 41 52 44 3a 0a 09 09 09  NKNOWN_CARD:....
3520: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3530: 55 4e 4b 4e 4f 57 4e 5f 43 41 52 44 22 29 3b 0a  UNKNOWN_CARD");.
3540: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 50  ..case SCARD_E_P
3550: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 3a 0a 09  ROTO_MISMATCH:..
3560: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
3570: 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48  E_PROTO_MISMATCH
3580: 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44  ");...case SCARD
3590: 5f 45 5f 4e 4f 54 5f 52 45 41 44 59 3a 0a 09 09  _E_NOT_READY:...
35a0: 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45  .return("SCARD_E
35b0: 5f 4e 4f 54 5f 52 45 41 44 59 22 29 3b 0a 09 09  _NOT_READY");...
35c0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 53 59 53  case SCARD_E_SYS
35d0: 54 45 4d 5f 43 41 4e 43 45 4c 4c 45 44 3a 0a 09  TEM_CANCELLED:..
35e0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
35f0: 45 5f 53 59 53 54 45 4d 5f 43 41 4e 43 45 4c 4c  E_SYSTEM_CANCELL
3600: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3610: 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e 53 41 43  RD_E_NOT_TRANSAC
3620: 54 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  TED:....return("
3630: 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54 52 41 4e  SCARD_E_NOT_TRAN
3640: 53 41 43 54 45 44 22 29 3b 0a 09 09 63 61 73 65  SACTED");...case
3650: 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f   SCARD_E_READER_
3660: 55 4e 41 56 41 49 4c 41 42 4c 45 3a 0a 09 09 09  UNAVAILABLE:....
3670: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3680: 52 45 41 44 45 52 5f 55 4e 41 56 41 49 4c 41 42  READER_UNAVAILAB
3690: 4c 45 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  LE");...case SCA
36a0: 52 44 5f 57 5f 55 4e 53 55 50 50 4f 52 54 45 44  RD_W_UNSUPPORTED
36b0: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
36c0: 28 22 53 43 41 52 44 5f 57 5f 55 4e 53 55 50 50  ("SCARD_W_UNSUPP
36d0: 4f 52 54 45 44 5f 43 41 52 44 22 29 3b 0a 09 09  ORTED_CARD");...
36e0: 63 61 73 65 20 53 43 41 52 44 5f 57 5f 55 4e 52  case SCARD_W_UNR
36f0: 45 53 50 4f 4e 53 49 56 45 5f 43 41 52 44 3a 0a  ESPONSIVE_CARD:.
3700: 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44  ...return("SCARD
3710: 5f 57 5f 55 4e 52 45 53 50 4f 4e 53 49 56 45 5f  _W_UNRESPONSIVE_
3720: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
3730: 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44  CARD_W_UNPOWERED
3740: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3750: 28 22 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45  ("SCARD_W_UNPOWE
3760: 52 45 44 5f 43 41 52 44 22 29 3b 0a 09 09 63 61  RED_CARD");...ca
3770: 73 65 20 53 43 41 52 44 5f 57 5f 52 45 53 45 54  se SCARD_W_RESET
3780: 5f 43 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e  _CARD:....return
3790: 28 22 53 43 41 52 44 5f 57 5f 52 45 53 45 54 5f  ("SCARD_W_RESET_
37a0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
37b0: 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f 43  CARD_W_REMOVED_C
37c0: 41 52 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ARD:....return("
37d0: 53 43 41 52 44 5f 57 5f 52 45 4d 4f 56 45 44 5f  SCARD_W_REMOVED_
37e0: 43 41 52 44 22 29 3b 0a 09 09 63 61 73 65 20 53  CARD");...case S
37f0: 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f 5f 53  CARD_E_PCI_TOO_S
3800: 4d 41 4c 4c 3a 0a 09 09 09 72 65 74 75 72 6e 28  MALL:....return(
3810: 22 53 43 41 52 44 5f 45 5f 50 43 49 5f 54 4f 4f  "SCARD_E_PCI_TOO
3820: 5f 53 4d 41 4c 4c 22 29 3b 0a 09 09 63 61 73 65  _SMALL");...case
3830: 20 53 43 41 52 44 5f 45 5f 52 45 41 44 45 52 5f   SCARD_E_READER_
3840: 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09 09 09  UNSUPPORTED:....
3850: 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f  return("SCARD_E_
3860: 52 45 41 44 45 52 5f 55 4e 53 55 50 50 4f 52 54  READER_UNSUPPORT
3870: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3880: 52 44 5f 45 5f 44 55 50 4c 49 43 41 54 45 5f 52  RD_E_DUPLICATE_R
3890: 45 41 44 45 52 3a 0a 09 09 09 72 65 74 75 72 6e  EADER:....return
38a0: 28 22 53 43 41 52 44 5f 45 5f 44 55 50 4c 49 43  ("SCARD_E_DUPLIC
38b0: 41 54 45 5f 52 45 41 44 45 52 22 29 3b 0a 09 09  ATE_READER");...
38c0: 63 61 73 65 20 53 43 41 52 44 5f 45 5f 43 41 52  case SCARD_E_CAR
38d0: 44 5f 55 4e 53 55 50 50 4f 52 54 45 44 3a 0a 09  D_UNSUPPORTED:..
38e0: 09 09 72 65 74 75 72 6e 28 22 53 43 41 52 44 5f  ..return("SCARD_
38f0: 45 5f 43 41 52 44 5f 55 4e 53 55 50 50 4f 52 54  E_CARD_UNSUPPORT
3900: 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53 43 41  ED");...case SCA
3910: 52 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 3a  RD_E_NO_SERVICE:
3920: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3930: 44 5f 45 5f 4e 4f 5f 53 45 52 56 49 43 45 22 29  D_E_NO_SERVICE")
3940: 3b 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f 45  ;...case SCARD_E
3950: 5f 53 45 52 56 49 43 45 5f 53 54 4f 50 50 45 44  _SERVICE_STOPPED
3960: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41  :....return("SCA
3970: 52 44 5f 45 5f 53 45 52 56 49 43 45 5f 53 54 4f  RD_E_SERVICE_STO
3980: 50 50 45 44 22 29 3b 0a 09 09 63 61 73 65 20 53  PPED");...case S
3990: 43 41 52 44 5f 45 5f 55 4e 53 55 50 50 4f 52 54  CARD_E_UNSUPPORT
39a0: 45 44 5f 46 45 41 54 55 52 45 3a 0a 09 09 09 72  ED_FEATURE:....r
39b0: 65 74 75 72 6e 28 22 53 43 41 52 44 5f 45 5f 55  eturn("SCARD_E_U
39c0: 4e 53 55 50 50 4f 52 54 45 44 5f 46 45 41 54 55  NSUPPORTED_FEATU
39d0: 52 45 22 29 3b 0a 23 69 66 64 65 66 20 53 43 41  RE");.#ifdef SCA
39e0: 52 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41  RD_W_INSERTED_CA
39f0: 52 44 0a 09 09 63 61 73 65 20 53 43 41 52 44 5f  RD...case SCARD_
3a00: 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52 44 3a  W_INSERTED_CARD:
3a10: 0a 09 09 09 72 65 74 75 72 6e 28 22 53 43 41 52  ....return("SCAR
3a20: 44 5f 57 5f 49 4e 53 45 52 54 45 44 5f 43 41 52  D_W_INSERTED_CAR
3a30: 44 22 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  D");.#endif.#ifd
3a40: 65 66 20 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45  ef SCARD_E_NO_RE
3a50: 41 44 45 52 53 5f 41 56 41 49 4c 41 42 4c 45 0a  ADERS_AVAILABLE.
3a60: 09 09 63 61 73 65 20 53 43 41 52 44 5f 45 5f 4e  ..case SCARD_E_N
3a70: 4f 5f 52 45 41 44 45 52 53 5f 41 56 41 49 4c 41  O_READERS_AVAILA
3a80: 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  BLE:....return("
3a90: 53 43 41 52 44 5f 45 5f 4e 4f 5f 52 45 41 44 45  SCARD_E_NO_READE
3aa0: 52 53 5f 41 56 41 49 4c 41 42 4c 45 22 29 3b 0a  RS_AVAILABLE");.
3ab0: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 72 65 74 75  #endif..}...retu
3ac0: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
3ad0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
3ae0: 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42 55  har *CACKEY_DEBU
3af0: 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f  G_FUNC_OBJID_TO_
3b00: 53 54 52 28 75 69 6e 74 31 36 5f 74 20 6f 62 6a  STR(uint16_t obj
3b10: 69 64 29 20 7b 0a 09 73 77 69 74 63 68 20 28 6f  id) {..switch (o
3b20: 62 6a 69 64 29 20 7b 0a 09 09 63 61 73 65 20 30  bjid) {...case 0
3b30: 78 32 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e  x2000:....return
3b40: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a  ("CACKEY_TLV_OBJ
3b50: 49 44 5f 47 45 4e 45 52 41 4c 49 4e 46 4f 22 29  ID_GENERALINFO")
3b60: 3b 0a 09 09 63 61 73 65 20 30 78 32 31 30 30 3a  ;...case 0x2100:
3b70: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b  ....return("CACK
3b80: 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f  EY_TLV_OBJID_PRO
3b90: 50 45 52 53 4f 4e 41 4c 49 4e 46 4f 22 29 3b 0a  PERSONALINFO");.
3ba0: 09 09 63 61 73 65 20 30 78 33 30 30 30 3a 0a 09  ..case 0x3000:..
3bb0: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3bc0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53  _TLV_OBJID_ACCES
3bd0: 53 43 4f 4e 54 52 4f 4c 22 29 3b 0a 09 09 63 61  SCONTROL");...ca
3be0: 73 65 20 30 78 34 30 30 30 3a 0a 09 09 09 72 65  se 0x4000:....re
3bf0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3c00: 5f 4f 42 4a 49 44 5f 4c 4f 47 49 4e 22 29 3b 0a  _OBJID_LOGIN");.
3c10: 09 09 63 61 73 65 20 30 78 35 30 30 30 3a 0a 09  ..case 0x5000:..
3c20: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3c30: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 52 44 49  _TLV_OBJID_CARDI
3c40: 4e 46 4f 22 29 3b 0a 09 09 63 61 73 65 20 30 78  NFO");...case 0x
3c50: 36 30 30 30 3a 0a 09 09 09 72 65 74 75 72 6e 28  6000:....return(
3c60: 22 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  "CACKEY_TLV_OBJI
3c70: 44 5f 42 49 4f 4d 45 54 52 49 43 53 22 29 3b 0a  D_BIOMETRICS");.
3c80: 09 09 63 61 73 65 20 30 78 37 30 30 30 3a 0a 09  ..case 0x7000:..
3c90: 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59  ..return("CACKEY
3ca0: 5f 54 4c 56 5f 4f 42 4a 49 44 5f 44 49 47 49 54  _TLV_OBJID_DIGIT
3cb0: 41 4c 53 49 47 43 45 52 54 22 29 3b 0a 09 09 63  ALSIGCERT");...c
3cc0: 61 73 65 20 30 78 30 32 30 30 3a 0a 09 09 09 72  ase 0x0200:....r
3cd0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3ce0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
3cf0: 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30  ON");...case 0x0
3d00: 32 30 32 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  202:....return("
3d10: 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44  CACKEY_TLV_OBJID
3d20: 5f 43 41 43 5f 42 45 4e 45 46 49 54 53 22 29 3b  _CAC_BENEFITS");
3d30: 0a 09 09 63 61 73 65 20 30 78 30 32 30 33 3a 0a  ...case 0x0203:.
3d40: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d50: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3d60: 4f 54 48 45 52 42 45 4e 45 46 49 54 53 22 29 3b  OTHERBENEFITS");
3d70: 0a 09 09 63 61 73 65 20 30 78 30 32 30 31 3a 0a  ...case 0x0201:.
3d80: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3d90: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
3da0: 50 45 52 53 4f 4e 4e 45 4c 22 29 3b 0a 09 09 63  PERSONNEL");...c
3db0: 61 73 65 20 30 78 30 32 46 45 3a 0a 09 09 09 72  ase 0x02FE:....r
3dc0: 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c  eturn("CACKEY_TL
3dd0: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43  V_OBJID_CAC_PKIC
3de0: 45 52 54 22 29 3b 0a 09 7d 0a 09 0a 09 72 65 74  ERT");..}....ret
3df0: 75 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a  urn("UNKNOWN");.
3e00: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
3e10: 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45 42  char *CACKEY_DEB
3e20: 55 47 5f 46 55 4e 43 5f 41 50 50 54 59 50 45 5f  UG_FUNC_APPTYPE_
3e30: 54 4f 5f 53 54 52 28 75 69 6e 74 38 5f 74 20 61  TO_STR(uint8_t a
3e40: 70 70 74 79 70 65 29 20 7b 0a 09 73 77 69 74 63  pptype) {..switc
3e50: 68 20 28 61 70 70 74 79 70 65 29 20 7b 0a 09 09  h (apptype) {...
3e60: 63 61 73 65 20 30 78 30 30 3a 0a 09 09 09 72 65  case 0x00:....re
3e70: 74 75 72 6e 28 22 4e 4f 4e 45 22 29 3b 0a 09 09  turn("NONE");...
3e80: 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 72 65  case 0x01:....re
3e90: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3ea0: 5f 41 50 50 5f 47 45 4e 45 52 49 43 22 29 3b 0a  _APP_GENERIC");.
3eb0: 09 09 63 61 73 65 20 30 78 30 32 3a 0a 09 09 09  ..case 0x02:....
3ec0: 72 65 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54  return("CACKEY_T
3ed0: 4c 56 5f 41 50 50 5f 53 4b 49 22 29 3b 0a 09 09  LV_APP_SKI");...
3ee0: 63 61 73 65 20 30 78 30 33 3a 0a 09 09 09 72 65  case 0x03:....re
3ef0: 74 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56  turn("CACKEY_TLV
3f00: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43  _APP_GENERIC | C
3f10: 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b  ACKEY_TLV_APP_SK
3f20: 49 22 29 3b 0a 09 09 63 61 73 65 20 30 78 30 34  I");...case 0x04
3f30: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 41 43  :....return("CAC
3f40: 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 22  KEY_TLV_APP_PKI"
3f50: 29 3b 0a 09 09 63 61 73 65 20 30 78 30 35 3a 0a  );...case 0x05:.
3f60: 09 09 09 72 65 74 75 72 6e 28 22 43 41 43 4b 45  ...return("CACKE
3f70: 59 5f 54 4c 56 5f 41 50 50 5f 47 45 4e 45 52 49  Y_TLV_APP_GENERI
3f80: 43 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41  C | CACKEY_TLV_A
3f90: 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63 61 73 65  PP_PKI");...case
3fa0: 20 30 78 30 36 3a 0a 09 09 09 72 65 74 75 72 6e   0x06:....return
3fb0: 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50 50  ("CACKEY_TLV_APP
3fc0: 5f 53 4b 49 20 7c 20 43 41 43 4b 45 59 5f 54 4c  _SKI | CACKEY_TL
3fd0: 56 5f 41 50 50 5f 50 4b 49 22 29 3b 0a 09 09 63  V_APP_PKI");...c
3fe0: 61 73 65 20 30 78 30 37 3a 0a 09 09 09 72 65 74  ase 0x07:....ret
3ff0: 75 72 6e 28 22 43 41 43 4b 45 59 5f 54 4c 56 5f  urn("CACKEY_TLV_
4000: 41 50 50 5f 47 45 4e 45 52 49 43 20 7c 20 43 41  APP_GENERIC | CA
4010: 43 4b 45 59 5f 54 4c 56 5f 41 50 50 5f 53 4b 49  CKEY_TLV_APP_SKI
4020: 20 7c 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   | CACKEY_TLV_AP
4030: 50 5f 50 4b 49 22 29 3b 0a 09 7d 0a 0a 09 72 65  P_PKI");..}...re
4040: 74 75 72 6e 28 22 49 4e 56 41 4c 49 44 22 29 3b  turn("INVALID");
4050: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .}..static const
4060: 20 63 68 61 72 20 2a 43 41 43 4b 45 59 5f 44 45   char *CACKEY_DE
4070: 42 55 47 5f 46 55 4e 43 5f 41 54 54 52 49 42 55  BUG_FUNC_ATTRIBU
4080: 54 45 5f 54 4f 5f 53 54 52 28 43 4b 5f 41 54 54  TE_TO_STR(CK_ATT
4090: 52 49 42 55 54 45 5f 54 59 50 45 20 61 74 74 72  RIBUTE_TYPE attr
40a0: 29 20 7b 0a 09 73 77 69 74 63 68 20 28 61 74 74  ) {..switch (att
40b0: 72 29 20 7b 0a 09 09 63 61 73 65 20 43 4b 41 5f  r) {...case CKA_
40c0: 43 4c 41 53 53 3a 0a 09 09 09 72 65 74 75 72 6e  CLASS:....return
40d0: 28 22 43 4b 41 5f 43 4c 41 53 53 22 29 3b 0a 09  ("CKA_CLASS");..
40e0: 09 63 61 73 65 20 43 4b 41 5f 54 4f 4b 45 4e 3a  .case CKA_TOKEN:
40f0: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4100: 54 4f 4b 45 4e 22 29 3b 0a 09 09 63 61 73 65 20  TOKEN");...case 
4110: 43 4b 41 5f 50 52 49 56 41 54 45 3a 0a 09 09 09  CKA_PRIVATE:....
4120: 72 65 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 56  return("CKA_PRIV
4130: 41 54 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ATE");...case CK
4140: 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 72 65 74 75  A_LABEL:....retu
4150: 72 6e 28 22 43 4b 41 5f 4c 41 42 45 4c 22 29 3b  rn("CKA_LABEL");
4160: 0a 09 09 63 61 73 65 20 43 4b 41 5f 41 50 50 4c  ...case CKA_APPL
4170: 49 43 41 54 49 4f 4e 3a 0a 09 09 09 72 65 74 75  ICATION:....retu
4180: 72 6e 28 22 43 4b 41 5f 41 50 50 4c 49 43 41 54  rn("CKA_APPLICAT
4190: 49 4f 4e 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ION");...case CK
41a0: 41 5f 56 41 4c 55 45 3a 0a 09 09 09 72 65 74 75  A_VALUE:....retu
41b0: 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 22 29 3b  rn("CKA_VALUE");
41c0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4f 42 4a 45  ...case CKA_OBJE
41d0: 43 54 5f 49 44 3a 0a 09 09 09 72 65 74 75 72 6e  CT_ID:....return
41e0: 28 22 43 4b 41 5f 4f 42 4a 45 43 54 5f 49 44 22  ("CKA_OBJECT_ID"
41f0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 43 45  );...case CKA_CE
4200: 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 3a 0a  RTIFICATE_TYPE:.
4210: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 43  ...return("CKA_C
4220: 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 22  ERTIFICATE_TYPE"
4230: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 49 53  );...case CKA_IS
4240: 53 55 45 52 3a 0a 09 09 09 72 65 74 75 72 6e 28  SUER:....return(
4250: 22 43 4b 41 5f 49 53 53 55 45 52 22 29 3b 0a 09  "CKA_ISSUER");..
4260: 09 63 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c  .case CKA_SERIAL
4270: 5f 4e 55 4d 42 45 52 3a 0a 09 09 09 72 65 74 75  _NUMBER:....retu
4280: 72 6e 28 22 43 4b 41 5f 53 45 52 49 41 4c 5f 4e  rn("CKA_SERIAL_N
4290: 55 4d 42 45 52 22 29 3b 0a 09 09 63 61 73 65 20  UMBER");...case 
42a0: 43 4b 41 5f 41 43 5f 49 53 53 55 45 52 3a 0a 09  CKA_AC_ISSUER:..
42b0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41 43  ..return("CKA_AC
42c0: 5f 49 53 53 55 45 52 22 29 3b 0a 09 09 63 61 73  _ISSUER");...cas
42d0: 65 20 43 4b 41 5f 4f 57 4e 45 52 3a 0a 09 09 09  e CKA_OWNER:....
42e0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 4f 57 4e 45  return("CKA_OWNE
42f0: 52 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  R");...case CKA_
4300: 41 54 54 52 5f 54 59 50 45 53 3a 0a 09 09 09 72  ATTR_TYPES:....r
4310: 65 74 75 72 6e 28 22 43 4b 41 5f 41 54 54 52 5f  eturn("CKA_ATTR_
4320: 54 59 50 45 53 22 29 3b 0a 09 09 63 61 73 65 20  TYPES");...case 
4330: 43 4b 41 5f 54 52 55 53 54 45 44 3a 0a 09 09 09  CKA_TRUSTED:....
4340: 72 65 74 75 72 6e 28 22 43 4b 41 5f 54 52 55 53  return("CKA_TRUS
4350: 54 45 44 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  TED");...case CK
4360: 41 5f 4b 45 59 5f 54 59 50 45 3a 0a 09 09 09 72  A_KEY_TYPE:....r
4370: 65 74 75 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 54  eturn("CKA_KEY_T
4380: 59 50 45 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPE");...case CK
4390: 41 5f 53 55 42 4a 45 43 54 3a 0a 09 09 09 72 65  A_SUBJECT:....re
43a0: 74 75 72 6e 28 22 43 4b 41 5f 53 55 42 4a 45 43  turn("CKA_SUBJEC
43b0: 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  T");...case CKA_
43c0: 49 44 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  ID:....return("C
43d0: 4b 41 5f 49 44 22 29 3b 0a 09 09 63 61 73 65 20  KA_ID");...case 
43e0: 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09  CKA_SENSITIVE:..
43f0: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53 45  ..return("CKA_SE
4400: 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73  NSITIVE");...cas
4410: 65 20 43 4b 41 5f 45 4e 43 52 59 50 54 3a 0a 09  e CKA_ENCRYPT:..
4420: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 4e  ..return("CKA_EN
4430: 43 52 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20  CRYPT");...case 
4440: 43 4b 41 5f 44 45 43 52 59 50 54 3a 0a 09 09 09  CKA_DECRYPT:....
4450: 72 65 74 75 72 6e 28 22 43 4b 41 5f 44 45 43 52  return("CKA_DECR
4460: 59 50 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  YPT");...case CK
4470: 41 5f 57 52 41 50 3a 0a 09 09 09 72 65 74 75 72  A_WRAP:....retur
4480: 6e 28 22 43 4b 41 5f 57 52 41 50 22 29 3b 0a 09  n("CKA_WRAP");..
4490: 09 63 61 73 65 20 43 4b 41 5f 55 4e 57 52 41 50  .case CKA_UNWRAP
44a0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
44b0: 5f 55 4e 57 52 41 50 22 29 3b 0a 09 09 63 61 73  _UNWRAP");...cas
44c0: 65 20 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 72  e CKA_SIGN:....r
44d0: 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 22  eturn("CKA_SIGN"
44e0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 53 49  );...case CKA_SI
44f0: 47 4e 5f 52 45 43 4f 56 45 52 3a 0a 09 09 09 72  GN_RECOVER:....r
4500: 65 74 75 72 6e 28 22 43 4b 41 5f 53 49 47 4e 5f  eturn("CKA_SIGN_
4510: 52 45 43 4f 56 45 52 22 29 3b 0a 09 09 63 61 73  RECOVER");...cas
4520: 65 20 43 4b 41 5f 56 45 52 49 46 59 3a 0a 09 09  e CKA_VERIFY:...
4530: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 45 52  .return("CKA_VER
4540: 49 46 59 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  IFY");...case CK
4550: 41 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52  A_VERIFY_RECOVER
4560: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
4570: 5f 56 45 52 49 46 59 5f 52 45 43 4f 56 45 52 22  _VERIFY_RECOVER"
4580: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 44 45  );...case CKA_DE
4590: 52 49 56 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  RIVE:....return(
45a0: 22 43 4b 41 5f 44 45 52 49 56 45 22 29 3b 0a 09  "CKA_DERIVE");..
45b0: 09 63 61 73 65 20 43 4b 41 5f 53 54 41 52 54 5f  .case CKA_START_
45c0: 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72 6e 28  DATE:....return(
45d0: 22 43 4b 41 5f 53 54 41 52 54 5f 44 41 54 45 22  "CKA_START_DATE"
45e0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 4e  );...case CKA_EN
45f0: 44 5f 44 41 54 45 3a 0a 09 09 09 72 65 74 75 72  D_DATE:....retur
4600: 6e 28 22 43 4b 41 5f 45 4e 44 5f 44 41 54 45 22  n("CKA_END_DATE"
4610: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f  );...case CKA_MO
4620: 44 55 4c 55 53 3a 0a 09 09 09 72 65 74 75 72 6e  DULUS:....return
4630: 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53 22 29 3b  ("CKA_MODULUS");
4640: 0a 09 09 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55  ...case CKA_MODU
4650: 4c 55 53 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  LUS_BITS:....ret
4660: 75 72 6e 28 22 43 4b 41 5f 4d 4f 44 55 4c 55 53  urn("CKA_MODULUS
4670: 5f 42 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20  _BITS");...case 
4680: 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
4690: 45 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22  ENT:....return("
46a0: 43 4b 41 5f 50 55 42 4c 49 43 5f 45 58 50 4f 4e  CKA_PUBLIC_EXPON
46b0: 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ENT");...case CK
46c0: 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e 45  A_PRIVATE_EXPONE
46d0: 4e 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  NT:....return("C
46e0: 4b 41 5f 50 52 49 56 41 54 45 5f 45 58 50 4f 4e  KA_PRIVATE_EXPON
46f0: 45 4e 54 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ENT");...case CK
4700: 41 5f 50 52 49 4d 45 5f 31 3a 0a 09 09 09 72 65  A_PRIME_1:....re
4710: 74 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f  turn("CKA_PRIME_
4720: 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  1");...case CKA_
4730: 50 52 49 4d 45 5f 32 3a 0a 09 09 09 72 65 74 75  PRIME_2:....retu
4740: 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 32 22  rn("CKA_PRIME_2"
4750: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 58  );...case CKA_EX
4760: 50 4f 4e 45 4e 54 5f 31 3a 0a 09 09 09 72 65 74  PONENT_1:....ret
4770: 75 72 6e 28 22 43 4b 41 5f 45 58 50 4f 4e 45 4e  urn("CKA_EXPONEN
4780: 54 5f 31 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  T_1");...case CK
4790: 41 5f 45 58 50 4f 4e 45 4e 54 5f 32 3a 0a 09 09  A_EXPONENT_2:...
47a0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 58 50  .return("CKA_EXP
47b0: 4f 4e 45 4e 54 5f 32 22 29 3b 0a 09 09 63 61 73  ONENT_2");...cas
47c0: 65 20 43 4b 41 5f 43 4f 45 46 46 49 43 49 45 4e  e CKA_COEFFICIEN
47d0: 54 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  T:....return("CK
47e0: 41 5f 43 4f 45 46 46 49 43 49 45 4e 54 22 29 3b  A_COEFFICIENT");
47f0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52 49 4d  ...case CKA_PRIM
4800: 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b  E:....return("CK
4810: 41 5f 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73  A_PRIME");...cas
4820: 65 20 43 4b 41 5f 53 55 42 50 52 49 4d 45 3a 0a  e CKA_SUBPRIME:.
4830: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 53  ...return("CKA_S
4840: 55 42 50 52 49 4d 45 22 29 3b 0a 09 09 63 61 73  UBPRIME");...cas
4850: 65 20 43 4b 41 5f 42 41 53 45 3a 0a 09 09 09 72  e CKA_BASE:....r
4860: 65 74 75 72 6e 28 22 43 4b 41 5f 42 41 53 45 22  eturn("CKA_BASE"
4870: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 50 52  );...case CKA_PR
4880: 49 4d 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  IME_BITS:....ret
4890: 75 72 6e 28 22 43 4b 41 5f 50 52 49 4d 45 5f 42  urn("CKA_PRIME_B
48a0: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ITS");...case CK
48b0: 41 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53  A_SUB_PRIME_BITS
48c0: 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41  :....return("CKA
48d0: 5f 53 55 42 5f 50 52 49 4d 45 5f 42 49 54 53 22  _SUB_PRIME_BITS"
48e0: 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f 56 41  );...case CKA_VA
48f0: 4c 55 45 5f 42 49 54 53 3a 0a 09 09 09 72 65 74  LUE_BITS:....ret
4900: 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55 45 5f 42  urn("CKA_VALUE_B
4910: 49 54 53 22 29 3b 0a 09 09 63 61 73 65 20 43 4b  ITS");...case CK
4920: 41 5f 56 41 4c 55 45 5f 4c 45 4e 3a 0a 09 09 09  A_VALUE_LEN:....
4930: 72 65 74 75 72 6e 28 22 43 4b 41 5f 56 41 4c 55  return("CKA_VALU
4940: 45 5f 4c 45 4e 22 29 3b 0a 09 09 63 61 73 65 20  E_LEN");...case 
4950: 43 4b 41 5f 45 58 54 52 41 43 54 41 42 4c 45 3a  CKA_EXTRACTABLE:
4960: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
4970: 45 58 54 52 41 43 54 41 42 4c 45 22 29 3b 0a 09  EXTRACTABLE");..
4980: 09 63 61 73 65 20 43 4b 41 5f 4c 4f 43 41 4c 3a  .case CKA_LOCAL:
4990: 0a 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f  ....return("CKA_
49a0: 4c 4f 43 41 4c 22 29 3b 0a 09 09 63 61 73 65 20  LOCAL");...case 
49b0: 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52 41 43  CKA_NEVER_EXTRAC
49c0: 54 41 42 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e  TABLE:....return
49d0: 28 22 43 4b 41 5f 4e 45 56 45 52 5f 45 58 54 52  ("CKA_NEVER_EXTR
49e0: 41 43 54 41 42 4c 45 22 29 3b 0a 09 09 63 61 73  ACTABLE");...cas
49f0: 65 20 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45 4e  e CKA_ALWAYS_SEN
4a00: 53 49 54 49 56 45 3a 0a 09 09 09 72 65 74 75 72  SITIVE:....retur
4a10: 6e 28 22 43 4b 41 5f 41 4c 57 41 59 53 5f 53 45  n("CKA_ALWAYS_SE
4a20: 4e 53 49 54 49 56 45 22 29 3b 0a 09 09 63 61 73  NSITIVE");...cas
4a30: 65 20 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f 4d 45  e CKA_KEY_GEN_ME
4a40: 43 48 41 4e 49 53 4d 3a 0a 09 09 09 72 65 74 75  CHANISM:....retu
4a50: 72 6e 28 22 43 4b 41 5f 4b 45 59 5f 47 45 4e 5f  rn("CKA_KEY_GEN_
4a60: 4d 45 43 48 41 4e 49 53 4d 22 29 3b 0a 09 09 63  MECHANISM");...c
4a70: 61 73 65 20 43 4b 41 5f 4d 4f 44 49 46 49 41 42  ase CKA_MODIFIAB
4a80: 4c 45 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  LE:....return("C
4a90: 4b 41 5f 4d 4f 44 49 46 49 41 42 4c 45 22 29 3b  KA_MODIFIABLE");
4aa0: 0a 09 09 63 61 73 65 20 43 4b 41 5f 45 43 44 53  ...case CKA_ECDS
4ab0: 41 5f 50 41 52 41 4d 53 3a 0a 09 09 09 72 65 74  A_PARAMS:....ret
4ac0: 75 72 6e 28 22 43 4b 41 5f 45 43 44 53 41 5f 50  urn("CKA_ECDSA_P
4ad0: 41 52 41 4d 53 22 29 3b 0a 09 09 63 61 73 65 20  ARAMS");...case 
4ae0: 43 4b 41 5f 45 43 5f 50 4f 49 4e 54 3a 0a 09 09  CKA_EC_POINT:...
4af0: 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 45 43 5f  .return("CKA_EC_
4b00: 50 4f 49 4e 54 22 29 3b 0a 09 09 63 61 73 65 20  POINT");...case 
4b10: 43 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55  CKA_SECONDARY_AU
4b20: 54 48 3a 0a 09 09 09 72 65 74 75 72 6e 28 22 43  TH:....return("C
4b30: 4b 41 5f 53 45 43 4f 4e 44 41 52 59 5f 41 55 54  KA_SECONDARY_AUT
4b40: 48 22 29 3b 0a 09 09 63 61 73 65 20 43 4b 41 5f  H");...case CKA_
4b50: 41 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 3a 0a  AUTH_PIN_FLAGS:.
4b60: 09 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 41  ...return("CKA_A
4b70: 55 54 48 5f 50 49 4e 5f 46 4c 41 47 53 22 29 3b  UTH_PIN_FLAGS");
4b80: 0a 09 09 63 61 73 65 20 43 4b 41 5f 48 57 5f 46  ...case CKA_HW_F
4b90: 45 41 54 55 52 45 5f 54 59 50 45 3a 0a 09 09 09  EATURE_TYPE:....
4ba0: 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 57 5f 46  return("CKA_HW_F
4bb0: 45 41 54 55 52 45 5f 54 59 50 45 22 29 3b 0a 09  EATURE_TYPE");..
4bc0: 09 63 61 73 65 20 43 4b 41 5f 52 45 53 45 54 5f  .case CKA_RESET_
4bd0: 4f 4e 5f 49 4e 49 54 3a 0a 09 09 09 72 65 74 75  ON_INIT:....retu
4be0: 72 6e 28 22 43 4b 41 5f 52 45 53 45 54 5f 4f 4e  rn("CKA_RESET_ON
4bf0: 5f 49 4e 49 54 22 29 3b 0a 09 09 63 61 73 65 20  _INIT");...case 
4c00: 43 4b 41 5f 48 41 53 5f 52 45 53 45 54 3a 0a 09  CKA_HAS_RESET:..
4c10: 09 09 72 65 74 75 72 6e 28 22 43 4b 41 5f 48 41  ..return("CKA_HA
4c20: 53 5f 52 45 53 45 54 22 29 3b 0a 09 09 63 61 73  S_RESET");...cas
4c30: 65 20 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46  e CKA_VENDOR_DEF
4c40: 49 4e 45 44 3a 0a 09 09 09 72 65 74 75 72 6e 28  INED:....return(
4c50: 22 43 4b 41 5f 56 45 4e 44 4f 52 5f 44 45 46 49  "CKA_VENDOR_DEFI
4c60: 4e 45 44 22 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  NED");..}...retu
4c70: 72 6e 28 22 55 4e 4b 4e 4f 57 4e 22 29 3b 0a 7d  rn("UNKNOWN");.}
4c80: 0a 0a 23 20 20 64 65 66 69 6e 65 20 6d 61 6c 6c  ..#  define mall
4c90: 6f 63 28 78 29 20 43 41 43 4b 45 59 5f 44 45 42  oc(x) CACKEY_DEB
4ca0: 55 47 5f 46 55 4e 43 5f 4d 41 4c 4c 4f 43 28 78  UG_FUNC_MALLOC(x
4cb0: 2c 20 5f 5f 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49  , __func__, __LI
4cc0: 4e 45 5f 5f 29 0a 23 20 20 64 65 66 69 6e 65 20  NE__).#  define 
4cd0: 72 65 61 6c 6c 6f 63 28 78 2c 20 79 29 20 43 41  realloc(x, y) CA
4ce0: 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f  CKEY_DEBUG_FUNC_
4cf0: 52 45 41 4c 4c 4f 43 28 78 2c 20 79 2c 20 5f 5f  REALLOC(x, y, __
4d00: 66 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f  func__, __LINE__
4d10: 29 0a 23 20 20 69 66 64 65 66 20 73 74 72 64 75  ).#  ifdef strdu
4d20: 70 0a 23 20 20 20 20 75 6e 64 65 66 20 73 74 72  p.#    undef str
4d30: 64 75 70 0a 23 20 20 65 6e 64 69 66 0a 23 20 20  dup.#  endif.#  
4d40: 64 65 66 69 6e 65 20 73 74 72 64 75 70 28 78 29  define strdup(x)
4d50: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
4d60: 4e 43 5f 53 54 52 44 55 50 28 78 2c 20 5f 5f 66  NC_STRDUP(x, __f
4d70: 75 6e 63 5f 5f 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  unc__, __LINE__)
4d80: 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
4d90: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52   CACKEY_DEBUG_PR
4da0: 49 4e 54 46 28 78 2e 2e 2e 29 20 2f 2a 2a 2f 0a  INTF(x...) /**/.
4db0: 23 20 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59  #  define CACKEY
4dc0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46 28  _DEBUG_PRINTBUF(
4dd0: 66 2c 20 78 2c 20 79 29 20 2f 2a 2a 2f 0a 23 20  f, x, y) /**/.# 
4de0: 20 64 65 66 69 6e 65 20 43 41 43 4b 45 59 5f 44   define CACKEY_D
4df0: 45 42 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f  EBUG_FUNC_TAG_TO
4e00: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e10: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e20: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e30: 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
4e40: 5f 53 54 52 28 78 29 20 22 44 45 42 55 47 5f 44  _STR(x) "DEBUG_D
4e50: 49 53 41 42 4c 45 44 22 0a 23 20 20 64 65 66 69  ISABLED".#  defi
4e60: 6e 65 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ne CACKEY_DEBUG_
4e70: 46 55 4e 43 5f 4f 42 4a 49 44 5f 54 4f 5f 53 54  FUNC_OBJID_TO_ST
4e80: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4e90: 42 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20  BLED".#  define 
4ea0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
4eb0: 43 5f 41 50 50 54 59 50 45 5f 54 4f 5f 53 54 52  C_APPTYPE_TO_STR
4ec0: 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41 42  (x) "DEBUG_DISAB
4ed0: 4c 45 44 22 0a 23 20 20 64 65 66 69 6e 65 20 43  LED".#  define C
4ee0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
4ef0: 5f 41 54 54 52 49 42 55 54 45 5f 54 4f 5f 53 54  _ATTRIBUTE_TO_ST
4f00: 52 28 78 29 20 22 44 45 42 55 47 5f 44 49 53 41  R(x) "DEBUG_DISA
4f10: 42 4c 45 44 22 0a 23 65 6e 64 69 66 0a 0a 74 79  BLED".#endif..ty
4f20: 70 65 64 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41  pedef enum {..CA
4f30: 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
4f40: 2c 0a 09 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  ,..CACKEY_ID_TYP
4f50: 45 5f 50 49 56 2c 0a 09 43 41 43 4b 45 59 5f 49  E_PIV,..CACKEY_I
4f60: 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
4f70: 0a 7d 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  .} cackey_pcsc_i
4f80: 64 5f 74 79 70 65 3b 0a 0a 73 74 72 75 63 74 20  d_type;..struct 
4f90: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
4fa0: 74 69 74 79 20 7b 0a 09 63 61 63 6b 65 79 5f 70  tity {..cackey_p
4fb0: 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64 5f 74  csc_id_type id_t
4fc0: 79 70 65 3b 0a 0a 09 73 69 7a 65 5f 74 20 63 65  ype;...size_t ce
4fd0: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
4fe0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
4ff0: 65 72 74 69 66 69 63 61 74 65 3b 0a 0a 09 73 73  ertificate;...ss
5000: 69 7a 65 5f 74 20 6b 65 79 73 69 7a 65 3b 0a 0a  ize_t keysize;..
5010: 09 75 6e 69 6f 6e 20 7b 0a 09 09 73 74 72 75 63  .union {...struc
5020: 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e 65 64 20  t {....unsigned 
5030: 63 68 61 72 20 61 70 70 6c 65 74 5b 37 5d 3b 0a  char applet[7];.
5040: 09 09 09 75 69 6e 74 31 36 5f 74 20 66 69 6c 65  ...uint16_t file
5050: 3b 0a 09 09 7d 20 63 61 63 3b 0a 0a 09 09 73 74  ;...} cac;....st
5060: 72 75 63 74 20 7b 0a 09 09 09 75 6e 73 69 67 6e  ruct {....unsign
5070: 65 64 20 63 68 61 72 20 6b 65 79 5f 69 64 3b 0a  ed char key_id;.
5080: 09 09 7d 20 70 69 76 3b 0a 09 7d 20 63 61 72 64  ..} piv;..} card
5090: 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63 61 63  ;.};..struct cac
50a0: 6b 65 79 5f 69 64 65 6e 74 69 74 79 20 7b 0a 09  key_identity {..
50b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
50c0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73  sc_identity *pcs
50d0: 63 5f 69 64 65 6e 74 69 74 79 3b 0a 0a 09 43 4b  c_identity;...CK
50e0: 5f 41 54 54 52 49 42 55 54 45 20 2a 61 74 74 72  _ATTRIBUTE *attr
50f0: 69 62 75 74 65 73 3b 0a 09 43 4b 5f 55 4c 4f 4e  ibutes;..CK_ULON
5100: 47 20 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75  G attributes_cou
5110: 6e 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 63  nt;.};..struct c
5120: 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 20 7b 0a  ackey_session {.
5130: 09 69 6e 74 20 61 63 74 69 76 65 3b 0a 0a 09 43  .int active;...C
5140: 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
5150: 3b 0a 0a 09 43 4b 5f 53 54 41 54 45 20 73 74 61  ;...CK_STATE sta
5160: 74 65 3b 0a 09 43 4b 5f 46 4c 41 47 53 20 66 6c  te;..CK_FLAGS fl
5170: 61 67 73 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75  ags;..CK_ULONG u
5180: 6c 44 65 76 69 63 65 45 72 72 6f 72 3b 0a 09 43  lDeviceError;..C
5190: 4b 5f 56 4f 49 44 5f 50 54 52 20 70 41 70 70 6c  K_VOID_PTR pAppl
51a0: 69 63 61 74 69 6f 6e 3b 0a 09 43 4b 5f 4e 4f 54  ication;..CK_NOT
51b0: 49 46 59 20 4e 6f 74 69 66 79 3b 0a 0a 09 73 74  IFY Notify;...st
51c0: 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
51d0: 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
51e0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
51f0: 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
5200: 74 3b 0a 0a 09 69 6e 74 20 73 65 61 72 63 68 5f  t;...int search_
5210: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 41 54 54 52  active;..CK_ATTR
5220: 49 42 55 54 45 5f 50 54 52 20 73 65 61 72 63 68  IBUTE_PTR search
5230: 5f 71 75 65 72 79 3b 0a 09 43 4b 5f 55 4c 4f 4e  _query;..CK_ULON
5240: 47 20 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63  G search_query_c
5250: 6f 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20  ount;..unsigned 
5260: 6c 6f 6e 67 20 73 65 61 72 63 68 5f 63 75 72 72  long search_curr
5270: 5f 69 64 3b 0a 0a 09 69 6e 74 20 73 69 67 6e 5f  _id;...int sign_
5280: 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43 48  active;..CK_MECH
5290: 41 4e 49 53 4d 5f 54 59 50 45 20 73 69 67 6e 5f  ANISM_TYPE sign_
52a0: 6d 65 63 68 61 6e 69 73 6d 3b 0a 09 43 4b 5f 42  mechanism;..CK_B
52b0: 59 54 45 5f 50 54 52 20 73 69 67 6e 5f 62 75 66  YTE_PTR sign_buf
52c0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
52d0: 20 73 69 67 6e 5f 62 75 66 6c 65 6e 3b 0a 09 75   sign_buflen;..u
52e0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 67  nsigned long sig
52f0: 6e 5f 62 75 66 75 73 65 64 3b 0a 09 73 74 72 75  n_bufused;..stru
5300: 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69  ct cackey_identi
5310: 74 79 20 2a 73 69 67 6e 5f 69 64 65 6e 74 69 74  ty *sign_identit
5320: 79 3b 0a 0a 09 69 6e 74 20 64 65 63 72 79 70 74  y;...int decrypt
5330: 5f 61 63 74 69 76 65 3b 0a 09 43 4b 5f 4d 45 43  _active;..CK_MEC
5340: 48 41 4e 49 53 4d 5f 54 59 50 45 20 64 65 63 72  HANISM_TYPE decr
5350: 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d 3b 0a 09  ypt_mechanism;..
5360: 43 4b 5f 56 4f 49 44 5f 50 54 52 20 64 65 63 72  CK_VOID_PTR decr
5370: 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 3b 0a 09  ypt_mech_parm;..
5380: 43 4b 5f 55 4c 4f 4e 47 20 64 65 63 72 79 70 74  CK_ULONG decrypt
5390: 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e 3b 0a 09  _mech_parmlen;..
53a0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64  struct cackey_id
53b0: 65 6e 74 69 74 79 20 2a 64 65 63 72 79 70 74 5f  entity *decrypt_
53c0: 69 64 65 6e 74 69 74 79 3b 0a 7d 3b 0a 0a 73 74  identity;.};..st
53d0: 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
53e0: 20 7b 0a 09 69 6e 74 20 61 63 74 69 76 65 3b 0a   {..int active;.
53f0: 09 69 6e 74 20 69 6e 74 65 72 6e 61 6c 3b 0a 0a  .int internal;..
5400: 09 63 68 61 72 20 2a 70 63 73 63 5f 72 65 61 64  .char *pcsc_read
5410: 65 72 3b 0a 0a 09 69 6e 74 20 70 63 73 63 5f 63  er;...int pcsc_c
5420: 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 3b 0a 09  ard_connected;..
5430: 53 43 41 52 44 48 41 4e 44 4c 45 20 70 63 73 63  SCARDHANDLE pcsc
5440: 5f 63 61 72 64 3b 0a 0a 09 69 6e 74 20 74 72 61  _card;...int tra
5450: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 3b 0a  nsaction_depth;.
5460: 09 69 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  .int transaction
5470: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 3b 0a 0a  _need_hw_lock;..
5480: 09 69 6e 74 20 73 6c 6f 74 5f 72 65 73 65 74 3b  .int slot_reset;
5490: 0a 0a 09 43 4b 5f 46 4c 41 47 53 20 74 6f 6b 65  ...CK_FLAGS toke
54a0: 6e 5f 66 6c 61 67 73 3b 0a 0a 09 75 6e 73 69 67  n_flags;...unsig
54b0: 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b  ned char *label;
54c0: 0a 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ...DWORD protoco
54d0: 6c 3b 0a 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  l;...unsigned in
54e0: 74 20 63 61 63 68 65 64 5f 63 65 72 74 73 5f 63  t cached_certs_c
54f0: 6f 75 6e 74 3b 0a 09 73 74 72 75 63 74 20 63 61  ount;..struct ca
5500: 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69  ckey_pcsc_identi
5510: 74 79 20 2a 63 61 63 68 65 64 5f 63 65 72 74 73  ty *cached_certs
5520: 3b 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 65 6e  ;.};..typedef en
5530: 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f 54 4c 56  um {..CACKEY_TLV
5540: 5f 41 50 50 5f 47 45 4e 45 52 49 43 20 3d 20 30  _APP_GENERIC = 0
5550: 78 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x01,..CACKEY_TLV
5560: 5f 41 50 50 5f 53 4b 49 20 20 20 20 20 3d 20 30  _APP_SKI     = 0
5570: 78 30 32 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56  x02,..CACKEY_TLV
5580: 5f 41 50 50 5f 50 4b 49 20 20 20 20 20 3d 20 30  _APP_PKI     = 0
5590: 78 30 34 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76  x04.} cackey_tlv
55a0: 5f 61 70 70 74 79 70 65 3b 0a 0a 74 79 70 65 64  _apptype;..typed
55b0: 65 66 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45  ef enum {..CACKE
55c0: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 47 45 4e 45  Y_TLV_OBJID_GENE
55d0: 52 41 4c 49 4e 46 4f 20 20 20 20 20 20 20 3d 20  RALINFO       = 
55e0: 30 78 32 30 30 30 2c 0a 09 43 41 43 4b 45 59 5f  0x2000,..CACKEY_
55f0: 54 4c 56 5f 4f 42 4a 49 44 5f 50 52 4f 50 45 52  TLV_OBJID_PROPER
5600: 53 4f 4e 41 4c 49 4e 46 4f 20 20 20 3d 20 30 78  SONALINFO   = 0x
5610: 32 31 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  2100,..CACKEY_TL
5620: 56 5f 4f 42 4a 49 44 5f 41 43 43 45 53 53 43 4f  V_OBJID_ACCESSCO
5630: 4e 54 52 4f 4c 20 20 20 20 20 3d 20 30 78 33 30  NTROL     = 0x30
5640: 30 30 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  00,..CACKEY_TLV_
5650: 4f 42 4a 49 44 5f 4c 4f 47 49 4e 20 20 20 20 20  OBJID_LOGIN     
5660: 20 20 20 20 20 20 20 20 3d 20 30 78 34 30 30 30          = 0x4000
5670: 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42  ,..CACKEY_TLV_OB
5680: 4a 49 44 5f 43 41 52 44 49 4e 46 4f 20 20 20 20  JID_CARDINFO    
5690: 20 20 20 20 20 20 3d 20 30 78 35 30 30 30 2c 0a        = 0x5000,.
56a0: 09 43 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49  .CACKEY_TLV_OBJI
56b0: 44 5f 42 49 4f 4d 45 54 52 49 43 53 20 20 20 20  D_BIOMETRICS    
56c0: 20 20 20 20 3d 20 30 78 36 30 30 30 2c 0a 09 43      = 0x6000,..C
56d0: 41 43 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f  ACKEY_TLV_OBJID_
56e0: 44 49 47 49 54 41 4c 53 49 47 43 45 52 54 20 20  DIGITALSIGCERT  
56f0: 20 20 3d 20 30 78 37 30 30 30 2c 0a 09 43 41 43    = 0x7000,..CAC
5700: 4b 45 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41  KEY_TLV_OBJID_CA
5710: 43 5f 50 45 52 53 4f 4e 20 20 20 20 20 20 20 20  C_PERSON        
5720: 3d 20 30 78 30 32 30 30 2c 0a 09 43 41 43 4b 45  = 0x0200,..CACKE
5730: 59 5f 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f  Y_TLV_OBJID_CAC_
5740: 42 45 4e 45 46 49 54 53 20 20 20 20 20 20 3d 20  BENEFITS      = 
5750: 30 78 30 32 30 32 2c 0a 09 43 41 43 4b 45 59 5f  0x0202,..CACKEY_
5760: 54 4c 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 4f 54  TLV_OBJID_CAC_OT
5770: 48 45 52 42 45 4e 45 46 49 54 53 20 3d 20 30 78  HERBENEFITS = 0x
5780: 30 32 30 33 2c 0a 09 43 41 43 4b 45 59 5f 54 4c  0203,..CACKEY_TL
5790: 56 5f 4f 42 4a 49 44 5f 43 41 43 5f 50 45 52 53  V_OBJID_CAC_PERS
57a0: 4f 4e 4e 45 4c 20 20 20 20 20 3d 20 30 78 30 32  ONNEL     = 0x02
57b0: 30 31 2c 0a 09 43 41 43 4b 45 59 5f 54 4c 56 5f  01,..CACKEY_TLV_
57c0: 4f 42 4a 49 44 5f 43 41 43 5f 50 4b 49 43 45 52  OBJID_CAC_PKICER
57d0: 54 20 20 20 20 20 20 20 3d 20 30 78 30 32 46 45  T       = 0x02FE
57e0: 0a 7d 20 63 61 63 6b 65 79 5f 74 6c 76 5f 6f 62  .} cackey_tlv_ob
57f0: 6a 65 63 74 69 64 3b 0a 0a 74 79 70 65 64 65 66  jectid;..typedef
5800: 20 65 6e 75 6d 20 7b 0a 09 43 41 43 4b 45 59 5f   enum {..CACKEY_
5810: 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
5820: 45 4e 54 20 20 20 20 3d 20 31 2c 0a 09 43 41 43  ENT    = 1,..CAC
5830: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
5840: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 2c 0a             = 0,.
5850: 09 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  .CACKEY_PCSC_E_G
5860: 45 4e 45 52 49 43 20 20 20 20 20 20 20 20 20 3d  ENERIC         =
5870: 20 2d 31 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53   -1,..CACKEY_PCS
5880: 43 5f 45 5f 42 41 44 50 49 4e 20 20 20 20 20 20  C_E_BADPIN      
5890: 20 20 20 20 3d 20 2d 32 2c 0a 09 43 41 43 4b 45      = -2,..CACKE
58a0: 59 5f 50 43 53 43 5f 45 5f 4c 4f 43 4b 45 44 20  Y_PCSC_E_LOCKED 
58b0: 20 20 20 20 20 20 20 20 20 3d 20 2d 33 2c 0a 09           = -3,..
58c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45  CACKEY_PCSC_E_NE
58d0: 45 44 4c 4f 47 49 4e 20 20 20 20 20 20 20 3d 20  EDLOGIN       = 
58e0: 2d 34 2c 0a 09 43 41 43 4b 45 59 5f 50 43 53 43  -4,..CACKEY_PCSC
58f0: 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 20 20  _E_TOKENABSENT  
5900: 20 20 20 3d 20 2d 36 2c 0a 09 43 41 43 4b 45 59     = -6,..CACKEY
5910: 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 20 20 20  _PCSC_E_RETRY   
5920: 20 20 20 20 20 20 20 20 3d 20 2d 37 0a 7d 20 63          = -7.} c
5930: 61 63 6b 65 79 5f 72 65 74 3b 0a 0a 73 74 72 75  ackey_ret;..stru
5940: 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 63 61  ct cackey_tlv_ca
5950: 72 64 75 72 6c 20 7b 0a 09 75 6e 73 69 67 6e 65  rdurl {..unsigne
5960: 64 20 63 68 61 72 20 20 20 20 20 20 20 20 72 69  d char        ri
5970: 64 5b 35 5d 3b 0a 09 63 61 63 6b 65 79 5f 74 6c  d[5];..cackey_tl
5980: 76 5f 61 70 70 74 79 70 65 20 20 20 61 70 70 74  v_apptype   appt
5990: 79 70 65 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  ype;..cackey_tlv
59a0: 5f 6f 62 6a 65 63 74 69 64 20 20 6f 62 6a 65 63  _objectid  objec
59b0: 74 69 64 3b 0a 09 63 61 63 6b 65 79 5f 74 6c 76  tid;..cackey_tlv
59c0: 5f 6f 62 6a 65 63 74 69 64 20 20 61 70 70 69 64  _objectid  appid
59d0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  ;..unsigned char
59e0: 20 20 20 20 20 20 20 20 70 69 6e 69 64 3b 0a 7d          pinid;.}
59f0: 3b 0a 0a 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
5a00: 5f 74 6c 76 5f 65 6e 74 69 74 79 3b 0a 73 74 72  _tlv_entity;.str
5a10: 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65  uct cackey_tlv_e
5a20: 6e 74 69 74 79 20 7b 0a 09 75 69 6e 74 38 5f 74  ntity {..uint8_t
5a30: 20 74 61 67 3b 0a 09 73 69 7a 65 5f 74 20 6c 65   tag;..size_t le
5a40: 6e 67 74 68 3b 0a 0a 09 75 6e 69 6f 6e 20 7b 0a  ngth;...union {.
5a50: 09 09 76 6f 69 64 20 2a 76 61 6c 75 65 3b 0a 09  ..void *value;..
5a60: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
5a70: 6c 76 5f 63 61 72 64 75 72 6c 20 2a 76 61 6c 75  lv_cardurl *valu
5a80: 65 5f 63 61 72 64 75 72 6c 3b 0a 09 09 75 69 6e  e_cardurl;...uin
5a90: 74 38 5f 74 20 76 61 6c 75 65 5f 62 79 74 65 3b  t8_t value_byte;
5aa0: 0a 09 7d 3b 0a 0a 09 73 74 72 75 63 74 20 63 61  ..};...struct ca
5ab0: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
5ac0: 2a 5f 6e 65 78 74 3b 0a 7d 3b 0a 0a 2f 2a 20 43  *_next;.};../* C
5ad0: 41 43 4b 45 59 20 47 6c 6f 62 61 6c 20 48 61 6e  ACKEY Global Han
5ae0: 64 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 76  dles */.static v
5af0: 6f 69 64 20 2a 63 61 63 6b 65 79 5f 62 69 67 6c  oid *cackey_bigl
5b00: 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  ock = NULL;.stat
5b10: 69 63 20 73 74 72 75 63 74 20 63 61 63 6b 65 79  ic struct cackey
5b20: 5f 73 65 73 73 69 6f 6e 20 63 61 63 6b 65 79 5f  _session cackey_
5b30: 73 65 73 73 69 6f 6e 73 5b 31 32 38 5d 3b 0a 73  sessions[128];.s
5b40: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 61 63  tatic struct cac
5b50: 6b 65 79 5f 73 6c 6f 74 20 63 61 63 6b 65 79 5f  key_slot cackey_
5b60: 73 6c 6f 74 73 5b 31 32 38 5d 3b 0a 73 74 61 74  slots[128];.stat
5b70: 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 69 6e  ic int cackey_in
5b80: 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 73  itialized = 0;.s
5b90: 74 61 74 69 63 20 69 6e 74 20 63 61 63 6b 65 79  tatic int cackey
5ba0: 5f 62 69 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20  _biglock_init = 
5bb0: 30 3b 0a 43 4b 5f 43 5f 49 4e 49 54 49 41 4c 49  0;.CK_C_INITIALI
5bc0: 5a 45 5f 41 52 47 53 20 63 61 63 6b 65 79 5f 61  ZE_ARGS cackey_a
5bd0: 72 67 73 3b 0a 0a 2f 2a 2a 20 45 78 74 72 61 20  rgs;../** Extra 
5be0: 63 65 72 74 69 66 69 63 61 74 65 73 20 74 6f 20  certificates to 
5bf0: 69 6e 63 6c 75 64 65 20 69 6e 20 74 6f 6b 65 6e  include in token
5c00: 20 2a 2a 2f 0a 73 74 72 75 63 74 20 63 61 63 6b   **/.struct cack
5c10: 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
5c20: 20 65 78 74 72 61 5f 63 65 72 74 73 5b 5d 20 3d   extra_certs[] =
5c30: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 63 61 63   {.#include "cac
5c40: 6b 65 79 5f 62 75 69 6c 74 69 6e 5f 63 65 72 74  key_builtin_cert
5c50: 73 2e 68 22 0a 7d 3b 0a 0a 2f 2a 20 50 43 53 43  s.h".};../* PCSC
5c60: 20 47 6c 6f 62 61 6c 20 48 61 6e 64 6c 65 73 20   Global Handles 
5c70: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 53 43 41 52  */.static LPSCAR
5c80: 44 43 4f 4e 54 45 58 54 20 63 61 63 6b 65 79 5f  DCONTEXT cackey_
5c90: 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55  pcsc_handle = NU
5ca0: 4c 4c 3b 0a 0a 73 74 61 74 69 63 20 75 6e 73 69  LL;..static unsi
5cb0: 67 6e 65 64 20 6c 6f 6e 67 20 63 61 63 6b 65 79  gned long cackey
5cc0: 5f 67 65 74 76 65 72 73 69 6f 6e 28 76 6f 69 64  _getversion(void
5cd0: 29 20 7b 0a 09 73 74 61 74 69 63 20 75 6e 73 69  ) {..static unsi
5ce0: 67 6e 65 64 20 6c 6f 6e 67 20 72 65 74 76 61 6c  gned long retval
5cf0: 20 3d 20 32 35 35 3b 0a 09 75 6e 73 69 67 6e 65   = 255;..unsigne
5d00: 64 20 6c 6f 6e 67 20 6d 61 6a 6f 72 20 3d 20 30  d long major = 0
5d10: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
5d20: 20 6d 69 6e 6f 72 20 3d 20 30 3b 0a 09 63 68 61   minor = 0;..cha
5d30: 72 20 2a 6d 61 6a 6f 72 5f 73 74 72 20 3d 20 4e  r *major_str = N
5d40: 55 4c 4c 3b 0a 09 63 68 61 72 20 2a 6d 69 6e 6f  ULL;..char *mino
5d50: 72 5f 73 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09  r_str = NULL;...
5d60: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
5d70: 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
5d80: 0a 09 69 66 20 28 72 65 74 76 61 6c 20 21 3d 20  ..if (retval != 
5d90: 32 35 35 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  255) {...CACKEY_
5da0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
5db0: 74 75 72 6e 69 6e 67 20 30 78 25 6c 78 20 28 63  turning 0x%lx (c
5dc0: 61 63 68 65 64 29 2e 22 2c 20 72 65 74 76 61 6c  ached).", retval
5dd0: 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
5de0: 76 61 6c 29 3b 0a 09 7d 0a 0a 09 72 65 74 76 61  val);..}...retva
5df0: 6c 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 50  l = 0;..#ifdef P
5e00: 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 0a 20  ACKAGE_VERSION. 
5e10: 20 20 20 20 20 20 20 6d 61 6a 6f 72 5f 73 74 72         major_str
5e20: 20 3d 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49   = PACKAGE_VERSI
5e30: 4f 4e 3b 0a 09 69 66 20 28 6d 61 6a 6f 72 5f 73  ON;..if (major_s
5e40: 74 72 29 20 7b 0a 09 20 20 20 20 20 20 20 20 6d  tr) {..        m
5e50: 61 6a 6f 72 20 3d 20 73 74 72 74 6f 75 6c 28 6d  ajor = strtoul(m
5e60: 61 6a 6f 72 5f 73 74 72 2c 20 26 6d 69 6e 6f 72  ajor_str, &minor
5e70: 5f 73 74 72 2c 20 31 30 29 3b 0a 0a 09 09 69 66  _str, 10);....if
5e80: 20 28 6d 69 6e 6f 72 5f 73 74 72 29 20 7b 0a 09   (minor_str) {..
5e90: 09 09 6d 69 6e 6f 72 20 3d 20 73 74 72 74 6f 75  ..minor = strtou
5ea0: 6c 28 6d 69 6e 6f 72 5f 73 74 72 20 2b 20 31 2c  l(minor_str + 1,
5eb0: 20 4e 55 4c 4c 2c 20 31 30 29 3b 0a 09 09 7d 0a   NULL, 10);...}.
5ec0: 09 7d 0a 0a 09 72 65 74 76 61 6c 20 3d 20 28 6d  .}...retval = (m
5ed0: 61 6a 6f 72 20 3c 3c 20 31 36 29 20 7c 20 28 6d  ajor << 16) | (m
5ee0: 69 6e 6f 72 20 3c 3c 20 38 29 3b 0a 23 65 6e 64  inor << 8);.#end
5ef0: 69 66 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  if...CACKEY_DEBU
5f00: 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
5f10: 69 6e 67 20 30 78 25 6c 78 22 2c 20 72 65 74 76  ing 0x%lx", retv
5f20: 61 6c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65  al);...return(re
5f30: 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a 20 50 43 2f  tval);.}../* PC/
5f40: 53 43 20 52 65 6c 61 74 65 64 20 46 75 6e 63 74  SC Related Funct
5f50: 69 6f 6e 73 20 2a 2f 0a 2f 2a 0a 20 2a 20 53 59  ions */./*. * SY
5f60: 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 76 6f  NPOSIS. *     vo
5f70: 69 64 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f  id cackey_slots_
5f80: 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76  disconnect_all(v
5f90: 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55  oid);. *. * ARGU
5fa0: 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f 6e  MENTS. *     Non
5fb0: 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  e. *. * RETURN V
5fc0: 41 4c 55 45 0a 20 2a 20 20 20 20 20 4e 6f 6e 65  ALUE. *     None
5fd0: 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
5fe0: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f      This functio
5ff0: 6e 20 64 69 73 63 6f 6e 6e 65 63 74 73 20 66 72  n disconnects fr
6000: 6f 6d 20 61 6c 6c 20 63 61 72 64 73 2e 0a 20 2a  om all cards.. *
6010: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
6020: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69   cackey_slots_di
6030: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 76 6f 69  sconnect_all(voi
6040: 64 29 20 7b 0a 09 75 69 6e 74 33 32 5f 74 20 69  d) {..uint32_t i
6050: 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  dx;...CACKEY_DEB
6060: 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
6070: 64 2e 22 29 3b 0a 0a 09 66 6f 72 20 28 69 64 78  d.");...for (idx
6080: 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a   = 0; idx < (siz
6090: 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  eof(cackey_slots
60a0: 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
60b0: 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64  y_slots[0])); id
60c0: 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
60d0: 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 69  key_slots[idx].i
60e0: 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 09 2f 2a  nternal) {..../*
60f0: 20 53 6b 69 70 20 69 6e 74 65 72 6e 61 6c 20 73   Skip internal s
6100: 6c 6f 74 73 20 2a 2f 0a 09 09 09 63 6f 6e 74 69  lots */....conti
6110: 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  nue;...}....if (
6120: 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
6130: 5d 2e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ].pcsc_card_conn
6140: 65 63 74 65 64 29 20 7b 0a 09 09 09 43 41 43 4b  ected) {....CACK
6150: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6160: 22 53 43 61 72 64 44 69 73 63 6f 6e 6e 65 63 74  "SCardDisconnect
6170: 28 25 6c 75 29 20 63 61 6c 6c 65 64 22 2c 20 28  (%lu) called", (
6180: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69  unsigned long) i
6190: 64 78 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69  dx);.....SCardDi
61a0: 73 63 6f 6e 6e 65 63 74 28 63 61 63 6b 65 79 5f  sconnect(cackey_
61b0: 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
61c0: 63 61 72 64 2c 20 53 43 41 52 44 5f 4c 45 41 56  card, SCARD_LEAV
61d0: 45 5f 43 41 52 44 29 3b 0a 09 09 7d 0a 0a 09 09  E_CARD);...}....
61e0: 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
61f0: 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09  [idx].label) {..
6200: 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c  ..free(cackey_sl
6210: 6f 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 29 3b  ots[idx].label);
6220: 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
6230: 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20 4e  s[idx].label = N
6240: 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b  ULL;...}....cack
6250: 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63  ey_slots[idx].pc
6260: 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65  sc_card_connecte
6270: 64 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  d = 0;...cackey_
6280: 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61 6e 73  slots[idx].trans
6290: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 30  action_depth = 0
62a0: 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ;...cackey_slots
62b0: 5b 69 64 78 5d 2e 74 72 61 6e 73 61 63 74 69 6f  [idx].transactio
62c0: 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d  n_need_hw_lock =
62d0: 20 30 3b 0a 0a 09 09 69 66 20 28 63 61 63 6b 65   0;....if (cacke
62e0: 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74  y_slots[idx].act
62f0: 69 76 65 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  ive) {....CACKEY
6300: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4d  _DEBUG_PRINTF("M
6310: 61 72 6b 69 6e 67 20 61 63 74 69 76 65 20 73 6c  arking active sl
6320: 6f 74 20 25 6c 75 20 61 73 20 62 65 69 6e 67 20  ot %lu as being 
6330: 72 65 73 65 74 22 2c 20 28 75 6e 73 69 67 6e 65  reset", (unsigne
6340: 64 20 6c 6f 6e 67 29 20 69 64 78 29 3b 0a 09 09  d long) idx);...
6350: 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  }....cackey_slot
6360: 73 5b 69 64 78 5d 2e 73 6c 6f 74 5f 72 65 73 65  s[idx].slot_rese
6370: 74 20 3d 20 31 3b 0a 09 7d 0a 0a 09 43 41 43 4b  t = 1;..}...CACK
6380: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
6390: 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 0a 09  "Returning");...
63a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  return;.}../*. *
63b0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
63c0: 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
63d0: 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28  ey_pcsc_connect(
63e0: 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  void);. *. * ARG
63f0: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e 6f  UMENTS. *     No
6400: 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ne. *. * RETURN 
6410: 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41 43  VALUE. *     CAC
6420: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20  KEY_PCSC_S_OK   
6430: 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73 73        On success
6440: 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50  . *     CACKEY_P
6450: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20 20  CSC_E_GENERIC   
6460: 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20   On error. *. * 
6470: 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69  NOTES. *     Thi
6480: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 6e 65  s function conne
6490: 63 74 73 20 74 6f 20 74 68 65 20 50 43 2f 53 43  cts to the PC/SC
64a0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61 6e 61   Connection Mana
64b0: 67 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  ger and updates 
64c0: 74 68 65 0a 20 2a 20 20 20 20 20 67 6c 6f 62 61  the. *     globa
64d0: 6c 20 68 61 6e 64 6c 65 2e 0a 20 2a 0a 20 2a 2f  l handle.. *. */
64e0: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
64f0: 65 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63  et cackey_pcsc_c
6500: 6f 6e 6e 65 63 74 28 76 6f 69 64 29 20 7b 0a 09  onnect(void) {..
6510: 4c 4f 4e 47 20 73 63 61 72 64 5f 65 73 74 5f 63  LONG scard_est_c
6520: 6f 6e 74 65 78 74 5f 72 65 74 3b 0a 23 69 66 64  ontext_ret;.#ifd
6530: 65 66 20 48 41 56 45 5f 53 43 41 52 44 49 53 56  ef HAVE_SCARDISV
6540: 41 4c 49 44 43 4f 4e 54 45 58 54 0a 09 4c 4f 4e  ALIDCONTEXT..LON
6550: 47 20 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f  G scard_isvalid_
6560: 72 65 74 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41  ret;.#endif...CA
6570: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
6580: 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
6590: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
65a0: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  handle == NULL) 
65b0: 7b 0a 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f  {...cackey_pcsc_
65c0: 68 61 6e 64 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28  handle = malloc(
65d0: 73 69 7a 65 6f 66 28 2a 63 61 63 6b 65 79 5f 70  sizeof(*cackey_p
65e0: 63 73 63 5f 68 61 6e 64 6c 65 29 29 3b 0a 09 09  csc_handle));...
65f0: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
6600: 68 61 6e 64 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20  handle == NULL) 
6610: 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
6620: 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74  G_PRINTF("Call t
6630: 6f 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  o malloc() faile
6640: 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  d, returning in 
6650: 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 63  failure");.....c
6660: 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63  ackey_slots_disc
6670: 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09  onnect_all();...
6680: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
6690: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
66a0: 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ...}....CACKEY_D
66b0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
66c0: 72 64 45 73 74 61 62 6c 69 73 68 43 6f 6e 74 65  rdEstablishConte
66d0: 78 74 28 29 20 63 61 6c 6c 65 64 22 29 3b 0a 09  xt() called");..
66e0: 09 73 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65  .scard_est_conte
66f0: 78 74 5f 72 65 74 20 3d 20 53 43 61 72 64 45 73  xt_ret = SCardEs
6700: 74 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 53  tablishContext(S
6710: 43 41 52 44 5f 53 43 4f 50 45 5f 53 59 53 54 45  CARD_SCOPE_SYSTE
6720: 4d 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 63  M, NULL, NULL, c
6730: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6740: 65 29 3b 0a 09 09 69 66 20 28 73 63 61 72 64 5f  e);...if (scard_
6750: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 20  est_context_ret 
6760: 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45  != SCARD_S_SUCCE
6770: 53 53 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  SS) {....CACKEY_
6780: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
6790: 6c 6c 20 74 6f 20 53 43 61 72 64 45 73 74 61 62  ll to SCardEstab
67a0: 6c 69 73 68 43 6f 6e 74 65 78 74 20 66 61 69 6c  lishContext fail
67b0: 65 64 20 28 72 65 74 75 72 6e 65 64 20 25 73 2f  ed (returned %s/
67c0: 25 6c 69 29 2c 20 72 65 74 75 72 6e 69 6e 67 20  %li), returning 
67d0: 69 6e 20 66 61 69 6c 75 72 65 22 2c 20 43 41 43  in failure", CAC
67e0: 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
67f0: 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
6800: 63 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74  card_est_context
6810: 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
6820: 61 72 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f  ard_est_context_
6830: 72 65 74 29 3b 0a 0a 09 09 09 66 72 65 65 28 63  ret);.....free(c
6840: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
6850: 65 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 70 63  e);....cackey_pc
6860: 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e 55 4c 4c  sc_handle = NULL
6870: 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f  ;.....cackey_slo
6880: 74 73 5f 64 69 73 63 6f 6e 6e 65 63 74 5f 61 6c  ts_disconnect_al
6890: 6c 28 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  l();.....return(
68a0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
68b0: 4e 45 52 49 43 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  NERIC);...}..}..
68c0: 23 69 66 64 65 66 20 48 41 56 45 5f 53 43 41 52  #ifdef HAVE_SCAR
68d0: 44 49 53 56 41 4c 49 44 43 4f 4e 54 45 58 54 0a  DISVALIDCONTEXT.
68e0: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
68f0: 49 4e 54 46 28 22 53 43 61 72 64 49 73 56 61 6c  INTF("SCardIsVal
6900: 69 64 43 6f 6e 74 65 78 74 28 29 20 63 61 6c 6c  idContext() call
6910: 65 64 22 29 3b 0a 09 73 63 61 72 64 5f 69 73 76  ed");..scard_isv
6920: 61 6c 69 64 5f 72 65 74 20 3d 20 53 43 61 72 64  alid_ret = SCard
6930: 49 73 56 61 6c 69 64 43 6f 6e 74 65 78 74 28 2a  IsValidContext(*
6940: 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64  cackey_pcsc_hand
6950: 6c 65 29 3b 0a 09 69 66 20 28 73 63 61 72 64 5f  le);..if (scard_
6960: 69 73 76 61 6c 69 64 5f 72 65 74 20 21 3d 20 53  isvalid_ret != S
6970: 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20  CARD_S_SUCCESS) 
6980: 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
6990: 5f 50 52 49 4e 54 46 28 22 48 61 6e 64 6c 65 20  _PRINTF("Handle 
69a0: 68 61 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c  has become inval
69b0: 69 64 20 28 53 43 61 72 64 49 73 56 61 6c 69 64  id (SCardIsValid
69c0: 43 6f 6e 74 65 78 74 20 3d 20 25 73 2f 25 6c 69  Context = %s/%li
69d0: 29 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65 2d  ), trying to re-
69e0: 65 73 74 61 62 6c 69 73 68 2e 2e 2e 22 2c 20 43  establish...", C
69f0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
6a00: 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
6a10: 28 73 63 61 72 64 5f 69 73 76 61 6c 69 64 5f 72  (scard_isvalid_r
6a20: 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72  et), (long) scar
6a30: 64 5f 69 73 76 61 6c 69 64 5f 72 65 74 29 3b 0a  d_isvalid_ret);.
6a40: 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
6a50: 50 52 49 4e 54 46 28 22 53 43 61 72 64 45 73 74  PRINTF("SCardEst
6a60: 61 62 6c 69 73 68 43 6f 6e 74 65 78 74 28 29 20  ablishContext() 
6a70: 63 61 6c 6c 65 64 22 29 3b 0a 09 09 73 63 61 72  called");...scar
6a80: 64 5f 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65  d_est_context_re
6a90: 74 20 3d 20 53 43 61 72 64 45 73 74 61 62 6c 69  t = SCardEstabli
6aa0: 73 68 43 6f 6e 74 65 78 74 28 53 43 41 52 44 5f  shContext(SCARD_
6ab0: 53 43 4f 50 45 5f 53 59 53 54 45 4d 2c 20 4e 55  SCOPE_SYSTEM, NU
6ac0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 63 61 63 6b 65 79  LL, NULL, cackey
6ad0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6ae0: 09 69 66 20 28 73 63 61 72 64 5f 65 73 74 5f 63  .if (scard_est_c
6af0: 6f 6e 74 65 78 74 5f 72 65 74 20 21 3d 20 53 43  ontext_ret != SC
6b00: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
6b10: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
6b20: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 20 74 6f  _PRINTF("Call to
6b30: 20 53 43 61 72 64 45 73 74 61 62 6c 69 73 68 43   SCardEstablishC
6b40: 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 20 28 72  ontext failed (r
6b50: 65 74 75 72 6e 65 64 20 25 73 2f 25 6c 69 29 2c  eturned %s/%li),
6b60: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
6b70: 69 6c 75 72 65 22 2c 20 43 41 43 4b 45 59 5f 44  ilure", CACKEY_D
6b80: 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44 45  EBUG_FUNC_SCARDE
6b90: 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64 5f  RR_TO_STR(scard_
6ba0: 65 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29  est_context_ret)
6bb0: 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64 5f 65  , (long) scard_e
6bc0: 73 74 5f 63 6f 6e 74 65 78 74 5f 72 65 74 29 3b  st_context_ret);
6bd0: 0a 0a 09 09 09 66 72 65 65 28 63 61 63 6b 65 79  .....free(cackey
6be0: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 09  _pcsc_handle);..
6bf0: 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  ..cackey_pcsc_ha
6c00: 6e 64 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  ndle = NULL;....
6c10: 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5f 64 69  .cackey_slots_di
6c20: 73 63 6f 6e 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a  sconnect_all();.
6c30: 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
6c40: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
6c50: 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59  );...}....CACKEY
6c60: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 48  _DEBUG_PRINTF("H
6c70: 61 6e 64 6c 65 20 68 61 73 20 62 65 65 6e 20 72  andle has been r
6c80: 65 2d 65 73 74 61 62 6c 69 73 68 65 64 22 29 3b  e-established");
6c90: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43  ..}.#endif...CAC
6ca0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
6cb0: 28 22 53 75 63 65 73 73 66 75 6c 6c 79 20 63 6f  ("Sucessfully co
6cc0: 6e 6e 65 63 74 65 64 20 74 6f 20 50 43 2f 53 43  nnected to PC/SC
6cd0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 73  , returning in s
6ce0: 75 63 63 65 73 73 22 29 3b 0a 0a 09 72 65 74 75  uccess");...retu
6cf0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
6d00: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
6d10: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
6d20: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
6d30: 5f 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74  _pcsc_disconnect
6d40: 28 76 6f 69 64 29 3b 0a 20 2a 0a 20 2a 20 41 52  (void);. *. * AR
6d50: 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 4e  GUMENTS. *     N
6d60: 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e  one. *. * RETURN
6d70: 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 43 41   VALUE. *     CA
6d80: 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 20 20  CKEY_PCSC_S_OK  
6d90: 20 20 20 20 20 20 20 4f 6e 20 73 75 63 63 65 73         On succes
6da0: 73 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  s. *     CACKEY_
6db0: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 20 20  PCSC_E_GENERIC  
6dc0: 20 20 4f 6e 20 65 72 72 6f 72 0a 20 2a 0a 20 2a    On error. *. *
6dd0: 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 54 68   NOTES. *     Th
6de0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 73 63  is function disc
6df0: 6f 6e 6e 65 63 74 73 20 66 72 6f 6d 20 74 68 65  onnects from the
6e00: 20 50 43 2f 53 43 20 43 6f 6e 6e 65 63 74 69 6f   PC/SC Connectio
6e10: 6e 20 6d 61 6e 61 67 65 72 20 61 6e 64 20 75 70  n manager and up
6e20: 64 61 74 65 73 0a 20 2a 20 20 20 20 20 74 68 65  dates. *     the
6e30: 20 67 6c 6f 62 61 6c 20 68 61 6e 64 6c 65 2e 0a   global handle..
6e40: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
6e50: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
6e60: 70 63 73 63 5f 64 69 73 63 6f 6e 6e 65 63 74 28  pcsc_disconnect(
6e70: 76 6f 69 64 29 20 7b 0a 09 4c 4f 4e 47 20 73 63  void) {..LONG sc
6e80: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
6e90: 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ret;...CACKEY_DE
6ea0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
6eb0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63  ed.");...if (cac
6ec0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20  key_pcsc_handle 
6ed0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74  == NULL) {...ret
6ee0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
6ef0: 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73 63 61 72  S_OK);..}...scar
6f00: 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f 72 65  d_rel_context_re
6f10: 74 20 3d 20 53 43 61 72 64 52 65 6c 65 61 73 65  t = SCardRelease
6f20: 43 6f 6e 74 65 78 74 28 2a 63 61 63 6b 65 79 5f  Context(*cackey_
6f30: 70 63 73 63 5f 68 61 6e 64 6c 65 29 3b 0a 0a 09  pcsc_handle);...
6f40: 69 66 20 28 63 61 63 6b 65 79 5f 70 63 73 63 5f  if (cackey_pcsc_
6f50: 68 61 6e 64 6c 65 29 20 7b 0a 09 09 66 72 65 65  handle) {...free
6f60: 28 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  (cackey_pcsc_han
6f70: 64 6c 65 29 3b 0a 09 0a 09 09 63 61 63 6b 65 79  dle);.....cackey
6f80: 5f 70 63 73 63 5f 68 61 6e 64 6c 65 20 3d 20 4e  _pcsc_handle = N
6f90: 55 4c 4c 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63  ULL;..}...if (sc
6fa0: 61 72 64 5f 72 65 6c 5f 63 6f 6e 74 65 78 74 5f  ard_rel_context_
6fb0: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
6fc0: 55 43 43 45 53 53 29 20 7b 0a 09 09 72 65 74 75  UCCESS) {...retu
6fd0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
6fe0: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
6ff0: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
7000: 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a  SC_S_OK);.}../*.
7010: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
7020: 20 20 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 6d     void cackey_m
7030: 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
7040: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
7050: 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a 0a 20 2a 20  t *slot);. *. * 
7060: 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20  ARGUMENTS. *    
7070: 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 52 45 54 55   None. *. * RETU
7080: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
7090: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53  None. *. * NOTES
70a0: 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66 75 6e  . *     This fun
70b0: 63 74 69 6f 6e 20 6d 61 72 6b 73 20 61 20 73 6c  ction marks a sl
70c0: 6f 74 20 68 61 73 20 68 61 76 69 6e 67 20 62 65  ot has having be
70d0: 65 6e 20 72 65 73 65 74 2c 20 74 6f 20 6c 61 74  en reset, to lat
70e0: 65 72 20 62 65 20 63 6c 65 61 6e 65 64 20 75 70  er be cleaned up
70f0: 2e 0a 20 2a 20 20 20 20 20 43 6c 65 61 6e 75 70  .. *     Cleanup
7100: 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
7110: 65 6e 20 61 20 50 4b 43 53 23 31 31 20 63 6c 69  en a PKCS#11 cli
7120: 65 6e 74 20 63 61 6c 6c 73 20 43 5f 46 69 6e 64  ent calls C_Find
7130: 4f 62 6a 65 63 74 73 49 6e 69 74 2e 0a 20 2a 0a  ObjectsInit.. *.
7140: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
7150: 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74  cackey_mark_slot
7160: 5f 72 65 73 65 74 28 73 74 72 75 63 74 20 63 61  _reset(struct ca
7170: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29  ckey_slot *slot)
7180: 20 7b 0a 09 69 66 20 28 73 6c 6f 74 20 3d 3d 20   {..if (slot == 
7190: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
71a0: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
71b0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
71c0: 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f  ed.");...if (slo
71d0: 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e  t->pcsc_card_con
71e0: 6e 65 63 74 65 64 29 20 7b 0a 09 09 53 43 61 72  nected) {...SCar
71f0: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
7200: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
7210: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
7220: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 73 6c 6f 74 5f  .}...slot->slot_
7230: 72 65 73 65 74 20 3d 20 31 3b 0a 09 73 6c 6f 74  reset = 1;..slot
7240: 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e  ->pcsc_card_conn
7250: 65 63 74 65 64 20 3d 20 30 3b 0a 09 73 6c 6f 74  ected = 0;..slot
7260: 2d 3e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ->token_flags = 
7270: 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52  CKF_LOGIN_REQUIR
7280: 45 44 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ED;...CACKEY_DEB
7290: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
72a0: 6e 69 6e 67 2e 22 29 3b 0a 0a 09 72 65 74 75 72  ning.");...retur
72b0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  n;.}../*. * SYNP
72c0: 4f 53 49 53 0a 20 2a 20 20 20 20 20 4c 4f 4e 47  OSIS. *     LONG
72d0: 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
72e0: 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63 61  t_card(struct ca
72f0: 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c  ckey_slot *slot,
7300: 20 44 57 4f 52 44 20 64 65 66 61 75 6c 74 5f 70   DWORD default_p
7310: 72 6f 74 6f 63 6f 6c 2c 20 4c 50 44 57 4f 52 44  rotocol, LPDWORD
7320: 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63   selected_protoc
7330: 6f 6c 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d  ol);. *. * ARGUM
7340: 45 4e 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  ENTS. *     cack
7350: 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a  ey_slot *slot. *
7360: 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f           Slot to
7370: 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74   send commands t
7380: 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 44 57 4f 52  o. *. *     DWOR
7390: 44 20 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63  D default_protoc
73a0: 6f 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 50 72  ol. *         Pr
73b0: 6f 74 6f 63 6f 6c 20 74 6f 20 61 74 74 65 6d 70  otocol to attemp
73c0: 74 20 66 69 72 73 74 0a 20 2a 0a 20 2a 20 20 20  t first. *. *   
73d0: 20 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74    LPDWORD select
73e0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 0a 20 2a 20 20  ed_protocol. *  
73f0: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 72 6f         [OUT] Pro
7400: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 0a 20  tocol selected. 
7410: 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55  *. * RETURN VALU
7420: 45 0a 20 2a 20 20 20 20 20 54 68 65 20 72 65 74  E. *     The ret
7430: 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 53  urn value from S
7440: 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 0a  CardReconnect().
7450: 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
7460: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
7470: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
7480: 6f 75 6e 64 20 53 43 61 72 64 52 65 63 6f 6e 6e  ound SCardReconn
7490: 65 63 74 28 29 0a 20 2a 0a 20 2a 20 20 20 20 20  ect(). *. *     
74a0: 54 68 65 20 53 43 61 72 64 52 65 63 6f 6e 6e 65  The SCardReconne
74b0: 63 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61  ct() function ca
74c0: 6c 6c 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  ll will be calle
74d0: 64 20 66 69 72 73 74 20 77 69 74 68 20 74 68 65  d first with the
74e0: 0a 20 2a 20 20 20 20 20 64 77 50 72 65 66 65 72  . *     dwPrefer
74f0: 72 65 64 50 72 6f 74 6f 63 6f 6c 73 20 6f 66 20  redProtocols of 
7500: 22 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f  "default_protoco
7510: 6c 22 2e 20 20 49 66 20 74 68 61 74 20 63 61 6c  l".  If that cal
7520: 6c 20 72 65 74 75 72 6e 73 0a 20 2a 20 20 20 20  l returns. *    
7530: 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d   SCARD_E_PROTO_M
7540: 49 53 4d 41 54 43 48 20 74 72 79 20 61 67 61 69  ISMATCH try agai
7550: 6e 20 77 69 74 68 20 61 20 70 72 6f 74 6f 63 6f  n with a protoco
7560: 6c 20 6f 66 20 54 3d 30 2c 20 61 6e 64 20 66 61  l of T=0, and fa
7570: 69 6c 69 6e 67 0a 20 2a 20 20 20 20 20 74 68 61  iling. *     tha
7580: 74 20 54 3d 31 2e 0a 20 2a 0a 20 2a 2f 0a 73 74  t T=1.. *. */.st
7590: 61 74 69 63 20 4c 4f 4e 47 20 63 61 63 6b 65 79  atic LONG cackey
75a0: 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64 28  _reconnect_card(
75b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
75c0: 6f 74 20 2a 73 6c 6f 74 2c 20 44 57 4f 52 44 20  ot *slot, DWORD 
75d0: 64 65 66 61 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c  default_protocol
75e0: 2c 20 4c 50 44 57 4f 52 44 20 73 65 6c 65 63 74  , LPDWORD select
75f0: 65 64 5f 70 72 6f 74 6f 63 6f 6c 29 20 7b 0a 09  ed_protocol) {..
7600: 4c 4f 4e 47 20 73 63 61 72 64 5f 63 6f 6e 6e 5f  LONG scard_conn_
7610: 72 65 74 3b 0a 0a 09 73 63 61 72 64 5f 63 6f 6e  ret;...scard_con
7620: 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65 63  n_ret = SCardRec
7630: 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63 73  onnect(slot->pcs
7640: 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53 48  c_card, SCARD_SH
7650: 41 52 45 5f 53 48 41 52 45 44 2c 20 64 65 66 61  ARE_SHARED, defa
7660: 75 6c 74 5f 70 72 6f 74 6f 63 6f 6c 2c 20 53 43  ult_protocol, SC
7670: 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44 2c 20  ARD_RESET_CARD, 
7680: 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f 63 6f  selected_protoco
7690: 6c 29 3b 0a 0a 09 69 66 20 28 73 63 61 72 64 5f  l);...if (scard_
76a0: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
76b0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
76c0: 43 48 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  CH) {...CACKEY_D
76d0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43 61  EBUG_PRINTF("SCa
76e0: 72 64 52 65 63 6f 6e 6e 65 63 74 28 29 20 72 65  rdReconnect() re
76f0: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50  turned SCARD_E_P
7700: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74  ROTO_MISMATCH, t
7710: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20  rying with just 
7720: 54 3d 30 22 29 0a 09 09 73 63 61 72 64 5f 63 6f  T=0")...scard_co
7730: 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64 52 65  nn_ret = SCardRe
7740: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
7750: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 53  sc_card, SCARD_S
7760: 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41  HARE_SHARED, SCA
7770: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20  RD_PROTOCOL_T0, 
7780: 53 43 41 52 44 5f 52 45 53 45 54 5f 43 41 52 44  SCARD_RESET_CARD
7790: 2c 20 73 65 6c 65 63 74 65 64 5f 70 72 6f 74 6f  , selected_proto
77a0: 63 6f 6c 29 3b 0a 0a 09 09 69 66 20 28 73 63 61  col);....if (sca
77b0: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53  rd_conn_ret == S
77c0: 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53  CARD_E_PROTO_MIS
77d0: 4d 41 54 43 48 29 20 7b 0a 09 09 09 43 41 43 4b  MATCH) {....CACK
77e0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
77f0: 22 53 43 61 72 64 52 65 63 6f 6e 6e 65 63 74 28  "SCardReconnect(
7800: 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52 44  ) returned SCARD
7810: 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54 43  _E_PROTO_MISMATC
7820: 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20 6a  H, trying with j
7830: 75 73 74 20 54 3d 31 22 29 0a 09 09 09 73 63 61  ust T=1")....sca
7840: 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43  rd_conn_ret = SC
7850: 61 72 64 52 65 63 6f 6e 6e 65 63 74 28 73 6c 6f  ardReconnect(slo
7860: 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43  t->pcsc_card, SC
7870: 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52 45 44  ARD_SHARE_SHARED
7880: 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
7890: 5f 54 31 2c 20 53 43 41 52 44 5f 52 45 53 45 54  _T1, SCARD_RESET
78a0: 5f 43 41 52 44 2c 20 73 65 6c 65 63 74 65 64 5f  _CARD, selected_
78b0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d 0a 09  protocol);...}..
78c0: 7d 0a 0a 09 72 65 74 75 72 6e 28 73 63 61 72 64  }...return(scard
78d0: 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 7d 0a 0a 2f  _conn_ret);.}../
78e0: 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a  *. * SYNPOSIS. *
78f0: 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20       cackey_ret 
7900: 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63  cackey_connect_c
7910: 61 72 64 28 73 74 72 75 63 74 20 63 61 63 6b 65  ard(struct cacke
7920: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20  y_slot *slot);. 
7930: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
7940: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f  *     cackey_slo
7950: 74 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20  t *slot. *      
7960: 20 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20     Slot to send 
7970: 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20  commands to. *. 
7980: 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
7990: 2a 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53  *     CACKEY_PCS
79a0: 43 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f  C_S_OK         O
79b0: 6e 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20  n success. *    
79c0: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47   CACKEY_PCSC_E_G
79d0: 45 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72  ENERIC    On err
79e0: 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  or. *. * NOTES. 
79f0: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
7a00: 2f 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f  /.static cackey_
7a10: 72 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65  ret cackey_conne
7a20: 63 74 5f 63 61 72 64 28 73 74 72 75 63 74 20 63  ct_card(struct c
7a30: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
7a40: 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72 65 74 20  ) {..cackey_ret 
7a50: 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
7a60: 3b 0a 09 44 57 4f 52 44 20 70 72 6f 74 6f 63 6f  ;..DWORD protoco
7a70: 6c 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f 63  l;..LONG scard_c
7a80: 6f 6e 6e 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45  onn_ret;...CACKE
7a90: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
7aa0: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
7ab0: 28 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b  (!slot) {...CACK
7ac0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
7ad0: 22 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70  "Invalid slot sp
7ae0: 65 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69  ecified, returni
7af0: 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b  ng in failure");
7b00: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
7b10: 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43  Y_PCSC_E_GENERIC
7b20: 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63 6f 6e  );..}...pcsc_con
7b30: 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63 6b 65  nect_ret = cacke
7b40: 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63 74 28 29  y_pcsc_connect()
7b50: 3b 0a 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e  ;..if (pcsc_conn
7b60: 65 63 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  ect_ret != CACKE
7b70: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
7b80: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
7b90: 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e  INTF("Connection
7ba0: 20 74 6f 20 50 43 2f 53 43 20 66 61 69 6c 65 64   to PC/SC failed
7bb0: 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66  , returning in f
7bc0: 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74  ailure");....ret
7bd0: 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
7be0: 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a  E_GENERIC);..}..
7bf0: 09 2f 2a 20 43 6f 6e 6e 65 63 74 20 74 6f 20 72  ./* Connect to r
7c00: 65 61 64 65 72 2c 20 69 66 20 6e 65 65 64 65 64  eader, if needed
7c10: 20 2a 2f 0a 09 69 66 20 28 21 73 6c 6f 74 2d 3e   */..if (!slot->
7c20: 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65 63  pcsc_card_connec
7c30: 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ted) {...CACKEY_
7c40: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 43  DEBUG_PRINTF("SC
7c50: 61 72 64 43 6f 6e 6e 65 63 74 28 25 73 29 20 63  ardConnect(%s) c
7c60: 61 6c 6c 65 64 22 2c 20 73 6c 6f 74 2d 3e 70 63  alled", slot->pc
7c70: 73 63 5f 72 65 61 64 65 72 29 3b 0a 09 09 73 63  sc_reader);...sc
7c80: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 20 53  ard_conn_ret = S
7c90: 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63 61 63  CardConnect(*cac
7ca0: 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c  key_pcsc_handle,
7cb0: 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64   slot->pcsc_read
7cc0: 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52 45 5f  er, SCARD_SHARE_
7cd0: 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f 50 52  SHARED, SCARD_PR
7ce0: 4f 54 4f 43 4f 4c 5f 54 30 20 7c 20 53 43 41 52  OTOCOL_T0 | SCAR
7cf0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26  D_PROTOCOL_T1, &
7d00: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7d10: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09   &protocol);....
7d20: 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72  if (scard_conn_r
7d30: 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50 52  et == SCARD_E_PR
7d40: 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b 0a  OTO_MISMATCH) {.
7d50: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
7d60: 50 52 49 4e 54 46 28 22 53 43 61 72 64 43 6f 6e  PRINTF("SCardCon
7d70: 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65 64 20  nect() returned 
7d80: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
7d90: 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67 20 77  SMATCH, trying w
7da0: 69 74 68 20 6a 75 73 74 20 54 3d 30 22 29 0a 09  ith just T=0")..
7db0: 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74  ..scard_conn_ret
7dc0: 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28   = SCardConnect(
7dd0: 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e  *cackey_pcsc_han
7de0: 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f  dle, slot->pcsc_
7df0: 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48  reader, SCARD_SH
7e00: 41 52 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52  ARE_SHARED, SCAR
7e10: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 2c 20 26  D_PROTOCOL_T0, &
7e20: 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c  slot->pcsc_card,
7e30: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 0a 09 09   &protocol);....
7e40: 09 69 66 20 28 73 63 61 72 64 5f 63 6f 6e 6e 5f  .if (scard_conn_
7e50: 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f 50  ret == SCARD_E_P
7e60: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 29 20 7b  ROTO_MISMATCH) {
7e70: 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
7e80: 47 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 43  G_PRINTF("SCardC
7e90: 6f 6e 6e 65 63 74 28 29 20 72 65 74 75 72 6e 65  onnect() returne
7ea0: 64 20 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f  d SCARD_E_PROTO_
7eb0: 4d 49 53 4d 41 54 43 48 2c 20 74 72 79 69 6e 67  MISMATCH, trying
7ec0: 20 77 69 74 68 20 6a 75 73 74 20 54 3d 31 22 29   with just T=1")
7ed0: 0a 09 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f  .....scard_conn_
7ee0: 72 65 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65  ret = SCardConne
7ef0: 63 74 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f  ct(*cackey_pcsc_
7f00: 68 61 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63  handle, slot->pc
7f10: 73 63 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44  sc_reader, SCARD
7f20: 5f 53 48 41 52 45 5f 53 48 41 52 45 44 2c 20 53  _SHARE_SHARED, S
7f30: 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31  CARD_PROTOCOL_T1
7f40: 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f 63 61  , &slot->pcsc_ca
7f50: 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  rd, &protocol);.
7f60: 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
7f70: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
7f80: 3d 20 53 43 41 52 44 5f 57 5f 55 4e 50 4f 57 45  = SCARD_W_UNPOWE
7f90: 52 45 44 5f 43 41 52 44 29 20 7b 0a 09 09 09 43  RED_CARD) {....C
7fa0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
7fb0: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
7fc0: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
7fd0: 44 5f 57 5f 55 4e 50 4f 57 45 52 45 44 5f 43 41  D_W_UNPOWERED_CA
7fe0: 52 44 2c 20 74 72 79 69 6e 67 20 74 6f 20 72 65  RD, trying to re
7ff0: 2d 63 6f 6e 6e 65 63 74 2e 2e 2e 22 29 3b 0a 0a  -connect...");..
8000: 09 09 09 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  ...scard_conn_re
8010: 74 20 3d 20 53 43 61 72 64 43 6f 6e 6e 65 63 74  t = SCardConnect
8020: 28 2a 63 61 63 6b 65 79 5f 70 63 73 63 5f 68 61  (*cackey_pcsc_ha
8030: 6e 64 6c 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63  ndle, slot->pcsc
8040: 5f 72 65 61 64 65 72 2c 20 53 43 41 52 44 5f 53  _reader, SCARD_S
8050: 48 41 52 45 5f 44 49 52 45 43 54 2c 20 53 43 41  HARE_DIRECT, SCA
8060: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
8070: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
8080: 54 31 2c 20 26 73 6c 6f 74 2d 3e 70 63 73 63 5f  T1, &slot->pcsc_
8090: 63 61 72 64 2c 20 26 70 72 6f 74 6f 63 6f 6c 29  card, &protocol)
80a0: 3b 0a 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f  ;.....if (scard_
80b0: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
80c0: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
80d0: 43 48 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59  CH) {.....CACKEY
80e0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
80f0: 43 61 72 64 43 6f 6e 6e 65 63 74 28 29 20 72 65  CardConnect() re
8100: 74 75 72 6e 65 64 20 53 43 41 52 44 5f 45 5f 50  turned SCARD_E_P
8110: 52 4f 54 4f 5f 4d 49 53 4d 41 54 43 48 2c 20 74  ROTO_MISMATCH, t
8120: 72 79 69 6e 67 20 77 69 74 68 20 6a 75 73 74 20  rying with just 
8130: 54 3d 30 22 29 0a 09 09 09 09 73 63 61 72 64 5f  T=0").....scard_
8140: 63 6f 6e 6e 5f 72 65 74 20 3d 20 53 43 61 72 64  conn_ret = SCard
8150: 43 6f 6e 6e 65 63 74 28 2a 63 61 63 6b 65 79 5f  Connect(*cackey_
8160: 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20 73 6c 6f  pcsc_handle, slo
8170: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 2c 20  t->pcsc_reader, 
8180: 53 43 41 52 44 5f 53 48 41 52 45 5f 53 48 41 52  SCARD_SHARE_SHAR
8190: 45 44 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43  ED, SCARD_PROTOC
81a0: 4f 4c 5f 54 30 2c 20 26 73 6c 6f 74 2d 3e 70 63  OL_T0, &slot->pc
81b0: 73 63 5f 63 61 72 64 2c 20 26 70 72 6f 74 6f 63  sc_card, &protoc
81c0: 6f 6c 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63  ol);......if (sc
81d0: 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  ard_conn_ret == 
81e0: 53 43 41 52 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49  SCARD_E_PROTO_MI
81f0: 53 4d 41 54 43 48 29 20 7b 0a 09 09 09 09 09 43  SMATCH) {......C
8200: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
8210: 54 46 28 22 53 43 61 72 64 43 6f 6e 6e 65 63 74  TF("SCardConnect
8220: 28 29 20 72 65 74 75 72 6e 65 64 20 53 43 41 52  () returned SCAR
8230: 44 5f 45 5f 50 52 4f 54 4f 5f 4d 49 53 4d 41 54  D_E_PROTO_MISMAT
8240: 43 48 2c 20 74 72 79 69 6e 67 20 77 69 74 68 20  CH, trying with 
8250: 6a 75 73 74 20 54 3d 31 22 29 0a 09 09 09 09 09  just T=1")......
8260: 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65 74 20 3d  scard_conn_ret =
8270: 20 53 43 61 72 64 43 6f 6e 6e 65 63 74 28 2a 63   SCardConnect(*c
8280: 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
8290: 65 2c 20 73 6c 6f 74 2d 3e 70 63 73 63 5f 72 65  e, slot->pcsc_re
82a0: 61 64 65 72 2c 20 53 43 41 52 44 5f 53 48 41 52  ader, SCARD_SHAR
82b0: 45 5f 53 48 41 52 45 44 2c 20 53 43 41 52 44 5f  E_SHARED, SCARD_
82c0: 50 52 4f 54 4f 43 4f 4c 5f 54 31 2c 20 26 73 6c  PROTOCOL_T1, &sl
82d0: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 26  ot->pcsc_card, &
82e0: 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 09 09 7d  protocol);.....}
82f0: 0a 09 09 09 7d 0a 0a 09 09 09 73 63 61 72 64 5f  ....}.....scard_
8300: 63 6f 6e 6e 5f 72 65 74 20 3d 20 63 61 63 6b 65  conn_ret = cacke
8310: 79 5f 72 65 63 6f 6e 6e 65 63 74 5f 63 61 72 64  y_reconnect_card
8320: 28 73 6c 6f 74 2c 20 70 72 6f 74 6f 63 6f 6c 2c  (slot, protocol,
8330: 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a 09 09 7d   &protocol);...}
8340: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 63 6f  ....if (scard_co
8350: 6e 6e 5f 72 65 74 20 21 3d 20 53 43 41 52 44 5f  nn_ret != SCARD_
8360: 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09 09  S_SUCCESS) {....
8370: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
8380: 4e 54 46 28 22 43 6f 6e 6e 65 63 74 69 6f 6e 20  NTF("Connection 
8390: 74 6f 20 63 61 72 64 20 66 61 69 6c 65 64 2c 20  to card failed, 
83a0: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
83b0: 6c 75 72 65 20 28 53 43 61 72 64 43 6f 6e 6e 65  lure (SCardConne
83c0: 63 74 28 29 20 3d 20 25 73 2f 25 6c 69 29 22 2c  ct() = %s/%li)",
83d0: 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55   CACKEY_DEBUG_FU
83e0: 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53  NC_SCARDERR_TO_S
83f0: 54 52 28 73 63 61 72 64 5f 63 6f 6e 6e 5f 72 65  TR(scard_conn_re
8400: 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63 61 72 64  t), (long) scard
8410: 5f 63 6f 6e 6e 5f 72 65 74 29 3b 0a 0a 09 09 09  _conn_ret);.....
8420: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
8430: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
8440: 09 7d 0a 0a 09 09 73 6c 6f 74 2d 3e 70 63 73 63  .}....slot->pcsc
8450: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
8460: 3d 20 31 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61  = 1;...slot->tra
8470: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d  nsaction_depth =
8480: 20 30 3b 0a 09 09 73 6c 6f 74 2d 3e 74 72 61 6e   0;...slot->tran
8490: 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f  saction_need_hw_
84a0: 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 73 6c 6f 74  lock = 0;...slot
84b0: 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72 6f  ->protocol = pro
84c0: 74 6f 63 6f 6c 3b 0a 09 7d 0a 0a 09 72 65 74 75  tocol;..}...retu
84d0: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
84e0: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
84f0: 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 63  YNPOSIS. *     c
8500: 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79  ackey_ret cackey
8510: 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69  _begin_transacti
8520: 6f 6e 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  on(struct cackey
8530: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 3b 0a 20 2a  _slot *slot);. *
8540: 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a  . * ARGUMENTS. *
8550: 20 20 20 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74       cackey_slot
8560: 20 2a 73 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20   *slot. *       
8570: 20 20 53 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63    Slot to send c
8580: 6f 6d 6d 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a  ommands to. *. *
8590: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
85a0: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
85b0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
85c0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
85d0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
85e0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
85f0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
8600: 20 20 20 20 20 54 68 65 20 74 72 61 6e 73 61 63       The transac
8610: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 74  tion should be t
8620: 65 72 6d 69 6e 61 74 65 64 20 75 73 69 6e 67 20  erminated using 
8630: 22 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  "cackey_end_tran
8640: 73 61 63 74 69 6f 6e 22 0a 20 2a 0a 20 2a 2f 0a  saction". *. */.
8650: 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65  static cackey_re
8660: 74 20 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74  t cackey_begin_t
8670: 72 61 6e 73 61 63 74 69 6f 6e 28 73 74 72 75 63  ransaction(struc
8680: 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73  t cackey_slot *s
8690: 6c 6f 74 29 20 7b 0a 09 63 61 63 6b 65 79 5f 72  lot) {..cackey_r
86a0: 65 74 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72  et cackey_conn_r
86b0: 65 74 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  et;..LONG scard_
86c0: 74 72 61 6e 73 5f 72 65 74 3b 0a 0a 09 43 41 43  trans_ret;...CAC
86d0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
86e0: 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 63  ("Called.");...c
86f0: 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74 20 3d  ackey_conn_ret =
8700: 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f   cackey_connect_
8710: 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 69 66 20  card(slot);..if 
8720: 28 63 61 63 6b 65 79 5f 63 6f 6e 6e 5f 72 65 74  (cackey_conn_ret
8730: 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
8740: 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  S_OK) {...CACKEY
8750: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
8760: 6e 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74  nable to connect
8770: 20 74 6f 20 63 61 72 64 2c 20 72 65 74 75 72 6e   to card, return
8780: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
8790: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
87a0: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
87b0: 3b 0a 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61  ;..}...slot->tra
87c0: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2b 2b  nsaction_depth++
87d0: 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72  ;...if (slot->tr
87e0: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20  ansaction_depth 
87f0: 3e 20 31 20 26 26 20 21 73 6c 6f 74 2d 3e 74 72  > 1 && !slot->tr
8800: 61 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68  ansaction_need_h
8810: 77 5f 6c 6f 63 6b 29 20 7b 0a 09 09 43 41 43 4b  w_lock) {...CACK
8820: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8830: 22 41 6c 72 65 61 64 79 20 69 6e 20 61 20 74 72  "Already in a tr
8840: 61 6e 73 61 63 74 69 6f 6e 2c 20 70 65 72 66 6f  ansaction, perfo
8850: 72 6d 69 6e 67 20 6e 6f 20 61 63 74 69 6f 6e 20  rming no action 
8860: 28 6e 65 77 20 64 65 70 74 68 20 3d 20 25 69 29  (new depth = %i)
8870: 22 2c 20 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63  ", slot->transac
8880: 74 69 6f 6e 5f 64 65 70 74 68 29 3b 0a 0a 09 09  tion_depth);....
8890: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
88a0: 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 73  SC_S_OK);..}...s
88b0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
88c0: 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
88d0: 30 3b 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73  0;...scard_trans
88e0: 5f 72 65 74 20 3d 20 53 43 61 72 64 42 65 67 69  _ret = SCardBegi
88f0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  nTransaction(slo
8900: 74 2d 3e 70 63 73 63 5f 63 61 72 64 29 3b 0a 09  t->pcsc_card);..
8910: 69 66 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f  if (scard_trans_
8920: 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
8930: 55 43 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b  UCCESS) {...CACK
8940: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
8950: 22 55 6e 61 62 6c 65 20 74 6f 20 62 65 67 69 6e  "Unable to begin
8960: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 72 65   transaction, re
8970: 74 75 72 6e 69 6e 67 20 69 6e 20 65 72 72 6f 72  turning in error
8980: 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
8990: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
89a0: 52 49 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  RIC);..}...CACKE
89b0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
89c0: 53 75 63 65 73 73 66 75 6c 6c 79 20 62 65 67 61  Sucessfully bega
89d0: 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  n transaction on
89e0: 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c 6f   slot (%s)", slo
89f0: 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29 3b  t->pcsc_reader);
8a00: 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
8a10: 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a  _PCSC_S_OK);.}..
8a20: 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20  /*. * SYNPOSIS. 
8a30: 2a 20 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74  *     cackey_ret
8a40: 20 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e   cackey_end_tran
8a50: 73 61 63 74 69 6f 6e 28 73 74 72 75 63 74 20 63  saction(struct c
8a60: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
8a70: 29 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  );. *. * ARGUMEN
8a80: 54 53 0a 20 2a 20 20 20 20 20 63 61 63 6b 65 79  TS. *     cackey
8a90: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
8aa0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
8ab0: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
8ac0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
8ad0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
8ae0: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
8af0: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
8b00: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
8b10: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
8b20: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
8b30: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  ES. *     This f
8b40: 75 6e 63 74 69 6f 6e 20 72 65 71 75 69 72 65 73  unction requires
8b50: 20 22 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74   "cackey_begin_t
8b60: 72 61 6e 73 61 63 74 69 6f 6e 22 20 74 6f 20 62  ransaction" to b
8b70: 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 0a 20  e called first. 
8b80: 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63  *. */.static cac
8b90: 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 65  key_ret cackey_e
8ba0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  nd_transaction(s
8bb0: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
8bc0: 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 4c 4f 4e 47  t *slot) {..LONG
8bd0: 20 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65 74   scard_trans_ret
8be0: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
8bf0: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
8c00: 22 29 3b 0a 0a 09 69 66 20 28 21 73 6c 6f 74 2d  ");...if (!slot-
8c10: 3e 70 63 73 63 5f 63 61 72 64 5f 63 6f 6e 6e 65  >pcsc_card_conne
8c20: 63 74 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  cted) {...CACKEY
8c30: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
8c40: 61 72 64 20 69 73 20 6e 6f 74 20 63 6f 6e 6e 65  ard is not conne
8c50: 63 74 65 64 2c 20 75 6e 61 62 6c 65 20 74 6f 20  cted, unable to 
8c60: 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  end transaction 
8c70: 6f 6e 20 63 61 72 64 22 29 3b 0a 0a 09 09 69 66  on card");....if
8c80: 20 28 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74   (slot->transact
8c90: 69 6f 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b  ion_depth > 0) {
8ca0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
8cb0: 5f 50 52 49 4e 54 46 28 22 44 65 63 72 65 61 73  _PRINTF("Decreas
8cc0: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
8cd0: 64 65 70 74 68 20 61 6e 64 20 61 73 6b 69 6e 67  depth and asking
8ce0: 20 66 6f 72 20 61 20 68 61 72 64 77 61 72 65 20   for a hardware 
8cf0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6e 65 78 74  lock on the next
8d00: 20 62 65 67 69 6e 20 74 72 61 6e 73 61 63 74 69   begin transacti
8d10: 6f 6e 20 28 63 75 72 72 65 6e 74 20 64 65 70 74  on (current dept
8d20: 68 20 3d 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e  h = %i)", slot->
8d30: 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
8d40: 68 29 3b 0a 0a 09 09 09 73 6c 6f 74 2d 3e 74 72  h);.....slot->tr
8d50: 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d  ansaction_depth-
8d60: 2d 3b 0a 0a 09 09 09 69 66 20 28 73 6c 6f 74 2d  -;.....if (slot-
8d70: 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
8d80: 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 73 6c  th > 0) {.....sl
8d90: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
8da0: 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20 31  need_hw_lock = 1
8db0: 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65  ;....}...}....re
8dc0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
8dd0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
8de0: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
8df0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 3d  saction_depth ==
8e00: 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
8e10: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54 65 72  EBUG_PRINTF("Ter
8e20: 6d 69 6e 61 74 69 6e 67 20 61 20 74 72 61 6e 73  minating a trans
8e30: 61 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  action that has 
8e40: 6e 6f 74 20 62 65 67 75 6e 21 22 29 3b 0a 0a 09  not begun!");...
8e50: 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
8e60: 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a  CSC_E_GENERIC);.
8e70: 09 7d 0a 0a 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  .}...slot->trans
8e80: 61 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a  action_depth--;.
8e90: 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 74 72 61 6e  ..if (slot->tran
8ea0: 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3e 20  saction_depth > 
8eb0: 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
8ec0: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 72 61 6e  BUG_PRINTF("Tran
8ed0: 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 69  sactions still i
8ee0: 6e 20 70 72 6f 67 72 65 73 73 2c 20 6e 6f 74 20  n progress, not 
8ef0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6f 6e 2d 63  terminating on-c
8f00: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
8f10: 28 63 75 72 72 65 6e 74 20 64 65 70 74 68 20 3d  (current depth =
8f20: 20 25 69 29 22 2c 20 73 6c 6f 74 2d 3e 74 72 61   %i)", slot->tra
8f30: 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74 68 29 3b  nsaction_depth);
8f40: 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
8f50: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d  Y_PCSC_S_OK);..}
8f60: 0a 0a 09 73 63 61 72 64 5f 74 72 61 6e 73 5f 72  ...scard_trans_r
8f70: 65 74 20 3d 20 53 43 61 72 64 45 6e 64 54 72 61  et = SCardEndTra
8f80: 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 2d 3e 70  nsaction(slot->p
8f90: 63 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f  csc_card, SCARD_
8fa0: 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 69 66  LEAVE_CARD);..if
8fb0: 20 28 73 63 61 72 64 5f 74 72 61 6e 73 5f 72 65   (scard_trans_re
8fc0: 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53 55 43  t != SCARD_S_SUC
8fd0: 43 45 53 53 29 20 7b 0a 09 09 43 41 43 4b 45 59  CESS) {...CACKEY
8fe0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55  _DEBUG_PRINTF("U
8ff0: 6e 61 62 6c 65 20 74 6f 20 65 6e 64 20 74 72 61  nable to end tra
9000: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
9010: 69 6e 67 20 69 6e 20 65 72 72 6f 72 22 29 3b 0a  ing in error");.
9020: 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
9030: 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
9040: 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
9050: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75 63 65  BUG_PRINTF("Suce
9060: 73 73 66 75 6c 6c 79 20 74 65 72 6d 69 6e 61 74  ssfully terminat
9070: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ed transaction o
9080: 6e 20 73 6c 6f 74 20 28 25 73 29 22 2c 20 73 6c  n slot (%s)", sl
9090: 6f 74 2d 3e 70 63 73 63 5f 72 65 61 64 65 72 29  ot->pcsc_reader)
90a0: 3b 0a 0a 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ;...return(CACKE
90b0: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 7d 0a  Y_PCSC_S_OK);.}.
90c0: 0a 2f 2a 20 41 50 44 55 20 52 65 6c 61 74 65 64  ./* APDU Related
90d0: 20 46 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 2f 2a   Functions */./*
90e0: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
90f0: 20 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63      cackey_ret c
9100: 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28  ackey_send_apdu(
9110: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
9120: 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e  ot *slot, unsign
9130: 65 64 20 63 68 61 72 20 63 6c 61 73 73 2c 20 75  ed char class, u
9140: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 73  nsigned char ins
9150: 74 72 75 63 74 69 6f 6e 2c 20 75 6e 73 69 67 6e  truction, unsign
9160: 65 64 20 63 68 61 72 20 70 31 2c 20 75 6e 73 69  ed char p1, unsi
9170: 67 6e 65 64 20 63 68 61 72 20 70 32 2c 20 75 6e  gned char p2, un
9180: 73 69 67 6e 65 64 20 63 68 61 72 20 6c 63 2c 20  signed char lc, 
9190: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
91a0: 61 74 61 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ata, unsigned ch
91b0: 61 72 20 6c 65 2c 20 75 69 6e 74 31 36 5f 74 20  ar le, uint16_t 
91c0: 2a 72 65 73 70 63 6f 64 65 2c 20 75 6e 73 69 67  *respcode, unsig
91d0: 6e 65 64 20 63 68 61 72 20 2a 72 65 73 70 64 61  ned char *respda
91e0: 74 61 2c 20 73 69 7a 65 5f 74 20 2a 72 65 73 70  ta, size_t *resp
91f0: 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 2a 0a 20 2a  data_len);. *. *
9200: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
9210: 20 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73    cackey_slot *s
9220: 6c 6f 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53  lot. *         S
9230: 6c 6f 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d  lot to send comm
9240: 61 6e 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20  ands to. *. *   
9250: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9260: 63 6c 61 73 73 0a 20 2a 20 20 20 20 20 20 20 20  class. *        
9270: 20 41 50 44 55 20 43 6c 61 73 73 20 28 47 53 43   APDU Class (GSC
9280: 49 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36  IS_CLASS_ISO7816
9290: 20 6f 72 20 47 53 43 49 53 5f 43 4c 41 53 53 5f   or GSCIS_CLASS_
92a0: 47 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 0a  GLOBAL_PLATFORM.
92b0: 20 2a 20 20 20 20 20 20 20 20 20 75 73 75 61 6c   *         usual
92c0: 6c 79 29 2c 20 28 43 4c 41 29 0a 20 2a 0a 20 2a  ly), (CLA). *. *
92d0: 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68       unsigned ch
92e0: 61 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 20  ar instruction. 
92f0: 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20 49  *         APDU I
9300: 6e 73 74 72 75 63 74 69 6f 6e 20 28 49 4e 53 29  nstruction (INS)
9310: 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67  . *. *     unsig
9320: 6e 65 64 20 63 68 61 72 20 70 31 0a 20 2a 20 20  ned char p1. *  
9330: 20 20 20 20 20 20 20 41 50 44 55 20 50 61 72 61         APDU Para
9340: 6d 65 74 65 72 20 31 20 28 50 31 29 0a 20 2a 0a  meter 1 (P1). *.
9350: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9360: 63 68 61 72 20 70 32 0a 20 2a 20 20 20 20 20 20  char p2. *      
9370: 20 20 20 41 50 44 55 20 50 61 72 61 6d 65 74 65     APDU Paramete
9380: 72 20 32 20 28 50 32 29 0a 20 2a 0a 20 2a 20 20  r 2 (P2). *. *  
9390: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
93a0: 20 6c 63 0a 20 2a 20 20 20 20 20 20 20 20 20 41   lc. *         A
93b0: 50 44 55 20 4c 65 6e 67 74 68 20 6f 66 20 43 6f  PDU Length of Co
93c0: 6e 74 65 6e 74 20 28 4c 63 29 20 2d 2d 20 74 68  ntent (Lc) -- th
93d0: 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68  is is the length
93e0: 20 6f 66 20 22 64 61 74 61 22 0a 20 2a 20 20 20   of "data". *   
93f0: 20 20 20 20 20 20 70 61 72 61 6d 65 74 65 72 2e        parameter.
9400: 20 20 49 66 20 22 64 61 74 61 22 20 69 73 20 73    If "data" is s
9410: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
9420: 2c 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  , this parameter
9430: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
9440: 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 2a 0a   be ignored.. *.
9450: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
9460: 63 68 61 72 20 2a 64 61 74 61 0a 20 2a 20 20 20  char *data. *   
9470: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f        Pointer to
9480: 20 62 75 66 66 65 72 20 74 6f 20 73 65 6e 64 2e   buffer to send.
9490: 20 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 22    It should be "
94a0: 4c 63 22 20 62 79 74 65 73 20 6c 6f 6e 67 2e 20  Lc" bytes long. 
94b0: 20 49 66 0a 20 2a 20 20 20 20 20 20 20 20 20 73   If. *         s
94c0: 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
94d0: 2c 20 22 4c 63 22 20 77 69 6c 6c 20 6e 6f 74 20  , "Lc" will not 
94e0: 62 65 20 73 65 6e 74 2c 20 61 6e 64 20 74 68 69  be sent, and thi
94f0: 73 20 62 75 66 66 65 72 20 77 69 6c 6c 20 62 65  s buffer will be
9500: 0a 20 2a 20 20 20 20 20 20 20 20 20 69 67 6e 6f  . *         igno
9510: 72 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75  red.. *. *     u
9520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6c 65 0a  nsigned char le.
9530: 20 2a 20 20 20 20 20 20 20 20 20 41 50 44 55 20   *         APDU 
9540: 4c 65 6e 67 74 68 20 6f 66 20 45 78 70 65 63 74  Length of Expect
9550: 61 74 69 6f 6e 20 28 4c 65 29 20 2d 2d 20 74 68  ation (Le) -- th
9560: 69 73 20 69 73 20 74 68 65 20 6c 65 6e 67 74 68  is is the length
9570: 20 6f 66 20 74 68 65 0a 20 2a 20 20 20 20 20 20   of the. *      
9580: 20 20 20 65 78 70 65 63 74 65 64 20 72 65 70 6c     expected repl
9590: 79 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73  y.  If this is s
95a0: 70 65 63 69 66 69 65 64 20 61 73 20 30 20 74 68  pecified as 0 th
95b0: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 0a 20  en it will not. 
95c0: 2a 20 20 20 20 20 20 20 20 20 62 65 20 73 65 6e  *         be sen
95d0: 74 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 75 69 6e  t.. *. *     uin
95e0: 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64 65 0a  t16_t *respcode.
95f0: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
9600: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74 6f 72   Pointer to stor
9610: 61 67 65 20 6f 66 20 41 50 44 55 20 72 65 73 70  age of APDU resp
9620: 6f 6e 73 65 20 63 6f 64 65 2e 20 20 49 66 20 74  onse code.  If t
9630: 68 69 73 20 69 73 0a 20 2a 20 20 20 20 20 20 20  his is. *       
9640: 20 20 73 70 65 63 69 66 69 65 64 20 61 73 20 4e    specified as N
9650: 55 4c 4c 2c 20 74 68 65 20 72 65 73 70 6f 6e 73  ULL, the respons
9660: 65 20 63 6f 64 65 20 77 69 6c 6c 20 62 65 20 64  e code will be d
9670: 69 73 63 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20  iscarded.. *. * 
9680: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9690: 72 20 2a 72 65 73 70 64 61 74 61 0a 20 2a 20 20  r *respdata. *  
96a0: 20 20 20 20 20 20 20 5b 4f 55 54 5d 20 50 6f 69         [OUT] Poi
96b0: 6e 74 65 72 20 74 6f 20 73 74 6f 72 61 67 65 20  nter to storage 
96c0: 6f 66 20 41 50 44 55 20 72 65 73 70 6f 6e 73 65  of APDU response
96d0: 20 64 61 74 61 2e 20 20 49 66 20 74 68 69 73 20   data.  If this 
96e0: 69 73 0a 20 2a 20 20 20 20 20 20 20 20 20 73 70  is. *         sp
96f0: 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c  ecified as NULL,
9700: 20 74 68 65 20 72 65 73 70 6f 6e 73 65 20 64 61   the response da
9710: 74 61 20 77 69 6c 6c 20 62 65 20 64 69 73 63 61  ta will be disca
9720: 72 64 65 64 2e 20 20 49 66 0a 20 2a 20 20 20 20  rded.  If. *    
9730: 20 20 20 20 20 74 68 65 20 22 72 65 73 70 64 61       the "respda
9740: 74 61 5f 6c 65 6e 22 20 70 61 72 61 6d 65 74 65  ta_len" paramete
9750: 72 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  r is specified a
9760: 73 20 4e 55 4c 4c 2c 20 74 68 69 73 20 62 75 66  s NULL, this buf
9770: 66 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 77  fer. *         w
9780: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
9790: 65 64 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  ed.. *. *     si
97a0: 7a 65 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c  ze_t *respdata_l
97b0: 65 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 49  en. *         [I
97c0: 4e 2c 20 4f 55 54 5d 20 50 6f 69 6e 74 65 72 20  N, OUT] Pointer 
97d0: 69 6e 69 74 69 61 6c 69 6e 67 20 63 6f 6e 74 61  initialing conta
97e0: 69 6e 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f  ining the size o
97f0: 66 20 74 68 65 20 22 72 65 73 70 64 61 74 61 22  f the "respdata"
9800: 0a 20 2a 20 20 20 20 20 20 20 20 20 62 75 66 66  . *         buff
9810: 65 72 2e 20 20 42 65 66 6f 72 65 20 72 65 74 75  er.  Before retu
9820: 72 6e 69 6e 67 2c 20 74 68 65 20 70 6f 69 6e 74  rning, the point
9830: 65 64 20 74 6f 20 76 61 6c 75 65 20 69 73 20 75  ed to value is u
9840: 70 64 61 74 65 64 20 74 6f 20 74 68 65 0a 20 2a  pdated to the. *
9850: 20 20 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20           number 
9860: 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
9870: 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20   to the buffer. 
9880: 20 49 66 20 74 68 69 73 20 69 73 20 73 70 65 63   If this is spec
9890: 69 66 69 65 64 20 61 73 0a 20 2a 20 20 20 20 20  ified as. *     
98a0: 20 20 20 20 4e 55 4c 4c 2c 20 69 74 20 77 69 6c      NULL, it wil
98b0: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
98c0: 2c 20 61 6e 64 20 22 72 65 73 70 64 61 74 61 22  , and "respdata"
98d0: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
98e0: 20 63 61 75 73 69 6e 67 0a 20 2a 20 20 20 20 20   causing. *     
98f0: 20 20 20 20 74 68 65 20 72 65 73 70 6f 6e 73 65      the response
9900: 20 64 61 74 61 20 74 6f 20 62 65 20 64 69 73 63   data to be disc
9910: 61 72 64 65 64 2e 0a 20 2a 0a 20 2a 20 52 45 54  arded.. *. * RET
9920: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
9930: 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
9940: 4b 20 20 20 20 20 20 20 20 20 20 20 4f 6e 20 73  K           On s
9950: 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20 43 41  uccess. *     CA
9960: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45  CKEY_PCSC_E_GENE
9970: 52 49 43 20 20 20 20 20 20 4f 6e 20 65 72 72 6f  RIC      On erro
9980: 72 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59 5f  r. *     CACKEY_
9990: 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45  PCSC_E_TOKENABSE
99a0: 4e 54 20 20 49 66 20 74 68 65 20 73 65 6e 64 69  NT  If the sendi
99b0: 6e 67 20 66 61 69 6c 65 64 20 62 65 63 61 75 73  ng failed becaus
99c0: 65 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 0a 20  e the token is. 
99d0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 61 62 73 65 6e 74 0a 20 2a 0a 20 2a 20 4e 4f   absent. *. * NO
9a00: 54 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20  TES. *     This 
9a10: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 63 6f  function will co
9a20: 6e 6e 65 63 74 20 74 6f 20 74 68 65 20 50 43 2f  nnect to the PC/
9a30: 53 43 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 4d 61  SC Connection Ma
9a40: 6e 61 67 65 72 20 76 69 61 0a 20 2a 20 20 20 20  nager via. *    
9a50: 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e   cackey_pcsc_con
9a60: 6e 65 63 74 28 29 20 69 66 20 6e 65 65 64 65 64  nect() if needed
9a70: 2e 0a 20 2a 0a 20 2a 20 20 20 20 20 49 74 20 77  .. *. *     It w
9a80: 69 6c 6c 20 63 6f 6e 6e 65 63 74 20 74 6f 20 74  ill connect to t
9a90: 68 65 20 63 61 72 64 20 69 6e 20 74 68 65 20 72  he card in the r
9aa0: 65 61 64 65 72 20 61 74 74 61 63 68 65 64 20 74  eader attached t
9ab0: 6f 20 74 68 65 20 73 6c 6f 74 0a 20 2a 20 20 20  o the slot. *   
9ac0: 20 20 73 70 65 63 69 66 69 65 64 2e 20 20 49 74    specified.  It
9ad0: 20 77 69 6c 6c 20 72 65 63 6f 6e 6e 65 63 74 20   will reconnect 
9ae0: 74 6f 20 74 68 65 20 63 61 72 64 20 69 66 20 74  to the card if t
9af0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a  he connection. *
9b00: 20 20 20 20 20 67 6f 65 73 20 61 77 61 79 2e 0a       goes away..
9b10: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61   *. */.static ca
9b20: 63 6b 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f  ckey_ret cackey_
9b30: 73 65 6e 64 5f 61 70 64 75 28 73 74 72 75 63 74  send_apdu(struct
9b40: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
9b50: 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ot, unsigned cha
9b60: 72 20 63 6c 61 73 73 2c 20 75 6e 73 69 67 6e 65  r class, unsigne
9b70: 64 20 63 68 61 72 20 69 6e 73 74 72 75 63 74 69  d char instructi
9b80: 6f 6e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  on, unsigned cha
9b90: 72 20 70 31 2c 20 75 6e 73 69 67 6e 65 64 20 63  r p1, unsigned c
9ba0: 68 61 72 20 70 32 2c 20 75 6e 73 69 67 6e 65 64  har p2, unsigned
9bb0: 20 69 6e 74 20 6c 63 2c 20 75 6e 73 69 67 6e 65   int lc, unsigne
9bc0: 64 20 63 68 61 72 20 2a 64 61 74 61 2c 20 75 6e  d char *data, un
9bd0: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 2c 20 75  signed int le, u
9be0: 69 6e 74 31 36 5f 74 20 2a 72 65 73 70 63 6f 64  int16_t *respcod
9bf0: 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e, unsigned char
9c00: 20 2a 72 65 73 70 64 61 74 61 2c 20 73 69 7a 65   *respdata, size
9c10: 5f 74 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  _t *respdata_len
9c20: 29 20 7b 0a 09 75 69 6e 74 38 5f 74 20 6d 61 6a  ) {..uint8_t maj
9c30: 6f 72 5f 72 63 2c 20 6d 69 6e 6f 72 5f 72 63 3b  or_rc, minor_rc;
9c40: 0a 09 73 69 7a 65 5f 74 20 62 79 74 65 73 5f 74  ..size_t bytes_t
9c50: 6f 5f 63 6f 70 79 2c 20 74 6d 70 5f 72 65 73 70  o_copy, tmp_resp
9c60: 64 61 74 61 5f 6c 65 6e 3b 0a 09 4c 50 43 53 43  data_len;..LPCSC
9c70: 41 52 44 5f 49 4f 5f 52 45 51 55 45 53 54 20 70  ARD_IO_REQUEST p
9c80: 69 6f 53 65 6e 64 50 63 69 3b 0a 09 44 57 4f 52  ioSendPci;..DWOR
9c90: 44 20 70 72 6f 74 6f 63 6f 6c 3b 0a 09 44 57 4f  D protocol;..DWO
9ca0: 52 44 20 78 6d 69 74 5f 6c 65 6e 2c 20 72 65 63  RD xmit_len, rec
9cb0: 76 5f 6c 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61  v_len;..LONG sca
9cc0: 72 64 5f 78 6d 69 74 5f 72 65 74 2c 20 73 63 61  rd_xmit_ret, sca
9cd0: 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b 0a 09  rd_reconn_ret;..
9ce0: 42 59 54 45 20 78 6d 69 74 5f 62 75 66 5b 31 30  BYTE xmit_buf[10
9cf0: 32 34 5d 2c 20 72 65 63 76 5f 62 75 66 5b 31 30  24], recv_buf[10
9d00: 32 34 5d 3b 0a 09 69 6e 74 20 70 63 73 63 5f 63  24];..int pcsc_c
9d10: 6f 6e 6e 65 63 74 5f 72 65 74 2c 20 70 63 73 63  onnect_ret, pcsc
9d20: 5f 67 65 74 72 65 73 70 5f 72 65 74 3b 0a 09 69  _getresp_ret;..i
9d30: 6e 74 20 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59  nt idx;...CACKEY
9d40: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
9d50: 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
9d60: 21 73 6c 6f 74 29 20 7b 0a 09 09 43 41 43 4b 45  !slot) {...CACKE
9d70: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
9d80: 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 73 70 65  Invalid slot spe
9d90: 63 69 66 69 65 64 2e 22 29 3b 0a 0a 09 09 72 65  cified.");....re
9da0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
9db0: 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a  _E_GENERIC);..}.
9dc0: 0a 09 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72  ..pcsc_connect_r
9dd0: 65 74 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e  et = cackey_conn
9de0: 65 63 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a  ect_card(slot);.
9df0: 09 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63  .if (pcsc_connec
9e00: 74 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  t_ret != CACKEY_
9e10: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
9e20: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
9e30: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
9e40: 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
9e50: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
9e60: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
9e70: 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47  (CACKEY_PCSC_E_G
9e80: 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09 2f 2a  ENERIC);..}.../*
9e90: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 69 63 68   Determine which
9ea0: 20 70 72 6f 74 6f 63 6f 6c 20 74 6f 20 73 65 6e   protocol to sen
9eb0: 64 20 75 73 69 6e 67 20 2a 2f 0a 09 73 77 69 74  d using */..swit
9ec0: 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ch (slot->protoc
9ed0: 6f 6c 29 20 7b 0a 09 09 63 61 73 65 20 53 43 41  ol) {...case SCA
9ee0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 3a 0a  RD_PROTOCOL_T0:.
9ef0: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9f00: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c  PRINTF("Protocol
9f10: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61   to send datagra
9f20: 6d 20 69 73 20 54 3d 30 22 29 3b 0a 0a 09 09 09  m is T=0");.....
9f30: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
9f40: 52 44 5f 50 43 49 5f 54 30 3b 0a 0a 09 09 09 62  RD_PCI_T0;.....b
9f50: 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 53 43 41  reak;...case SCA
9f60: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a  RD_PROTOCOL_T1:.
9f70: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
9f80: 50 52 49 4e 54 46 28 22 50 72 6f 74 6f 63 6f 6c  PRINTF("Protocol
9f90: 20 74 6f 20 73 65 6e 64 20 64 61 74 61 67 72 61   to send datagra
9fa0: 6d 20 69 73 20 54 3d 31 22 29 3b 0a 0a 09 09 09  m is T=1");.....
9fb0: 70 69 6f 53 65 6e 64 50 63 69 20 3d 20 53 43 41  pioSendPci = SCA
9fc0: 52 44 5f 50 43 49 5f 54 31 3b 0a 0a 09 09 09 62  RD_PCI_T1;.....b
9fd0: 72 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a  reak;...default:
9fe0: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
9ff0: 5f 50 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64  _PRINTF("Invalid
a000: 20 70 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c   protocol found,
a010: 20 61 62 6f 72 74 69 6e 67 2e 22 29 3b 0a 0a 09   aborting.");...
a020: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
a030: 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b  PCSC_E_GENERIC);
a040: 0a 09 7d 0a 0a 09 2f 2a 20 54 72 61 6e 73 6d 69  ..}.../* Transmi
a050: 74 20 2a 2f 0a 09 78 6d 69 74 5f 6c 65 6e 20 3d  t */..xmit_len =
a060: 20 30 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d   0;..xmit_buf[xm
a070: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 63 6c 61 73  it_len++] = clas
a080: 73 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  s;..xmit_buf[xmi
a090: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 69 6e 73 74 72  t_len++] = instr
a0a0: 75 63 74 69 6f 6e 3b 0a 09 78 6d 69 74 5f 62 75  uction;..xmit_bu
a0b0: 66 5b 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20  f[xmit_len++] = 
a0c0: 70 31 3b 0a 09 78 6d 69 74 5f 62 75 66 5b 78 6d  p1;..xmit_buf[xm
a0d0: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 70 32 3b 0a  it_len++] = p2;.
a0e0: 09 69 66 20 28 64 61 74 61 29 20 7b 0a 09 09 69  .if (data) {...i
a0f0: 66 20 28 6c 63 20 3e 20 32 35 35 29 20 7b 0a 09  f (lc > 255) {..
a100: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a110: 52 49 4e 54 46 28 22 43 41 55 54 49 4f 4e 21 20  RINTF("CAUTION! 
a120: 20 55 73 69 6e 67 20 61 6e 20 4c 63 20 67 72 65   Using an Lc gre
a130: 61 74 65 72 20 74 68 61 6e 20 32 35 35 20 69 73  ater than 255 is
a140: 20 75 6e 74 65 73 74 65 64 2e 20 20 4c 63 20 3d   untested.  Lc =
a150: 20 25 75 22 2c 20 6c 63 29 3b 0a 0a 09 09 09 78   %u", lc);.....x
a160: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a170: 2b 2b 5d 20 3d 20 30 78 38 32 3b 20 2f 2a 20 58  ++] = 0x82; /* X
a180: 58 58 20 55 4e 54 45 53 54 45 44 20 2a 2f 0a 09  XX UNTESTED */..
a190: 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f  ..xmit_buf[xmit_
a1a0: 6c 65 6e 2b 2b 5d 20 3d 20 28 6c 63 20 26 20 30  len++] = (lc & 0
a1b0: 78 66 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09  xff00) >> 8;....
a1c0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a1d0: 6e 2b 2b 5d 20 3d 20 6c 63 20 26 20 30 78 66 66  n++] = lc & 0xff
a1e0: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ;...} else {....
a1f0: 78 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65  xmit_buf[xmit_le
a200: 6e 2b 2b 5d 20 3d 20 6c 63 3b 0a 09 09 7d 0a 09  n++] = lc;...}..
a210: 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69  .for (idx = 0; i
a220: 64 78 20 3c 20 6c 63 3b 20 69 64 78 2b 2b 29 20  dx < lc; idx++) 
a230: 7b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  {....xmit_buf[xm
a240: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 64 61 74 61  it_len++] = data
a250: 5b 69 64 78 5d 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  [idx];...}..}...
a260: 69 66 20 28 6c 65 20 21 3d 20 30 78 30 30 29 20  if (le != 0x00) 
a270: 7b 0a 09 09 69 66 20 28 6c 65 20 3e 20 32 35 36  {...if (le > 256
a280: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
a290: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 41 55 54  BUG_PRINTF("CAUT
a2a0: 49 4f 4e 21 20 20 55 73 69 6e 67 20 61 6e 20 4c  ION!  Using an L
a2b0: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 32  e greater than 2
a2c0: 35 36 20 69 73 20 75 6e 74 65 73 74 65 64 2e 20  56 is untested. 
a2d0: 20 4c 65 20 3d 20 25 75 22 2c 20 6c 65 29 3b 0a   Le = %u", le);.
a2e0: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a2f0: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 38 32 3b  t_len++] = 0x82;
a300: 20 2f 2a 20 58 58 58 20 55 4e 54 45 53 54 45 44   /* XXX UNTESTED
a310: 20 2a 2f 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b   */....xmit_buf[
a320: 78 6d 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 28 6c  xmit_len++] = (l
a330: 65 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  e & 0xff00) >> 8
a340: 3b 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d  ;....xmit_buf[xm
a350: 69 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 6c 65 20 26  it_len++] = le &
a360: 20 30 78 66 66 3b 0a 09 09 7d 20 65 6c 73 65 20   0xff;...} else 
a370: 69 66 20 28 6c 65 20 3d 3d 20 32 35 36 29 20 7b  if (le == 256) {
a380: 0a 09 09 09 78 6d 69 74 5f 62 75 66 5b 78 6d 69  ....xmit_buf[xmi
a390: 74 5f 6c 65 6e 2b 2b 5d 20 3d 20 30 78 30 30 3b  t_len++] = 0x00;
a3a0: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 78  ...} else {....x
a3b0: 6d 69 74 5f 62 75 66 5b 78 6d 69 74 5f 6c 65 6e  mit_buf[xmit_len
a3c0: 2b 2b 5d 20 3d 20 6c 65 3b 0a 09 09 7d 0a 09 7d  ++] = le;...}..}
a3d0: 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72  .../* Begin Smar
a3e0: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
a3f0: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 62 65 67  n */..cackey_beg
a400: 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73  in_transaction(s
a410: 6c 6f 74 29 3b 0a 0a 09 69 66 20 28 63 6c 61 73  lot);...if (clas
a420: 73 20 3d 3d 20 47 53 43 49 53 5f 43 4c 41 53 53  s == GSCIS_CLASS
a430: 5f 49 53 4f 37 38 31 36 20 26 26 20 69 6e 73 74  _ISO7816 && inst
a440: 72 75 63 74 69 6f 6e 20 3d 3d 20 47 53 43 49 53  ruction == GSCIS
a450: 5f 49 4e 53 54 52 5f 56 45 52 49 46 59 20 26 26  _INSTR_VERIFY &&
a460: 20 70 31 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09   p1 == 0x00) {..
a470: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
a480: 49 4e 54 46 28 22 53 65 6e 64 69 6e 67 20 41 50  INTF("Sending AP
a490: 44 55 3a 20 3c 3c 63 65 6e 73 6f 72 65 64 3e 3e  DU: <<censored>>
a4a0: 22 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ");..} else {...
a4b0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
a4c0: 4e 54 42 55 46 28 22 53 65 6e 64 69 6e 67 20 41  NTBUF("Sending A
a4d0: 50 44 55 3a 22 2c 20 78 6d 69 74 5f 62 75 66 2c  PDU:", xmit_buf,
a4e0: 20 78 6d 69 74 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a   xmit_len);..}..
a4f0: 09 72 65 63 76 5f 6c 65 6e 20 3d 20 73 69 7a 65  .recv_len = size
a500: 6f 66 28 72 65 63 76 5f 62 75 66 29 3b 0a 09 73  of(recv_buf);..s
a510: 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20 3d 20  card_xmit_ret = 
a520: 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 73 6c  SCardTransmit(sl
a530: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 70  ot->pcsc_card, p
a540: 69 6f 53 65 6e 64 50 63 69 2c 20 78 6d 69 74 5f  ioSendPci, xmit_
a550: 62 75 66 2c 20 78 6d 69 74 5f 6c 65 6e 2c 20 4e  buf, xmit_len, N
a560: 55 4c 4c 2c 20 72 65 63 76 5f 62 75 66 2c 20 26  ULL, recv_buf, &
a570: 72 65 63 76 5f 6c 65 6e 29 3b 0a 0a 09 69 66 20  recv_len);...if 
a580: 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74 20  (scard_xmit_ret 
a590: 3d 3d 20 53 43 41 52 44 5f 45 5f 4e 4f 54 5f 54  == SCARD_E_NOT_T
a5a0: 52 41 4e 53 41 43 54 45 44 29 20 7b 0a 09 09 43  RANSACTED) {...C
a5b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
a5c0: 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
a5d0: 6e 64 20 41 50 44 55 20 74 6f 20 63 61 72 64 20  nd APDU to card 
a5e0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 28 29  (SCardTransmit()
a5f0: 20 3d 20 25 73 2f 25 6c 78 29 2c 20 77 69 6c 6c   = %s/%lx), will
a600: 20 61 73 6b 20 63 61 6c 6c 69 6e 67 20 66 75 6e   ask calling fun
a610: 63 74 69 6f 6e 20 74 6f 20 72 65 74 72 79 20 28  ction to retry (
a620: 6e 6f 74 20 72 65 73 65 74 74 69 6e 67 20 63 61  not resetting ca
a630: 72 64 29 2e 2e 2e 22 2c 20 43 41 43 4b 45 59 5f  rd)...", CACKEY_
a640: 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41 52 44  DEBUG_FUNC_SCARD
a650: 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61 72 64  ERR_TO_STR(scard
a660: 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 75 6e 73  _xmit_ret), (uns
a670: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 63 61 72  igned long) scar
a680: 64 5f 78 6d 69 74 5f 72 65 74 29 3b 0a 0a 09 09  d_xmit_ret);....
a690: 2f 2a 20 42 65 67 69 6e 20 53 6d 61 72 74 63 61  /* Begin Smartca
a6a0: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
a6b0: 2f 0a 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74  /...cackey_end_t
a6c0: 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29  ransaction(slot)
a6d0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
a6e0: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
a6f0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 63 61 72 64  ;..}...if (scard
a700: 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43 41  _xmit_ret != SCA
a710: 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a  RD_S_SUCCESS) {.
a720: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
a730: 52 49 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f  RINTF("Failed to
a740: 20 73 65 6e 64 20 41 50 44 55 20 74 6f 20 63 61   send APDU to ca
a750: 72 64 20 28 53 43 61 72 64 54 72 61 6e 73 6d 69  rd (SCardTransmi
a760: 74 28 29 20 3d 20 25 73 2f 25 6c 78 29 22 2c 20  t() = %s/%lx)", 
a770: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
a780: 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
a790: 52 28 73 63 61 72 64 5f 78 6d 69 74 5f 72 65 74  R(scard_xmit_ret
a7a0: 29 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ), (unsigned lon
a7b0: 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f 72 65  g) scard_xmit_re
a7c0: 74 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  t);....CACKEY_DE
a7d0: 42 55 47 5f 50 52 49 4e 54 46 28 22 4d 61 72 6b  BUG_PRINTF("Mark
a7e0: 69 6e 67 20 73 6c 6f 74 20 61 73 20 68 61 76 69  ing slot as havi
a7f0: 6e 67 20 62 65 65 6e 20 72 65 73 65 74 22 29 3b  ng been reset");
a800: 0a 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f 73  ...cackey_mark_s
a810: 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29 3b  lot_reset(slot);
a820: 0a 0a 09 09 69 66 20 28 73 63 61 72 64 5f 78 6d  ....if (scard_xm
a830: 69 74 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f  it_ret == SCARD_
a840: 57 5f 52 45 53 45 54 5f 43 41 52 44 29 20 7b 0a  W_RESET_CARD) {.
a850: 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
a860: 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 72 65  PRINTF("Reset re
a870: 71 75 69 72 65 64 2c 20 70 6c 65 61 73 65 20 68  quired, please h
a880: 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a 09 09 09 73 63  old...");.....sc
a890: 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d  ard_reconn_ret =
a8a0: 20 63 61 63 6b 65 79 5f 72 65 63 6f 6e 6e 65 63   cackey_reconnec
a8b0: 74 5f 63 61 72 64 28 73 6c 6f 74 2c 20 53 43 41  t_card(slot, SCA
a8c0: 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 30 20 7c  RD_PROTOCOL_T0 |
a8d0: 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f   SCARD_PROTOCOL_
a8e0: 54 31 2c 20 26 70 72 6f 74 6f 63 6f 6c 29 3b 0a  T1, &protocol);.
a8f0: 0a 09 09 09 69 66 20 28 73 63 61 72 64 5f 72 65  ....if (scard_re
a900: 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20 53 43 41 52  conn_ret == SCAR
a910: 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09  D_S_SUCCESS) {..
a920: 09 09 09 2f 2a 20 55 70 64 61 74 65 20 70 72 6f  .../* Update pro
a930: 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09 09 73 6c 6f  tocol */.....slo
a940: 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20 3d 20 70 72  t->protocol = pr
a950: 6f 74 6f 63 6f 6c 3b 0a 09 09 09 09 73 77 69 74  otocol;.....swit
a960: 63 68 20 28 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63  ch (slot->protoc
a970: 6f 6c 29 20 7b 0a 09 09 09 09 09 63 61 73 65 20  ol) {......case 
a980: 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54  SCARD_PROTOCOL_T
a990: 30 3a 0a 09 09 09 09 09 09 70 69 6f 53 65 6e 64  0:.......pioSend
a9a0: 50 63 69 20 3d 20 53 43 41 52 44 5f 50 43 49 5f  Pci = SCARD_PCI_
a9b0: 54 30 3b 0a 0a 09 09 09 09 09 09 62 72 65 61 6b  T0;........break
a9c0: 3b 0a 09 09 09 09 09 63 61 73 65 20 53 43 41 52  ;......case SCAR
a9d0: 44 5f 50 52 4f 54 4f 43 4f 4c 5f 54 31 3a 0a 09  D_PROTOCOL_T1:..
a9e0: 09 09 09 09 09 70 69 6f 53 65 6e 64 50 63 69 20  .....pioSendPci 
a9f0: 3d 20 53 43 41 52 44 5f 50 43 49 5f 54 31 3b 0a  = SCARD_PCI_T1;.
aa00: 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
aa10: 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09  ...default:.....
aa20: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
aa30: 52 49 4e 54 46 28 22 49 6e 76 61 6c 69 64 20 70  RINTF("Invalid p
aa40: 72 6f 74 6f 63 6f 6c 20 66 6f 75 6e 64 2c 20 62  rotocol found, b
aa50: 75 74 20 74 6f 6f 20 6c 61 74 65 20 74 6f 20 64  ut too late to d
aa60: 6f 20 61 6e 79 74 68 69 6e 67 20 61 62 6f 75 74  o anything about
aa70: 20 69 74 20 6e 6f 77 20 2d 2d 20 74 72 79 69 6e   it now -- tryin
aa80: 67 20 61 6e 79 77 61 79 2e 22 29 3b 0a 0a 09 09  g anyway.");....
aa90: 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
aaa0: 0a 0a 09 09 09 09 2f 2a 20 52 65 2d 65 73 74 61  ....../* Re-esta
aab0: 62 6c 69 73 68 20 74 72 61 6e 73 61 63 74 69 6f  blish transactio
aac0: 6e 2c 20 69 66 20 69 74 20 77 61 73 20 70 72 65  n, if it was pre
aad0: 73 65 6e 74 20 2a 2f 0a 09 09 09 09 69 66 20 28  sent */.....if (
aae0: 73 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f  slot->transactio
aaf0: 6e 5f 64 65 70 74 68 20 3e 20 30 29 20 7b 0a 09  n_depth > 0) {..
ab00: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
ab10: 63 74 69 6f 6e 5f 64 65 70 74 68 2d 2d 3b 0a 09  ction_depth--;..
ab20: 09 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73 61  ....slot->transa
ab30: 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77 5f 6c 6f  ction_need_hw_lo
ab40: 63 6b 20 3d 20 31 3b 0a 09 09 09 09 09 63 61 63  ck = 1;......cac
ab50: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
ab60: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 09 09  ction(slot);....
ab70: 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  .}......CACKEY_D
ab80: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
ab90: 65 74 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  et successful, r
aba0: 65 74 72 61 6e 73 6d 69 74 74 69 6e 67 22 29 3b  etransmitting");
abb0: 0a 0a 09 09 09 09 72 65 63 76 5f 6c 65 6e 20 3d  ......recv_len =
abc0: 20 73 69 7a 65 6f 66 28 72 65 63 76 5f 62 75 66   sizeof(recv_buf
abd0: 29 3b 0a 09 09 09 09 73 63 61 72 64 5f 78 6d 69  );.....scard_xmi
abe0: 74 5f 72 65 74 20 3d 20 53 43 61 72 64 54 72 61  t_ret = SCardTra
abf0: 6e 73 6d 69 74 28 73 6c 6f 74 2d 3e 70 63 73 63  nsmit(slot->pcsc
ac00: 5f 63 61 72 64 2c 20 70 69 6f 53 65 6e 64 50 63  _card, pioSendPc
ac10: 69 2c 20 78 6d 69 74 5f 62 75 66 2c 20 78 6d 69  i, xmit_buf, xmi
ac20: 74 5f 6c 65 6e 2c 20 4e 55 4c 4c 2c 20 72 65 63  t_len, NULL, rec
ac30: 76 5f 62 75 66 2c 20 26 72 65 63 76 5f 6c 65 6e  v_buf, &recv_len
ac40: 29 3b 0a 0a 09 09 09 09 69 66 20 28 73 63 61 72  );......if (scar
ac50: 64 5f 78 6d 69 74 5f 72 65 74 20 21 3d 20 53 43  d_xmit_ret != SC
ac60: 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29 20 7b  ARD_S_SUCCESS) {
ac70: 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
ac80: 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 72 61  UG_PRINTF("Retra
ac90: 6e 73 6d 69 74 20 66 61 69 6c 65 64 2c 20 72 65  nsmit failed, re
aca0: 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
acb0: 72 65 20 61 66 74 65 72 20 64 69 73 63 6f 6e 6e  re after disconn
acc0: 65 63 74 69 6e 67 20 74 68 65 20 63 61 72 64 20  ecting the card 
acd0: 28 53 43 61 72 64 54 72 61 6e 73 6d 69 74 20 3d  (SCardTransmit =
ace0: 20 25 73 2f 25 6c 69 29 22 2c 20 43 41 43 4b 45   %s/%li)", CACKE
acf0: 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53 43 41  Y_DEBUG_FUNC_SCA
ad00: 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73 63 61  RDERR_TO_STR(sca
ad10: 72 64 5f 78 6d 69 74 5f 72 65 74 29 2c 20 28 6c  rd_xmit_ret), (l
ad20: 6f 6e 67 29 20 73 63 61 72 64 5f 78 6d 69 74 5f  ong) scard_xmit_
ad30: 72 65 74 29 3b 0a 0a 09 09 09 09 09 53 43 61 72  ret);.......SCar
ad40: 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c 6f 74  dDisconnect(slot
ad50: 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53 43 41  ->pcsc_card, SCA
ad60: 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29 3b 0a  RD_LEAVE_CARD);.
ad70: 09 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63 5f  .....slot->pcsc_
ad80: 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d  card_connected =
ad90: 20 30 3b 0a 0a 09 09 09 09 09 2f 2a 20 45 6e 64   0;......./* End
ada0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
adb0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 09 73  action */......s
adc0: 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
add0: 5f 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09  _depth = 1;.....
ade0: 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
adf0: 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
ae00: 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b  .....return(CACK
ae10: 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
ae20: 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09 09  BSENT);.....}...
ae30: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43 41  .} else {.....CA
ae40: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
ae50: 46 28 22 44 69 73 63 6f 6e 6e 65 63 74 69 6e 67  F("Disconnecting
ae60: 20 63 61 72 64 22 29 3b 0a 0a 09 09 09 09 53 43   card");......SC
ae70: 61 72 64 44 69 73 63 6f 6e 6e 65 63 74 28 73 6c  ardDisconnect(sl
ae80: 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 53  ot->pcsc_card, S
ae90: 43 41 52 44 5f 4c 45 41 56 45 5f 43 41 52 44 29  CARD_LEAVE_CARD)
aea0: 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e 70 63 73 63  ;.....slot->pcsc
aeb0: 5f 63 61 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20  _card_connected 
aec0: 3d 20 30 3b 0a 0a 09 09 09 09 2f 2a 20 45 6e 64  = 0;....../* End
aed0: 20 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73   Smartcard Trans
aee0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 09 09 73 6c  action */.....sl
aef0: 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f  ot->transaction_
af00: 64 65 70 74 68 20 3d 20 31 3b 0a 09 09 09 09 63  depth = 1;.....c
af10: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
af20: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
af30: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
af40: 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
af50: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 09   in failure");..
af60: 09 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
af70: 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53  _PCSC_E_TOKENABS
af80: 45 4e 54 29 3b 0a 09 09 09 7d 0a 09 09 7d 20 65  ENT);....}...} e
af90: 6c 73 65 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  lse {....CACKEY_
afa0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 44 69  DEBUG_PRINTF("Di
afb0: 73 63 6f 6e 6e 65 63 74 69 6e 67 20 63 61 72 64  sconnecting card
afc0: 22 29 3b 0a 0a 09 09 09 53 43 61 72 64 44 69 73  ");.....SCardDis
afd0: 63 6f 6e 6e 65 63 74 28 73 6c 6f 74 2d 3e 70 63  connect(slot->pc
afe0: 73 63 5f 63 61 72 64 2c 20 53 43 41 52 44 5f 4c  sc_card, SCARD_L
aff0: 45 41 56 45 5f 43 41 52 44 29 3b 0a 09 09 09 73  EAVE_CARD);....s
b000: 6c 6f 74 2d 3e 70 63 73 63 5f 63 61 72 64 5f 63  lot->pcsc_card_c
b010: 6f 6e 6e 65 63 74 65 64 20 3d 20 30 3b 0a 0a 09  onnected = 0;...
b020: 09 09 2f 2a 20 45 6e 64 20 53 6d 61 72 74 63 61  ../* End Smartca
b030: 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20 2a  rd Transaction *
b040: 2f 0a 09 09 09 73 6c 6f 74 2d 3e 74 72 61 6e 73  /....slot->trans
b050: 61 63 74 69 6f 6e 5f 64 65 70 74 68 20 3d 20 31  action_depth = 1
b060: 3b 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64 5f  ;....cackey_end_
b070: 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74  transaction(slot
b080: 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  );.....CACKEY_DE
b090: 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
b0a0: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b0b0: 22 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 43 41  ");....return(CA
b0c0: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
b0d0: 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d  NABSENT);...}..}
b0e0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
b0f0: 50 52 49 4e 54 42 55 46 28 22 52 65 74 75 72 6e  PRINTBUF("Return
b100: 65 64 20 56 61 6c 75 65 3a 22 2c 20 72 65 63 76  ed Value:", recv
b110: 5f 62 75 66 2c 20 72 65 63 76 5f 6c 65 6e 29 3b  _buf, recv_len);
b120: 0a 0a 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20  ...if (recv_len 
b130: 3c 20 32 29 20 7b 0a 09 09 2f 2a 20 4d 69 6e 69  < 2) {.../* Mini
b140: 6d 61 6c 20 72 65 73 70 6f 6e 73 65 20 6c 65 6e  mal response len
b150: 67 74 68 20 69 73 20 32 20 62 79 74 65 73 2c 20  gth is 2 bytes, 
b160: 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69  returning in fai
b170: 6c 75 72 65 20 2a 2f 0a 09 09 43 41 43 4b 45 59  lure */...CACKEY
b180: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
b190: 65 73 70 6f 6e 73 65 20 74 6f 6f 20 73 6d 61 6c  esponse too smal
b1a0: 6c 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20  l, returning in 
b1b0: 66 61 69 6c 75 72 65 20 28 72 65 63 76 5f 6c 65  failure (recv_le
b1c0: 6e 20 3d 20 25 6c 75 29 22 2c 20 28 75 6e 73 69  n = %lu)", (unsi
b1d0: 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76 5f  gned long) recv_
b1e0: 6c 65 6e 29 3b 0a 0a 09 09 2f 2a 20 45 6e 64 20  len);..../* End 
b1f0: 53 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61  Smartcard Transa
b200: 63 74 69 6f 6e 20 2a 2f 0a 09 09 63 61 63 6b 65  ction */...cacke
b210: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
b220: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 72 65 74 75  n(slot);....retu
b230: 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 45  rn(CACKEY_PCSC_E
b240: 5f 47 45 4e 45 52 49 43 29 3b 0a 09 7d 0a 0a 09  _GENERIC);..}...
b250: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 72 65 73  /* Determine res
b260: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 09 6d 61 6a  ult code */..maj
b270: 6f 72 5f 72 63 20 3d 20 72 65 63 76 5f 62 75 66  or_rc = recv_buf
b280: 5b 72 65 63 76 5f 6c 65 6e 20 2d 20 32 5d 3b 0a  [recv_len - 2];.
b290: 09 6d 69 6e 6f 72 5f 72 63 20 3d 20 72 65 63 76  .minor_rc = recv
b2a0: 5f 62 75 66 5b 72 65 63 76 5f 6c 65 6e 20 2d 20  _buf[recv_len - 
b2b0: 31 5d 3b 0a 09 69 66 20 28 72 65 73 70 63 6f 64  1];..if (respcod
b2c0: 65 29 20 7b 0a 09 09 2a 72 65 73 70 63 6f 64 65  e) {...*respcode
b2d0: 20 3d 20 28 6d 61 6a 6f 72 5f 72 63 20 3c 3c 20   = (major_rc << 
b2e0: 38 29 20 7c 20 6d 69 6e 6f 72 5f 72 63 3b 0a 09  8) | minor_rc;..
b2f0: 7d 0a 0a 09 2f 2a 20 41 64 6a 75 73 74 20 6d 65  }.../* Adjust me
b300: 73 73 61 67 65 20 62 75 66 66 65 72 20 2a 2f 0a  ssage buffer */.
b310: 09 72 65 63 76 5f 6c 65 6e 20 2d 3d 20 32 3b 0a  .recv_len -= 2;.
b320: 0a 09 2f 2a 20 41 64 64 20 62 79 74 65 73 20 74  ../* Add bytes t
b330: 6f 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  o return value *
b340: 2f 0a 09 74 6d 70 5f 72 65 73 70 64 61 74 61 5f  /..tmp_respdata_
b350: 6c 65 6e 20 3d 20 30 3b 0a 09 69 66 20 28 72 65  len = 0;..if (re
b360: 73 70 64 61 74 61 20 26 26 20 72 65 73 70 64 61  spdata && respda
b370: 74 61 5f 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 5f  ta_len) {...tmp_
b380: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 2a  respdata_len = *
b390: 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a 0a 09  respdata_len;...
b3a0: 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
b3b0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 3b 0a   *respdata_len;.
b3c0: 0a 09 09 69 66 20 28 72 65 63 76 5f 6c 65 6e 20  ...if (recv_len 
b3d0: 3c 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29  < bytes_to_copy)
b3e0: 20 7b 0a 09 09 09 62 79 74 65 73 5f 74 6f 5f 63   {....bytes_to_c
b3f0: 6f 70 79 20 3d 20 72 65 63 76 5f 6c 65 6e 3b 0a  opy = recv_len;.
b400: 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
b410: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 6f 70 79  BUG_PRINTF("Copy
b420: 69 6e 67 20 25 6c 75 20 62 79 74 65 73 20 74 6f  ing %lu bytes to
b430: 20 74 68 65 20 62 75 66 66 65 72 20 28 72 65 63   the buffer (rec
b440: 76 27 64 20 25 6c 75 20 62 79 74 65 73 2c 20 62  v'd %lu bytes, b
b450: 75 74 20 6f 6e 6c 79 20 25 6c 75 20 62 79 74 65  ut only %lu byte
b460: 73 20 6c 65 66 74 20 69 6e 20 6f 75 72 20 62 75  s left in our bu
b470: 66 66 65 72 29 22 2c 20 28 75 6e 73 69 67 6e 65  ffer)", (unsigne
b480: 64 20 6c 6f 6e 67 29 20 62 79 74 65 73 5f 74 6f  d long) bytes_to
b490: 5f 63 6f 70 79 2c 20 28 75 6e 73 69 67 6e 65 64  _copy, (unsigned
b4a0: 20 6c 6f 6e 67 29 20 72 65 63 76 5f 6c 65 6e 2c   long) recv_len,
b4b0: 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
b4c0: 20 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b   *respdata_len);
b4d0: 0a 0a 09 09 6d 65 6d 63 70 79 28 72 65 73 70 64  ....memcpy(respd
b4e0: 61 74 61 2c 20 72 65 63 76 5f 62 75 66 2c 20 62  ata, recv_buf, b
b4f0: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 3b 0a 09  ytes_to_copy);..
b500: 09 72 65 73 70 64 61 74 61 20 2b 3d 20 62 79 74  .respdata += byt
b510: 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 0a 09 09 2a  es_to_copy;....*
b520: 72 65 73 70 64 61 74 61 5f 6c 65 6e 20 3d 20 62  respdata_len = b
b530: 79 74 65 73 5f 74 6f 5f 63 6f 70 79 3b 0a 09 09  ytes_to_copy;...
b540: 74 6d 70 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e  tmp_respdata_len
b550: 20 2d 3d 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70   -= bytes_to_cop
b560: 79 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69  y;..} else {...i
b570: 66 20 28 72 65 63 76 5f 6c 65 6e 20 21 3d 20 30  f (recv_len != 0
b580: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
b590: 42 55 47 5f 50 52 49 4e 54 46 28 22 54 68 72 6f  BUG_PRINTF("Thro
b5a0: 77 69 6e 67 20 61 77 61 79 20 25 6c 75 20 62 79  wing away %lu by
b5b0: 74 65 73 2c 20 6e 6f 77 68 65 72 65 20 74 6f 20  tes, nowhere to 
b5c0: 70 75 74 20 74 68 65 6d 21 22 2c 20 28 75 6e 73  put them!", (uns
b5d0: 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 63 76  igned long) recv
b5e0: 5f 6c 65 6e 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  _len);...}..}...
b5f0: 69 66 20 28 6d 61 6a 6f 72 5f 72 63 20 3d 3d 20  if (major_rc == 
b600: 30 78 36 31 29 20 7b 0a 09 09 2f 2a 20 57 65 20  0x61) {.../* We 
b610: 6e 65 65 64 20 74 6f 20 52 45 41 44 20 2a 2f 0a  need to READ */.
b620: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b630: 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65  RINTF("Buffer re
b640: 61 64 20 72 65 71 75 69 72 65 64 22 29 3b 0a 0a  ad required");..
b650: 09 09 69 66 20 28 6d 69 6e 6f 72 5f 72 63 20 3d  ..if (minor_rc =
b660: 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 6d 69 6e  = 0x00) {....min
b670: 6f 72 5f 72 63 20 3d 20 43 41 43 4b 45 59 5f 41  or_rc = CACKEY_A
b680: 50 44 55 5f 4d 54 55 3b 0a 09 09 7d 0a 0a 09 09  PDU_MTU;...}....
b690: 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65 74  pcsc_getresp_ret
b6a0: 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61   = cackey_send_a
b6b0: 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f  pdu(slot, GSCIS_
b6c0: 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47  CLASS_ISO7816, G
b6d0: 53 43 49 53 5f 49 4e 53 54 52 5f 47 45 54 5f 52  SCIS_INSTR_GET_R
b6e0: 45 53 50 4f 4e 53 45 2c 20 30 78 30 30 2c 20 30  ESPONSE, 0x00, 0
b6f0: 78 30 30 2c 20 30 2c 20 4e 55 4c 4c 2c 20 6d 69  x00, 0, NULL, mi
b700: 6e 6f 72 5f 72 63 2c 20 72 65 73 70 63 6f 64 65  nor_rc, respcode
b710: 2c 20 72 65 73 70 64 61 74 61 2c 20 26 74 6d 70  , respdata, &tmp
b720: 5f 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 3b 0a  _respdata_len);.
b730: 0a 09 09 69 66 20 28 70 63 73 63 5f 67 65 74 72  ...if (pcsc_getr
b740: 65 73 70 5f 72 65 74 20 21 3d 20 43 41 43 4b 45  esp_ret != CACKE
b750: 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09  Y_PCSC_S_OK) {..
b760: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
b770: 52 49 4e 54 46 28 22 42 75 66 66 65 72 20 72 65  RINTF("Buffer re
b780: 61 64 20 66 61 69 6c 65 64 21 20 20 52 65 74 75  ad failed!  Retu
b790: 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
b7a0: 22 29 3b 0a 0a 09 09 09 2f 2a 20 45 6e 64 20 53  ");...../* End S
b7b0: 6d 61 72 74 63 61 72 64 20 54 72 61 6e 73 61 63  martcard Transac
b7c0: 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b 65  tion */....cacke
b7d0: 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
b7e0: 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09 09 69 66 20  n(slot);.....if 
b7f0: 28 70 63 73 63 5f 67 65 74 72 65 73 70 5f 72 65  (pcsc_getresp_re
b800: 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
b810: 5f 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 09  _E_RETRY) {.....
b820: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
b830: 53 43 5f 45 5f 52 45 54 52 59 29 3b 0a 09 09 09  SC_E_RETRY);....
b840: 7d 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41 43  }.....return(CAC
b850: 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52  KEY_PCSC_E_GENER
b860: 49 43 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  IC);...}....if (
b870: 72 65 73 70 64 61 74 61 5f 6c 65 6e 29 20 7b 0a  respdata_len) {.
b880: 09 09 09 2a 72 65 73 70 64 61 74 61 5f 6c 65 6e  ...*respdata_len
b890: 20 2b 3d 20 74 6d 70 5f 72 65 73 70 64 61 74 61   += tmp_respdata
b8a0: 5f 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20  _len;...}..../* 
b8b0: 45 6e 64 20 53 6d 61 72 74 63 61 72 64 20 54 72  End Smartcard Tr
b8c0: 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 09 09 63  ansaction */...c
b8d0: 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e 73 61  ackey_end_transa
b8e0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a 09 09  ction(slot);....
b8f0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b900: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
b910: 6e 20 73 75 63 63 65 73 73 20 28 62 75 66 66 65  n success (buffe
b920: 72 20 72 65 61 64 20 63 6f 6d 70 6c 65 74 65 29  r read complete)
b930: 22 29 3b 0a 09 09 72 65 74 75 72 6e 28 43 41 43  ");...return(CAC
b940: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a  KEY_PCSC_S_OK);.
b950: 09 7d 0a 0a 09 2f 2a 20 45 6e 64 20 53 6d 61 72  .}.../* End Smar
b960: 74 63 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f  tcard Transactio
b970: 6e 20 2a 2f 0a 09 63 61 63 6b 65 79 5f 65 6e 64  n */..cackey_end
b980: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
b990: 74 29 3b 0a 0a 09 69 66 20 28 6d 61 6a 6f 72 5f  t);...if (major_
b9a0: 72 63 20 3d 3d 20 30 78 39 30 29 20 7b 0a 09 09  rc == 0x90) {...
b9b0: 2f 2a 20 53 75 63 63 65 73 73 20 2a 2f 0a 09 09  /* Success */...
b9c0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
b9d0: 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 69  NTF("Returning i
b9e0: 6e 20 73 75 63 63 65 73 73 20 28 6d 61 6a 6f 72  n success (major
b9f0: 5f 72 63 20 3d 20 30 78 39 30 29 22 29 3b 0a 0a  _rc = 0x90)");..
ba00: 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f  ..return(CACKEY_
ba10: 50 43 53 43 5f 53 5f 4f 4b 29 3b 0a 09 7d 0a 0a  PCSC_S_OK);..}..
ba20: 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
ba30: 52 49 4e 54 46 28 22 41 50 44 55 20 52 65 74 75  RINTF("APDU Retu
ba40: 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 2c 20 72  rned an error, r
ba50: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
ba60: 75 72 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ure");...return(
ba70: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
ba80: 4e 45 52 49 43 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  NERIC);.}../*. *
ba90: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
baa0: 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f   ssize_t cackey_
bab0: 67 65 74 5f 64 61 74 61 28 73 74 72 75 63 74 20  get_data(struct 
bac0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
bad0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
bae0: 20 2a 62 75 66 66 65 72 2c 20 73 69 7a 65 5f 74   *buffer, size_t
baf0: 20 63 6f 75 6e 74 2c 20 75 6e 73 69 67 6e 65 64   count, unsigned
bb00: 20 63 68 61 72 20 6f 69 64 5b 33 5d 29 3b 0a 20   char oid[3]);. 
bb10: 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20  *. * ARGUMENTS. 
bb20: 2a 20 20 20 20 20 73 74 72 75 63 74 20 63 61 63  *     struct cac
bb30: 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20  key_slot *slot. 
bb40: 2a 20 20 20 20 20 20 20 20 20 53 6c 6f 74 20 74  *         Slot t
bb50: 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20  o send commands 
bb60: 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73  to. *. *     uns
bb70: 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66  igned char *buff
bb80: 65 72 0a 20 2a 20 20 20 20 20 20 20 20 20 5b 4f  er. *         [O
bb90: 55 54 5d 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a  UT] Buffer. *. *
bba0: 20 20 20 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e       size_t coun
bbb0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 4e 75 6d  t. *         Num
bbc0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
bbd0: 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 0a  attempt to read.
bbe0: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
bbf0: 65 64 20 63 68 61 72 20 6f 69 64 5b 33 5d 0a 20  ed char oid[3]. 
bc00: 2a 20 20 20 20 20 20 20 20 20 33 2d 62 79 74 65  *         3-byte
bc10: 20 4f 49 44 20 74 6f 20 72 65 61 64 0a 20 2a 0a   OID to read. *.
bc20: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
bc30: 55 45 0a 20 2a 20 20 20 20 20 54 68 69 73 20 66  UE. *     This f
bc40: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
bc50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
bc60: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
bc70: 64 2c 20 6f 72 20 2d 31 20 6f 6e 20 65 72 72 6f  d, or -1 on erro
bc80: 72 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20  r.. *. * NOTES. 
bc90: 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a  *     None. *. *
bca0: 2f 0a 73 74 61 74 69 63 20 73 73 69 7a 65 5f 74  /.static ssize_t
bcb0: 20 63 61 63 6b 65 79 5f 67 65 74 5f 64 61 74 61   cackey_get_data
bcc0: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
bcd0: 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67  lot *slot, unsig
bce0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72  ned char *buffer
bcf0: 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20  , size_t count, 
bd00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6f 69  unsigned char oi
bd10: 64 5b 33 5d 29 20 7b 0a 09 75 6e 73 69 67 6e 65  d[3]) {..unsigne
bd20: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 5f 70  d char *buffer_p
bd30: 3b 0a 09 73 69 7a 65 5f 74 20 69 6e 69 74 5f 63  ;..size_t init_c
bd40: 6f 75 6e 74 3b 0a 0a 09 73 69 7a 65 5f 74 20 6f  ount;...size_t o
bd50: 66 66 73 65 74 20 3d 20 30 2c 20 73 69 7a 65 3b  ffset = 0, size;
bd60: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
bd70: 63 6d 64 5b 5d 20 3d 20 7b 30 78 35 43 2c 20 30  cmd[] = {0x5C, 0
bd80: 78 30 33 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x03, 0x00, 0x00,
bd90: 20 30 78 30 30 7d 3b 0a 09 75 69 6e 74 31 36 5f   0x00};..uint16_
bda0: 74 20 72 65 73 70 63 6f 64 65 3b 0a 09 69 6e 74  t respcode;..int
bdb0: 20 73 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20   send_ret;..int 
bdc0: 69 64 78 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  idx;...CACKEY_DE
bdd0: 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
bde0: 65 64 2e 22 29 3b 0a 0a 09 69 6e 69 74 5f 63 6f  ed.");...init_co
bdf0: 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09 63  unt = count;...c
be00: 6d 64 5b 32 5d 20 3d 20 6f 69 64 5b 30 5d 3b 0a  md[2] = oid[0];.
be10: 09 63 6d 64 5b 33 5d 20 3d 20 6f 69 64 5b 31 5d  .cmd[3] = oid[1]
be20: 3b 0a 09 63 6d 64 5b 34 5d 20 3d 20 6f 69 64 5b  ;..cmd[4] = oid[
be30: 32 5d 3b 0a 0a 09 2f 2a 20 32 35 36 20 74 6f 20  2];.../* 256 to 
be40: 69 6e 64 69 63 61 74 65 20 74 68 65 20 6c 61 72  indicate the lar
be50: 67 65 73 74 20 6d 65 73 73 61 67 65 20 73 69 7a  gest message siz
be60: 65 20 2d 2d 20 6e 6f 74 20 63 6c 65 61 72 20 69  e -- not clear i
be70: 66 20 74 68 69 73 20 77 69 6c 6c 20 77 6f 72 6b  f this will work
be80: 20 77 69 74 68 20 61 6c 6c 20 6d 65 73 73 61 67   with all messag
be90: 65 73 20 2a 2f 0a 09 73 65 6e 64 5f 72 65 74 20  es */..send_ret 
bea0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
beb0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
bec0: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 4e 49  LASS_ISO7816, NI
bed0: 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 49 4e 53  STSP800_73_3_INS
bee0: 54 52 5f 47 45 54 5f 44 41 54 41 2c 20 30 78 33  TR_GET_DATA, 0x3
bef0: 46 2c 20 30 78 46 46 2c 20 73 69 7a 65 6f 66 28  F, 0xFF, sizeof(
bf00: 63 6d 64 29 2c 20 63 6d 64 2c 20 32 35 36 2c 20  cmd), cmd, 256, 
bf10: 26 72 65 73 70 63 6f 64 65 2c 20 62 75 66 66 65  &respcode, buffe
bf20: 72 2c 20 26 63 6f 75 6e 74 29 3b 0a 0a 09 69 66  r, &count);...if
bf30: 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41   (send_ret == CA
bf40: 43 4b 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52  CKEY_PCSC_E_RETR
bf50: 59 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  Y) {...CACKEY_DE
bf60: 42 55 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55  BUG_PRINTF("ADPU
bf70: 20 53 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c   Sending failed,
bf80: 20 72 65 74 72 79 69 6e 67 20 72 65 61 64 20 62   retrying read b
bf90: 75 66 66 65 72 22 29 3b 0a 0a 09 09 72 65 74 75  uffer");....retu
bfa0: 72 6e 28 63 61 63 6b 65 79 5f 67 65 74 5f 64 61  rn(cackey_get_da
bfb0: 74 61 28 73 6c 6f 74 2c 20 62 75 66 66 65 72 2c  ta(slot, buffer,
bfc0: 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 6f 69 64   init_count, oid
bfd0: 29 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 65 6e  ));..}...if (sen
bfe0: 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f  d_ret != CACKEY_
bff0: 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43  PCSC_S_OK) {...C
c000: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
c010: 54 46 28 22 63 61 63 6b 65 79 5f 73 65 6e 64 5f  TF("cackey_send_
c020: 61 70 64 75 28 29 20 66 61 69 6c 65 64 2c 20 72  apdu() failed, r
c030: 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c  eturning in fail
c040: 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ure");....return
c050: 28 2d 31 29 3b 0a 09 7d 0a 0a 09 6f 66 66 73 65  (-1);..}...offse
c060: 74 20 2b 3d 20 63 6f 75 6e 74 3b 0a 0a 23 69 66  t += count;..#if
c070: 64 65 66 20 43 41 43 4b 45 59 5f 50 41 52 41 4e  def CACKEY_PARAN
c080: 4f 49 44 0a 23 20 20 69 66 64 65 66 20 5f 50 4f  OID.#  ifdef _PO
c090: 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 0a 09 69  SIX_SSIZE_MAX..i
c0a0: 66 20 28 6f 66 66 73 65 74 20 3e 20 5f 50 4f 53  f (offset > _POS
c0b0: 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b 0a  IX_SSIZE_MAX) {.
c0c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
c0d0: 52 49 4e 54 46 28 22 4f 66 66 73 65 74 20 65 78  RINTF("Offset ex
c0e0: 63 65 65 64 73 20 6d 61 78 69 6d 75 6d 20 76 61  ceeds maximum va
c0f0: 6c 75 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  lue, returning i
c100: 6e 20 66 61 69 6c 75 72 65 2e 20 28 6d 61 78 20  n failure. (max 
c110: 3d 20 25 6c 69 2c 20 6f 66 66 73 65 74 20 3d 20  = %li, offset = 
c120: 25 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50  %lu)", (long) _P
c130: 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20  OSIX_SSIZE_MAX, 
c140: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
c150: 6f 66 66 73 65 74 29 3b 0a 0a 09 09 72 65 74 75  offset);....retu
c160: 72 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e  rn(-1);..}.#  en
c170: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 09 69 66 20  dif.#endif...if 
c180: 28 6f 66 66 73 65 74 20 3c 20 32 29 20 7b 0a 09  (offset < 2) {..
c190: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c1a0: 49 4e 54 46 28 22 41 50 44 55 20 47 45 54 20 44  INTF("APDU GET D
c1b0: 41 54 41 20 72 65 74 75 72 6e 65 64 20 25 6c 75  ATA returned %lu
c1c0: 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 69 73   bytes, which is
c1d0: 20 74 6f 6f 20 73 68 6f 72 74 20 66 6f 72 20 61   too short for a
c1e0: 20 42 45 52 2d 54 4c 56 20 72 65 73 70 6f 6e 73   BER-TLV respons
c1f0: 65 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  e", (unsigned lo
c200: 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a 09 09  ng) offset);....
c210: 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a  return(-1);..}..
c220: 09 62 75 66 66 65 72 5f 70 20 3d 20 62 75 66 66  .buffer_p = buff
c230: 65 72 3b 0a 09 69 66 20 28 2a 62 75 66 66 65 72  er;..if (*buffer
c240: 5f 70 20 21 3d 20 30 78 35 33 29 20 7b 0a 09 09  _p != 0x53) {...
c250: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c260: 4e 54 46 28 22 41 50 44 55 20 47 45 54 20 44 41  NTF("APDU GET DA
c270: 54 41 20 64 69 64 20 6e 6f 74 20 72 65 74 75 72  TA did not retur
c280: 6e 20 61 20 42 45 52 2d 54 4c 56 20 77 69 74 68  n a BER-TLV with
c290: 20 74 61 67 20 35 33 2e 20 20 54 61 67 20 3d 20   tag 53.  Tag = 
c2a0: 25 30 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64  %02x", (unsigned
c2b0: 20 69 6e 74 29 20 2a 62 75 66 66 65 72 5f 70 29   int) *buffer_p)
c2c0: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  ;....return(-1);
c2d0: 0a 09 7d 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b  ..}..buffer_p++;
c2e0: 0a 0a 09 69 66 20 28 28 2a 62 75 66 66 65 72 5f  ...if ((*buffer_
c2f0: 70 20 26 20 30 78 38 30 29 20 3d 3d 20 30 78 38  p & 0x80) == 0x8
c300: 30 29 20 7b 0a 09 09 73 69 7a 65 20 3d 20 30 3b  0) {...size = 0;
c310: 0a 09 09 69 64 78 20 3d 20 28 2a 62 75 66 66 65  ...idx = (*buffe
c320: 72 5f 70 20 26 20 30 78 37 66 29 3b 0a 0a 09 09  r_p & 0x7f);....
c330: 69 66 20 28 28 28 62 75 66 66 65 72 5f 70 20 2d  if (((buffer_p -
c340: 20 62 75 66 66 65 72 29 20 2b 20 69 64 78 29 20   buffer) + idx) 
c350: 3e 3d 20 6f 66 66 73 65 74 29 20 7b 0a 09 09 09  >= offset) {....
c360: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
c370: 4e 54 46 28 22 4d 61 6c 66 6f 72 6d 65 64 20 42  NTF("Malformed B
c380: 45 52 20 76 61 6c 75 65 20 2d 2d 20 6e 6f 74 20  ER value -- not 
c390: 65 6e 6f 75 67 68 20 62 79 74 65 73 20 61 76 61  enough bytes ava
c3a0: 69 6c 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6c  ilable to read l
c3b0: 65 6e 67 74 68 22 29 3b 0a 0a 09 09 09 72 65 74  ength");.....ret
c3c0: 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09  urn(-1);...}....
c3d0: 66 6f 72 20 28 3b 20 69 64 78 20 3e 20 30 3b 20  for (; idx > 0; 
c3e0: 69 64 78 2d 2d 29 20 7b 0a 09 09 09 62 75 66 66  idx--) {....buff
c3f0: 65 72 5f 70 2b 2b 3b 0a 09 09 09 73 69 7a 65 20  er_p++;....size 
c400: 3c 3c 3d 20 38 3b 0a 09 09 09 73 69 7a 65 20 7c  <<= 8;....size |
c410: 3d 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09 09 7d  = *buffer_p;...}
c420: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 73 69 7a  ..} else {...siz
c430: 65 20 3d 20 2a 62 75 66 66 65 72 5f 70 3b 0a 09  e = *buffer_p;..
c440: 7d 0a 09 62 75 66 66 65 72 5f 70 2b 2b 3b 0a 0a  }..buffer_p++;..
c450: 09 69 66 20 28 28 28 62 75 66 66 65 72 5f 70 20  .if (((buffer_p 
c460: 2d 20 62 75 66 66 65 72 29 20 2b 20 73 69 7a 65  - buffer) + size
c470: 29 20 21 3d 20 6f 66 66 73 65 74 29 20 7b 0a 09  ) != offset) {..
c480: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
c490: 49 4e 54 46 28 22 45 6e 74 69 72 65 20 62 75 66  INTF("Entire buf
c4a0: 66 65 72 20 69 73 20 6e 6f 74 20 63 6f 6e 73 75  fer is not consu
c4b0: 6d 65 64 21 22 29 3b 0a 0a 09 09 69 66 20 28 28  med!");....if ((
c4c0: 28 62 75 66 66 65 72 5f 70 20 2d 20 62 75 66 66  (buffer_p - buff
c4d0: 65 72 29 20 2b 20 73 69 7a 65 29 20 3e 20 6f 66  er) + size) > of
c4e0: 66 73 65 74 29 20 7b 0a 09 09 09 43 41 43 4b 45  fset) {....CACKE
c4f0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
c500: 45 6e 63 6f 64 65 64 20 73 69 7a 65 20 69 73 20  Encoded size is 
c510: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
c520: 20 61 6d 6f 75 6e 74 20 6f 66 20 64 61 74 61 20   amount of data 
c530: 72 65 61 64 2c 20 64 72 6f 70 70 69 6e 67 22 29  read, dropping")
c540: 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29  ;.....return(-1)
c550: 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 6d 65 6d 6d 6f  ;...}..}...memmo
c560: 76 65 28 62 75 66 66 65 72 2c 20 62 75 66 66 65  ve(buffer, buffe
c570: 72 5f 70 2c 20 73 69 7a 65 29 3b 0a 0a 09 43 41  r_p, size);...CA
c580: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
c590: 42 55 46 28 22 47 45 54 20 44 41 54 41 20 72 65  BUF("GET DATA re
c5a0: 73 75 6c 74 22 2c 20 62 75 66 66 65 72 2c 20 73  sult", buffer, s
c5b0: 69 7a 65 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  ize);...CACKEY_D
c5c0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
c5d0: 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73  urning in succes
c5e0: 73 2c 20 72 65 61 64 20 25 6c 75 20 62 79 74 65  s, read %lu byte
c5f0: 73 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  s", (unsigned lo
c600: 6e 67 29 20 73 69 7a 65 29 3b 0a 0a 09 72 65 74  ng) size);...ret
c610: 75 72 6e 28 73 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  urn(size);.}../*
c620: 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
c630: 20 20 20 20 73 73 69 7a 65 5f 74 20 63 61 63 6b      ssize_t cack
c640: 65 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73  ey_read_buffer(s
c650: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f  truct cackey_slo
c660: 74 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65  t *slot, unsigne
c670: 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20  d char *buffer, 
c680: 73 69 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e  size_t count, un
c690: 73 69 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72  signed char t_or
c6a0: 5f 76 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69  _v, size_t initi
c6b0: 61 6c 5f 6f 66 66 73 65 74 29 3b 0a 20 2a 0a 20  al_offset);. *. 
c6c0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
c6d0: 20 20 20 73 74 72 75 63 74 20 63 61 63 6b 65 79     struct cackey
c6e0: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 0a 20 2a 20 20  _slot *slot. *  
c6f0: 20 20 20 20 20 20 20 53 6c 6f 74 20 74 6f 20 73         Slot to s
c700: 65 6e 64 20 63 6f 6d 6d 61 6e 64 73 20 74 6f 0a  end commands to.
c710: 20 2a 0a 20 2a 20 20 20 20 20 75 6e 73 69 67 6e   *. *     unsign
c720: 65 64 20 63 68 61 72 20 2a 62 75 66 66 65 72 0a  ed char *buffer.
c730: 20 2a 20 20 20 20 20 20 20 20 20 5b 4f 55 54 5d   *         [OUT]
c740: 20 42 75 66 66 65 72 0a 20 2a 0a 20 2a 20 20 20   Buffer. *. *   
c750: 20 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74 0a 20    size_t count. 
c760: 2a 20 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72  *         Number
c770: 20 6f 66 20 62 79 74 65 73 20 74 6f 20 61 74 74   of bytes to att
c780: 65 6d 70 74 20 74 6f 20 72 65 61 64 0a 20 2a 0a  empt to read. *.
c790: 20 2a 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20   *     unsigned 
c7a0: 63 68 61 72 20 74 5f 6f 72 5f 76 0a 20 2a 20 20  char t_or_v. *  
c7b0: 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 74 68         Select th
c7c0: 65 20 54 2d 62 75 66 66 65 72 20 28 30 31 29 20  e T-buffer (01) 
c7d0: 6f 72 20 56 2d 62 75 66 66 65 72 20 28 30 32 29  or V-buffer (02)
c7e0: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 2e 20 20   to read from.  
c7f0: 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69 7a 65 5f  . *. *     size_
c800: 74 20 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65 74  t initial_offset
c810: 0a 20 2a 20 20 20 20 20 20 20 20 20 53 70 65 63  . *         Spec
c820: 69 66 79 20 74 68 65 20 6f 66 66 73 65 74 20 74  ify the offset t
c830: 6f 20 62 65 67 69 6e 20 74 68 65 20 72 65 61 64  o begin the read
c840: 20 66 72 6f 6d 0a 20 2a 0a 20 2a 0a 20 2a 20 52   from. *. *. * R
c850: 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20  ETURN VALUE. *  
c860: 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e     This function
c870: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
c880: 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
c890: 75 61 6c 6c 79 20 72 65 61 64 2c 20 6f 72 20 2d  ually read, or -
c8a0: 31 20 6f 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20  1 on error.. *. 
c8b0: 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 4e  * NOTES. *     N
c8c0: 6f 6e 65 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69  one. *. */.stati
c8d0: 63 20 73 73 69 7a 65 5f 74 20 63 61 63 6b 65 79  c ssize_t cackey
c8e0: 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 74 72  _read_buffer(str
c8f0: 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20  uct cackey_slot 
c900: 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64 20  *slot, unsigned 
c910: 63 68 61 72 20 2a 62 75 66 66 65 72 2c 20 73 69  char *buffer, si
c920: 7a 65 5f 74 20 63 6f 75 6e 74 2c 20 75 6e 73 69  ze_t count, unsi
c930: 67 6e 65 64 20 63 68 61 72 20 74 5f 6f 72 5f 76  gned char t_or_v
c940: 2c 20 73 69 7a 65 5f 74 20 69 6e 69 74 69 61 6c  , size_t initial
c950: 5f 6f 66 66 73 65 74 29 20 7b 0a 09 75 6e 73 69  _offset) {..unsi
c960: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 69 74 5f  gned char *init_
c970: 62 75 66 66 65 72 3b 0a 09 73 69 7a 65 5f 74 20  buffer;..size_t 
c980: 69 6e 69 74 5f 63 6f 75 6e 74 3b 0a 09 73 69 7a  init_count;..siz
c990: 65 5f 74 20 69 6e 69 74 5f 69 6e 69 74 69 61 6c  e_t init_initial
c9a0: 5f 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65 5f  _offset;...size_
c9b0: 74 20 6f 66 66 73 65 74 20 3d 20 30 2c 20 6d 61  t offset = 0, ma
c9c0: 78 5f 6f 66 66 73 65 74 2c 20 6d 61 78 5f 63 6f  x_offset, max_co
c9d0: 75 6e 74 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  unt;..unsigned c
c9e0: 68 61 72 20 63 6d 64 5b 32 5d 3b 0a 09 75 69 6e  har cmd[2];..uin
c9f0: 74 31 36 5f 74 20 72 65 73 70 63 6f 64 65 3b 0a  t16_t respcode;.
ca00: 09 69 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a  .int send_ret;..
ca10: 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
ca20: 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
ca30: 0a 0a 09 69 6e 69 74 5f 62 75 66 66 65 72 20 3d  ...init_buffer =
ca40: 20 62 75 66 66 65 72 3b 0a 09 69 6e 69 74 5f 63   buffer;..init_c
ca50: 6f 75 6e 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 69  ount = count;..i
ca60: 6e 69 74 5f 69 6e 69 74 69 61 6c 5f 6f 66 66 73  nit_initial_offs
ca70: 65 74 20 3d 20 69 6e 69 74 69 61 6c 5f 6f 66 66  et = initial_off
ca80: 73 65 74 3b 0a 0a 09 6d 61 78 5f 6f 66 66 73 65  set;...max_offse
ca90: 74 20 3d 20 63 6f 75 6e 74 3b 0a 09 6d 61 78 5f  t = count;..max_
caa0: 63 6f 75 6e 74 20 3d 20 43 41 43 4b 45 59 5f 41  count = CACKEY_A
cab0: 50 44 55 5f 4d 54 55 3b 0a 0a 09 69 66 20 28 74  PDU_MTU;...if (t
cac0: 5f 6f 72 5f 76 20 21 3d 20 31 20 26 26 20 74 5f  _or_v != 1 && t_
cad0: 6f 72 5f 76 20 21 3d 20 32 29 20 7b 0a 09 09 43  or_v != 2) {...C
cae0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
caf0: 54 46 28 22 49 6e 76 61 6c 69 64 20 54 20 6f 72  TF("Invalid T or
cb00: 20 56 20 70 61 72 61 6d 65 74 65 72 20 73 70 65   V parameter spe
cb10: 63 69 66 69 65 64 2c 20 72 65 74 75 72 6e 69 6e  cified, returnin
cb20: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
cb30: 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
cb40: 7d 0a 0a 09 63 6d 64 5b 30 5d 20 3d 20 74 5f 6f  }...cmd[0] = t_o
cb50: 72 5f 76 3b 0a 0a 09 77 68 69 6c 65 20 28 31 29  r_v;...while (1)
cb60: 20 7b 0a 09 09 69 66 20 28 6f 66 66 73 65 74 20   {...if (offset 
cb70: 3e 3d 20 6d 61 78 5f 6f 66 66 73 65 74 29 20 7b  >= max_offset) {
cb80: 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
cb90: 5f 50 52 49 4e 54 46 28 22 42 75 66 66 65 72 20  _PRINTF("Buffer 
cba0: 74 6f 6f 20 73 6d 61 6c 6c 2c 20 72 65 74 75 72  too small, retur
cbb0: 6e 69 6e 67 20 77 68 61 74 20 77 65 20 67 6f 74  ning what we got
cbc0: 2e 2e 2e 22 29 3b 0a 0a 09 09 09 62 72 65 61 6b  ...");.....break
cbd0: 3b 0a 09 09 7d 0a 0a 09 09 63 6f 75 6e 74 20 3d  ;...}....count =
cbe0: 20 6d 61 78 5f 6f 66 66 73 65 74 20 2d 20 6f 66   max_offset - of
cbf0: 66 73 65 74 3b 0a 09 09 69 66 20 28 63 6f 75 6e  fset;...if (coun
cc00: 74 20 3e 20 6d 61 78 5f 63 6f 75 6e 74 29 20 7b  t > max_count) {
cc10: 0a 09 09 09 63 6f 75 6e 74 20 3d 20 6d 61 78 5f  ....count = max_
cc20: 63 6f 75 6e 74 3b 0a 09 09 7d 0a 0a 09 09 63 6d  count;...}....cm
cc30: 64 5b 31 5d 20 3d 20 63 6f 75 6e 74 3b 0a 0a 09  d[1] = count;...
cc40: 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b  .send_ret = cack
cc50: 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f  ey_send_apdu(slo
cc60: 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47  t, GSCIS_CLASS_G
cc70: 4c 4f 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20  LOBAL_PLATFORM, 
cc80: 47 53 43 49 53 5f 49 4e 53 54 52 5f 52 45 41 44  GSCIS_INSTR_READ
cc90: 5f 42 55 46 46 45 52 2c 20 28 28 69 6e 69 74 69  _BUFFER, ((initi
cca0: 61 6c 5f 6f 66 66 73 65 74 20 2b 20 6f 66 66 73  al_offset + offs
ccb0: 65 74 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  et) >> 8) & 0xff
ccc0: 2c 20 28 69 6e 69 74 69 61 6c 5f 6f 66 66 73 65  , (initial_offse
ccd0: 74 20 2b 20 6f 66 66 73 65 74 29 20 26 20 30 78  t + offset) & 0x
cce0: 66 66 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29 2c  ff, sizeof(cmd),
ccf0: 20 63 6d 64 2c 20 30 78 30 30 2c 20 26 72 65 73   cmd, 0x00, &res
cd00: 70 63 6f 64 65 2c 20 62 75 66 66 65 72 20 2b 20  pcode, buffer + 
cd10: 6f 66 66 73 65 74 2c 20 26 63 6f 75 6e 74 29 3b  offset, &count);
cd20: 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
cd30: 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
cd40: 45 5f 52 45 54 52 59 29 20 7b 0a 09 09 09 43 41  E_RETRY) {....CA
cd50: 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
cd60: 46 28 22 41 44 50 55 20 53 65 6e 64 69 6e 67 20  F("ADPU Sending 
cd70: 66 61 69 6c 65 64 2c 20 72 65 74 72 79 69 6e 67  failed, retrying
cd80: 20 72 65 61 64 20 62 75 66 66 65 72 22 29 3b 0a   read buffer");.
cd90: 0a 09 09 09 72 65 74 75 72 6e 28 63 61 63 6b 65  ....return(cacke
cda0: 79 5f 72 65 61 64 5f 62 75 66 66 65 72 28 73 6c  y_read_buffer(sl
cdb0: 6f 74 2c 20 69 6e 69 74 5f 62 75 66 66 65 72 2c  ot, init_buffer,
cdc0: 20 69 6e 69 74 5f 63 6f 75 6e 74 2c 20 74 5f 6f   init_count, t_o
cdd0: 72 5f 76 2c 20 69 6e 69 74 5f 69 6e 69 74 69 61  r_v, init_initia
cde0: 6c 5f 6f 66 66 73 65 74 29 29 3b 0a 09 09 7d 0a  l_offset));...}.
cdf0: 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
ce00: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
ce10: 5f 4f 4b 29 20 7b 0a 09 09 09 69 66 20 28 72 65  _OK) {....if (re
ce20: 73 70 63 6f 64 65 20 3d 3d 20 30 78 36 41 38 36  spcode == 0x6A86
ce30: 29 20 7b 0a 09 09 09 09 69 66 20 28 6d 61 78 5f  ) {.....if (max_
ce40: 63 6f 75 6e 74 20 3d 3d 20 31 29 20 7b 0a 09 09  count == 1) {...
ce50: 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
ce60: 0a 09 09 09 09 6d 61 78 5f 63 6f 75 6e 74 20 3d  .....max_count =
ce70: 20 6d 61 78 5f 63 6f 75 6e 74 20 2f 20 32 3b 0a   max_count / 2;.
ce80: 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
ce90: 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44  ..}.....CACKEY_D
cea0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 63 61 63  EBUG_PRINTF("cac
ceb0: 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 29 20  key_send_apdu() 
cec0: 66 61 69 6c 65 64 2c 20 72 65 74 75 72 6e 69 6e  failed, returnin
ced0: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
cee0: 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
cef0: 09 09 7d 0a 0a 09 09 6f 66 66 73 65 74 20 2b 3d  ..}....offset +=
cf00: 20 63 6f 75 6e 74 3b 0a 0a 09 09 69 66 20 28 63   count;....if (c
cf10: 6f 75 6e 74 20 3c 20 6d 61 78 5f 63 6f 75 6e 74  ount < max_count
cf20: 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45  ) {....CACKEY_DE
cf30: 42 55 47 5f 50 52 49 4e 54 46 28 22 53 68 6f 72  BUG_PRINTF("Shor
cf40: 74 20 72 65 61 64 20 2d 2d 20 63 6f 75 6e 74 20  t read -- count 
cf50: 3d 20 25 69 2c 20 63 6d 64 5b 31 5d 20 3d 20 25  = %i, cmd[1] = %
cf60: 69 22 2c 20 28 69 6e 74 29 20 63 6f 75 6e 74 2c  i", (int) count,
cf70: 20 28 69 6e 74 29 20 63 6d 64 5b 31 5d 29 3b 0a   (int) cmd[1]);.
cf80: 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 09  ....break;...}..
cf90: 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
cfa0: 5f 50 41 52 41 4e 4f 49 44 0a 23 20 20 69 66 64  _PARANOID.#  ifd
cfb0: 65 66 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f  ef _POSIX_SSIZE_
cfc0: 4d 41 58 0a 09 69 66 20 28 6f 66 66 73 65 74 20  MAX..if (offset 
cfd0: 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
cfe0: 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
cff0: 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 66 66  EBUG_PRINTF("Off
d000: 73 65 74 20 65 78 63 65 65 64 73 20 6d 61 78 69  set exceeds maxi
d010: 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74 75 72  mum value, retur
d020: 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2e  ning in failure.
d030: 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 6f 66 66   (max = %li, off
d040: 73 65 74 20 3d 20 25 6c 75 29 22 2c 20 28 6c 6f  set = %lu)", (lo
d050: 6e 67 29 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45  ng) _POSIX_SSIZE
d060: 5f 4d 41 58 2c 20 28 75 6e 73 69 67 6e 65 64 20  _MAX, (unsigned 
d070: 6c 6f 6e 67 29 20 6f 66 66 73 65 74 29 3b 0a 0a  long) offset);..
d080: 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
d090: 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
d0a0: 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
d0b0: 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
d0c0: 67 20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65  g in success, re
d0d0: 61 64 20 25 6c 75 20 62 79 74 65 73 22 2c 20 28  ad %lu bytes", (
d0e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f  unsigned long) o
d0f0: 66 66 73 65 74 29 3b 0a 0a 09 72 65 74 75 72 6e  ffset);...return
d100: 28 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (offset);.}../*.
d110: 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
d120: 20 20 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61     cackey_ret ca
d130: 63 6b 65 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c  ckey_select_appl
d140: 65 74 28 73 74 72 75 63 74 20 63 61 63 6b 65 79  et(struct cackey
d150: 5f 73 6c 6f 74 20 2a 73 6c 6f 74 2c 20 75 6e 73  _slot *slot, uns
d160: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 69 64 2c  igned char *aid,
d170: 20 73 69 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 29   size_t aid_len)
d180: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
d190: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
d1a0: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
d1b0: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
d1c0: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
d1d0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
d1e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
d1f0: 69 64 0a 20 2a 20 20 20 20 20 20 20 20 20 42 75  id. *         Bu
d200: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
d210: 41 70 70 6c 65 74 20 49 44 20 74 6f 20 73 65 6c  Applet ID to sel
d220: 65 63 74 0a 20 2a 0a 20 2a 20 20 20 20 20 73 69  ect. *. *     si
d230: 7a 65 5f 74 20 61 69 64 5f 6c 65 6e 0a 20 2a 20  ze_t aid_len. * 
d240: 20 20 20 20 20 20 20 20 4e 75 6d 62 65 72 20 6f          Number o
d250: 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 22  f bytes in the "
d260: 61 69 64 22 20 28 41 70 70 6c 65 74 20 49 44 29  aid" (Applet ID)
d270: 20 70 61 72 61 6d 65 74 65 72 0a 20 2a 0a 20 2a   parameter. *. *
d280: 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20 2a   RETURN VALUE. *
d290: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
d2a0: 5f 53 5f 4f 4b 20 20 20 20 20 20 20 20 20 4f 6e  _S_OK         On
d2b0: 20 73 75 63 63 65 73 73 0a 20 2a 20 20 20 20 20   success. *     
d2c0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 47 45  CACKEY_PCSC_E_GE
d2d0: 4e 45 52 49 43 20 20 20 20 4f 6e 20 65 72 72 6f  NERIC    On erro
d2e0: 72 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a  r. *. * NOTES. *
d2f0: 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a 20 2a 2f       None. *. */
d300: 0a 73 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72  .static cackey_r
d310: 65 74 20 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  et cackey_select
d320: 5f 61 70 70 6c 65 74 28 73 74 72 75 63 74 20 63  _applet(struct c
d330: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
d340: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
d350: 2a 61 69 64 2c 20 73 69 7a 65 5f 74 20 61 69 64  *aid, size_t aid
d360: 5f 6c 65 6e 29 20 7b 0a 09 69 6e 74 20 73 65 6e  _len) {..int sen
d370: 64 5f 72 65 74 3b 0a 0a 09 43 41 43 4b 45 59 5f  d_ret;...CACKEY_
d380: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
d390: 6c 6c 65 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45  lled.");...CACKE
d3a0: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
d3b0: 28 22 53 65 6c 65 63 74 69 6e 67 20 61 70 70 6c  ("Selecting appl
d3c0: 65 74 3a 22 2c 20 61 69 64 2c 20 61 69 64 5f 6c  et:", aid, aid_l
d3d0: 65 6e 29 3b 0a 0a 09 73 65 6e 64 5f 72 65 74 20  en);...send_ret 
d3e0: 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f 61 70  = cackey_send_ap
d3f0: 64 75 28 73 6c 6f 74 2c 20 47 53 43 49 53 5f 43  du(slot, GSCIS_C
d400: 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c 20 47 53  LASS_ISO7816, GS
d410: 43 49 53 5f 49 4e 53 54 52 5f 53 45 4c 45 43 54  CIS_INSTR_SELECT
d420: 2c 20 47 53 43 49 53 5f 50 41 52 41 4d 5f 53 45  , GSCIS_PARAM_SE
d430: 4c 45 43 54 5f 41 50 50 4c 45 54 2c 20 30 78 30  LECT_APPLET, 0x0
d440: 30 2c 20 61 69 64 5f 6c 65 6e 2c 20 61 69 64 2c  0, aid_len, aid,
d450: 20 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   0x00, NULL, NUL
d460: 4c 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28  L, NULL);...if (
d470: 73 65 6e 64 5f 72 65 74 20 3d 3d 20 43 41 43 4b  send_ret == CACK
d480: 45 59 5f 50 43 53 43 5f 45 5f 52 45 54 52 59 29  EY_PCSC_E_RETRY)
d490: 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
d4a0: 47 5f 50 52 49 4e 54 46 28 22 41 44 50 55 20 53  G_PRINTF("ADPU S
d4b0: 65 6e 64 69 6e 67 20 66 61 69 6c 65 64 2c 20 72  ending failed, r
d4c0: 65 74 72 79 69 6e 67 20 73 65 6c 65 63 74 20 61  etrying select a
d4d0: 70 70 6c 65 74 22 29 3b 0a 0a 09 09 72 65 74 75  pplet");....retu
d4e0: 72 6e 28 63 61 63 6b 65 79 5f 73 65 6c 65 63 74  rn(cackey_select
d4f0: 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c 20 61 69  _applet(slot, ai
d500: 64 2c 20 61 69 64 5f 6c 65 6e 29 29 3b 0a 09 7d  d, aid_len));..}
d510: 0a 0a 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20  ...if (send_ret 
d520: 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  != CACKEY_PCSC_S
d530: 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  _OK) {...CACKEY_
d540: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
d550: 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 61 70 70  iled to open app
d560: 6c 65 74 2c 20 72 65 74 75 72 6e 69 6e 67 20 69  let, returning i
d570: 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09  n failure");....
d580: 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
d590: 53 43 5f 45 5f 47 45 4e 45 52 49 43 29 3b 0a 09  SC_E_GENERIC);..
d5a0: 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
d5b0: 5f 50 52 49 4e 54 46 28 22 53 75 63 63 65 73 73  _PRINTF("Success
d5c0: 66 75 6c 6c 79 20 73 65 6c 65 63 74 65 64 20 66  fully selected f
d5d0: 69 6c 65 22 29 3b 0a 0a 09 72 65 74 75 72 6e 28  ile");...return(
d5e0: 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
d5f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50  );.}../*. * SYNP
d600: 4f 53 49 53 0a 20 2a 20 20 20 20 20 63 61 63 6b  OSIS. *     cack
d610: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
d620: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
d630: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
d640: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
d650: 3b 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54  ;. *. * ARGUMENT
d660: 53 0a 20 2a 20 20 20 20 20 73 74 72 75 63 74 20  S. *     struct 
d670: 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f  cackey_slot *slo
d680: 74 0a 20 2a 20 20 20 20 20 20 20 20 20 53 6c 6f  t. *         Slo
d690: 74 20 74 6f 20 73 65 6e 64 20 63 6f 6d 6d 61 6e  t to send comman
d6a0: 64 73 20 74 6f 0a 20 2a 0a 20 2a 20 20 20 20 20  ds to. *. *     
d6b0: 75 69 6e 74 31 36 5f 74 20 65 66 0a 20 2a 20 20  uint16_t ef. *  
d6c0: 20 20 20 20 20 20 20 45 6c 65 6d 65 6e 74 61 6c         Elemental
d6d0: 20 46 69 6c 65 20 74 6f 20 73 65 6c 65 63 74 0a   File to select.
d6e0: 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c   *. * RETURN VAL
d6f0: 55 45 0a 20 2a 20 20 20 20 20 43 41 43 4b 45 59  UE. *     CACKEY
d700: 5f 50 43 53 43 5f 53 5f 4f 4b 20 20 20 20 20 20  _PCSC_S_OK      
d710: 20 20 20 4f 6e 20 73 75 63 63 65 73 73 0a 20 2a     On success. *
d720: 20 20 20 20 20 43 41 43 4b 45 59 5f 50 43 53 43       CACKEY_PCSC
d730: 5f 45 5f 47 45 4e 45 52 49 43 20 20 20 20 4f 6e  _E_GENERIC    On
d740: 20 65 72 72 6f 72 0a 20 2a 0a 20 2a 20 4e 4f 54   error. *. * NOT
d750: 45 53 0a 20 2a 20 20 20 20 20 54 68 69 73 20 73  ES. *     This s
d760: 65 6c 65 63 74 73 20 61 6e 20 45 6c 65 6d 65 6e  elects an Elemen
d770: 74 61 72 79 20 46 69 6c 65 20 28 45 46 29 20 75  tary File (EF) u
d780: 6e 64 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  nder the current
d790: 6c 79 20 73 65 6c 65 63 74 65 64 0a 20 2a 20 20  ly selected. *  
d7a0: 20 20 20 44 65 64 69 63 61 74 65 64 20 46 69 6c     Dedicated Fil
d7b0: 65 20 28 44 46 29 0a 20 2a 0a 20 2a 20 20 20 20  e (DF). *. *    
d7c0: 20 54 79 70 69 63 61 6c 6c 79 20 74 68 69 73 20   Typically this 
d7d0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
d7e0: 73 65 6c 65 63 74 69 6e 67 20 74 68 65 20 63 6f  selecting the co
d7f0: 72 72 65 63 74 20 41 70 70 6c 65 74 20 28 75 73  rrect Applet (us
d800: 69 6e 67 0a 20 2a 20 20 20 20 20 63 61 63 6b 65  ing. *     cacke
d810: 79 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 29  y_select_applet)
d820: 20 66 6f 72 20 56 4d 20 63 61 72 64 73 0a 20 2a   for VM cards. *
d830: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 61 63 6b  . */.static cack
d840: 65 79 5f 72 65 74 20 63 61 63 6b 65 79 5f 73 65  ey_ret cackey_se
d850: 6c 65 63 74 5f 66 69 6c 65 28 73 74 72 75 63 74  lect_file(struct
d860: 20 63 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c   cackey_slot *sl
d870: 6f 74 2c 20 75 69 6e 74 31 36 5f 74 20 65 66 29  ot, uint16_t ef)
d880: 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61   {..unsigned cha
d890: 72 20 66 69 64 5f 62 75 66 5b 32 5d 3b 0a 09 69  r fid_buf[2];..i
d8a0: 6e 74 20 73 65 6e 64 5f 72 65 74 3b 0a 0a 09 43  nt send_ret;...C
d8b0: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
d8c0: 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
d8d0: 09 2f 2a 20 4f 70 65 6e 20 74 68 65 20 65 6c 65  ./* Open the ele
d8e0: 6d 65 6e 74 61 72 79 20 66 69 6c 65 20 2a 2f 0a  mentary file */.
d8f0: 09 66 69 64 5f 62 75 66 5b 30 5d 20 3d 20 28 65  .fid_buf[0] = (e
d900: 66 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  f >> 8) & 0xff;.
d910: 09 66 69 64 5f 62 75 66 5b 31 5d 20 3d 20 65 66  .fid_buf[1] = ef
d920: 20 26 20 30 78 66 66 3b 0a 0a 09 43 41 43 4b 45   & 0xff;...CACKE
d930: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
d940: 53 65 6c 65 63 74 69 6e 67 20 66 69 6c 65 3a 20  Selecting file: 
d950: 25 30 34 6c 78 22 2c 20 28 75 6e 73 69 67 6e 65  %04lx", (unsigne
d960: 64 20 6c 6f 6e 67 29 20 65 66 29 3b 0a 0a 09 73  d long) ef);...s
d970: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
d980: 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
d990: 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 49 53 4f   GSCIS_CLASS_ISO
d9a0: 37 38 31 36 2c 20 47 53 43 49 53 5f 49 4e 53 54  7816, GSCIS_INST
d9b0: 52 5f 53 45 4c 45 43 54 2c 20 30 78 30 32 2c 20  R_SELECT, 0x02, 
d9c0: 30 78 30 43 2c 20 73 69 7a 65 6f 66 28 66 69 64  0x0C, sizeof(fid
d9d0: 5f 62 75 66 29 2c 20 66 69 64 5f 62 75 66 2c 20  _buf), fid_buf, 
d9e0: 30 78 30 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  0x00, NULL, NULL
d9f0: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 73 65  , NULL);..if (se
da00: 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59  nd_ret != CACKEY
da10: 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09  _PCSC_S_OK) {...
da20: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
da30: 4e 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 6f  NTF("Failed to o
da40: 70 65 6e 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  pen file, return
da50: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
da60: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
da70: 45 59 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49  EY_PCSC_E_GENERI
da80: 43 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  C);..}...CACKEY_
da90: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 75  DEBUG_PRINTF("Su
daa0: 63 63 65 73 73 66 75 6c 6c 79 20 73 65 6c 65 63  ccessfully selec
dab0: 74 65 64 20 66 69 6c 65 22 29 3b 0a 0a 09 72 65  ted file");...re
dac0: 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
dad0: 5f 53 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  _S_OK);.}../*. *
dae0: 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20   SYNPOSIS. *    
daf0: 20 76 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65   void cackey_fre
db00: 65 5f 74 6c 76 28 73 74 72 75 63 74 20 63 61 63  e_tlv(struct cac
db10: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
db20: 72 6f 6f 74 29 3b 0a 20 2a 0a 20 2a 20 41 52 47  root);. *. * ARG
db30: 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 73 74  UMENTS. *     st
db40: 72 75 63 74 20 63 61 63 6b 65 79 5f 74 6c 76 5f  ruct cackey_tlv_
db50: 65 6e 74 69 74 79 20 2a 72 6f 6f 74 0a 20 2a 20  entity *root. * 
db60: 20 20 20 20 20 20 20 20 52 6f 6f 74 20 6f 66 20          Root of 
db70: 74 68 65 20 54 4c 56 20 6c 69 73 74 20 74 6f 20  the TLV list to 
db80: 73 74 61 72 74 20 66 72 65 65 69 6e 67 0a 20 2a  start freeing. *
db90: 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
dba0: 0a 20 2a 20 20 20 20 20 4e 6f 6e 65 0a 20 2a 0a  . *     None. *.
dbb0: 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20   * NOTES. *     
dbc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 72  This function fr
dbd0: 65 65 73 20 74 68 65 20 54 4c 56 20 6c 69 6e 6b  ees the TLV link
dbe0: 65 64 20 6c 69 73 74 65 64 20 72 65 74 75 72 6e  ed listed return
dbf0: 65 64 20 66 72 6f 6d 0a 20 2a 20 20 20 20 20 22  ed from. *     "
dc00: 63 61 63 6b 65 79 5f 72 65 61 64 5f 74 6c 76 22  cackey_read_tlv"
dc10: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  . *. */.static v
dc20: 6f 69 64 20 63 61 63 6b 65 79 5f 66 72 65 65 5f  oid cackey_free_
dc30: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
dc40: 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a 72 6f  y_tlv_entity *ro
dc50: 6f 74 29 20 7b 0a 09 73 74 72 75 63 74 20 63 61  ot) {..struct ca
dc60: 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20  ckey_tlv_entity 
dc70: 2a 63 75 72 72 2c 20 2a 6e 65 78 74 3b 0a 0a 09  *curr, *next;...
dc80: 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e 55 4c 4c  if (root == NULL
dc90: 29 20 7b 0a 09 09 72 65 74 75 72 6e 3b 0a 09 7d  ) {...return;..}
dca0: 0a 0a 09 66 6f 72 20 28 63 75 72 72 20 3d 20 72  ...for (curr = r
dcb0: 6f 6f 74 3b 20 63 75 72 72 3b 20 63 75 72 72 20  oot; curr; curr 
dcc0: 3d 20 6e 65 78 74 29 20 7b 0a 09 09 6e 65 78 74  = next) {...next
dcd0: 20 3d 20 63 75 72 72 2d 3e 5f 6e 65 78 74 3b 0a   = curr->_next;.
dce0: 0a 09 09 73 77 69 74 63 68 20 28 63 75 72 72 2d  ...switch (curr-
dcf0: 3e 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20  >tag) {....case 
dd00: 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54 41  GSCIS_TAG_ACR_TA
dd10: 42 4c 45 3a 0a 09 09 09 63 61 73 65 20 47 53 43  BLE:....case GSC
dd20: 49 53 5f 54 41 47 5f 43 45 52 54 49 46 49 43 41  IS_TAG_CERTIFICA
dd30: 54 45 3a 0a 09 09 09 09 69 66 20 28 63 75 72 72  TE:.....if (curr
dd40: 2d 3e 76 61 6c 75 65 29 20 7b 0a 09 09 09 09 09  ->value) {......
dd50: 66 72 65 65 28 63 75 72 72 2d 3e 76 61 6c 75 65  free(curr->value
dd60: 29 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65  );.....}.....bre
dd70: 61 6b 3b 0a 09 09 09 63 61 73 65 20 47 53 43 49  ak;....case GSCI
dd80: 53 5f 54 41 47 5f 43 41 52 44 55 52 4c 3a 0a 09  S_TAG_CARDURL:..
dd90: 09 09 09 69 66 20 28 63 75 72 72 2d 3e 76 61 6c  ...if (curr->val
dda0: 75 65 5f 63 61 72 64 75 72 6c 29 20 7b 0a 09 09  ue_cardurl) {...
ddb0: 09 09 09 66 72 65 65 28 63 75 72 72 2d 3e 76 61  ...free(curr->va
ddc0: 6c 75 65 5f 63 61 72 64 75 72 6c 29 3b 0a 09 09  lue_cardurl);...
ddd0: 09 09 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09  ..}.....break;..
dde0: 09 7d 0a 0a 09 09 66 72 65 65 28 63 75 72 72 29  .}....free(curr)
ddf0: 3b 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 3b 0a 7d  ;..}...return;.}
de00: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
de10: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
de20: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
de30: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
de40: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
de50: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
de60: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
de70: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
de80: 20 63 61 63 6b 65 79 5f 74 6c 76 5f 65 6e 74 69   cackey_tlv_enti
de90: 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f  ty *cackey_read_
dea0: 74 6c 76 28 73 74 72 75 63 74 20 63 61 63 6b 65  tlv(struct cacke
deb0: 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a  y_slot *slot) {.
dec0: 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 74  .struct cackey_t
ded0: 6c 76 5f 65 6e 74 69 74 79 20 2a 63 75 72 72 5f  lv_entity *curr_
dee0: 65 6e 74 69 74 79 2c 20 2a 72 6f 6f 74 20 3d 20  entity, *root = 
def0: 4e 55 4c 4c 2c 20 2a 6c 61 73 74 20 3d 20 4e 55  NULL, *last = NU
df00: 4c 4c 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  LL;..unsigned ch
df10: 61 72 20 74 6c 65 6e 5f 62 75 66 5b 32 5d 2c 20  ar tlen_buf[2], 
df20: 74 76 61 6c 5f 62 75 66 5b 31 30 32 34 5d 2c 20  tval_buf[1024], 
df30: 2a 74 76 61 6c 3b 0a 09 75 6e 73 69 67 6e 65 64  *tval;..unsigned
df40: 20 63 68 61 72 20 76 6c 65 6e 5f 62 75 66 5b 32   char vlen_buf[2
df50: 5d 2c 20 76 76 61 6c 5f 62 75 66 5b 38 31 39 32  ], vval_buf[8192
df60: 5d 2c 20 2a 76 76 61 6c 3b 0a 09 75 6e 73 69 67  ], *vval;..unsig
df70: 6e 65 64 20 63 68 61 72 20 2a 74 6d 70 62 75 66  ned char *tmpbuf
df80: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
df90: 20 74 6d 70 62 75 66 6c 65 6e 3b 0a 09 73 73 69   tmpbuflen;..ssi
dfa0: 7a 65 5f 74 20 74 6c 65 6e 2c 20 76 6c 65 6e 3b  ze_t tlen, vlen;
dfb0: 0a 09 73 73 69 7a 65 5f 74 20 72 65 61 64 5f 72  ..ssize_t read_r
dfc0: 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6f 66 66 73  et;..size_t offs
dfd0: 65 74 5f 74 20 3d 20 30 2c 20 6f 66 66 73 65 74  et_t = 0, offset
dfe0: 5f 76 20 3d 20 30 3b 0a 09 75 6e 73 69 67 6e 65  _v = 0;..unsigne
dff0: 64 20 63 68 61 72 20 74 61 67 3b 0a 09 73 69 7a  d char tag;..siz
e000: 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 23 69 66 64  e_t length;.#ifd
e010: 65 66 20 48 41 56 45 5f 4c 49 42 5a 0a 09 69 6e  ef HAVE_LIBZ..in
e020: 74 20 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65 74  t uncompress_ret
e030: 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  ;.#endif...CACKE
e040: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
e050: 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 72 65 61  Called.");...rea
e060: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
e070: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
e080: 20 74 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f   tlen_buf, sizeo
e090: 66 28 74 6c 65 6e 5f 62 75 66 29 2c 20 31 2c 20  f(tlen_buf), 1, 
e0a0: 6f 66 66 73 65 74 5f 74 29 3b 0a 09 69 66 20 28  offset_t);..if (
e0b0: 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65  read_ret != size
e0c0: 6f 66 28 74 6c 65 6e 5f 62 75 66 29 29 20 7b 0a  of(tlen_buf)) {.
e0d0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e0e0: 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c  RINTF("Read fail
e0f0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
e100: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e110: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e120: 0a 09 74 6c 65 6e 20 3d 20 28 74 6c 65 6e 5f 62  ..tlen = (tlen_b
e130: 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 74 6c  uf[1] << 8) | tl
e140: 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 72 65 61  en_buf[0];...rea
e150: 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72  d_ret = cackey_r
e160: 65 61 64 5f 62 75 66 66 65 72 28 73 6c 6f 74 2c  ead_buffer(slot,
e170: 20 76 6c 65 6e 5f 62 75 66 2c 20 73 69 7a 65 6f   vlen_buf, sizeo
e180: 66 28 76 6c 65 6e 5f 62 75 66 29 2c 20 32 2c 20  f(vlen_buf), 2, 
e190: 6f 66 66 73 65 74 5f 76 29 3b 0a 09 69 66 20 28  offset_v);..if (
e1a0: 72 65 61 64 5f 72 65 74 20 21 3d 20 73 69 7a 65  read_ret != size
e1b0: 6f 66 28 76 6c 65 6e 5f 62 75 66 29 29 20 7b 0a  of(vlen_buf)) {.
e1c0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e1d0: 52 49 4e 54 46 28 22 52 65 61 64 20 66 61 69 6c  RINTF("Read fail
e1e0: 65 64 2c 20 72 65 74 75 72 6e 69 6e 67 20 69 6e  ed, returning in
e1f0: 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72   failure");....r
e200: 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a  eturn(NULL);..}.
e210: 0a 09 76 6c 65 6e 20 3d 20 28 76 6c 65 6e 5f 62  ..vlen = (vlen_b
e220: 75 66 5b 31 5d 20 3c 3c 20 38 29 20 7c 20 76 6c  uf[1] << 8) | vl
e230: 65 6e 5f 62 75 66 5b 30 5d 3b 0a 0a 09 43 41 43  en_buf[0];...CAC
e240: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
e250: 28 22 54 61 67 20 4c 65 6e 67 74 68 20 3d 20 25  ("Tag Length = %
e260: 6c 75 2c 20 56 61 6c 75 65 20 4c 65 6e 67 74 68  lu, Value Length
e270: 20 3d 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e   = %lu", (unsign
e280: 65 64 20 6c 6f 6e 67 29 20 74 6c 65 6e 2c 20 28  ed long) tlen, (
e290: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 76  unsigned long) v
e2a0: 6c 65 6e 29 3b 0a 0a 09 6f 66 66 73 65 74 5f 74  len);...offset_t
e2b0: 20 2b 3d 20 32 3b 0a 09 6f 66 66 73 65 74 5f 76   += 2;..offset_v
e2c0: 20 2b 3d 20 32 3b 0a 0a 09 69 66 20 28 74 6c 65   += 2;...if (tle
e2d0: 6e 20 3e 20 73 69 7a 65 6f 66 28 74 76 61 6c 5f  n > sizeof(tval_
e2e0: 62 75 66 29 29 20 7b 0a 09 09 43 41 43 4b 45 59  buf)) {...CACKEY
e2f0: 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
e300: 61 67 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f  ag length is too
e310: 20 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e   large, returnin
e320: 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a  g in failure");.
e330: 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b  ...return(NULL);
e340: 0a 09 7d 0a 0a 09 69 66 20 28 76 6c 65 6e 20 3e  ..}...if (vlen >
e350: 20 73 69 7a 65 6f 66 28 76 76 61 6c 5f 62 75 66   sizeof(vval_buf
e360: 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
e370: 42 55 47 5f 50 52 49 4e 54 46 28 22 56 61 6c 75  BUG_PRINTF("Valu
e380: 65 20 6c 65 6e 67 74 68 20 69 73 20 74 6f 6f 20  e length is too 
e390: 6c 61 72 67 65 2c 20 72 65 74 75 72 6e 69 6e 67  large, returning
e3a0: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e3b0: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e3c0: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
e3d0: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
e3e0: 65 72 28 73 6c 6f 74 2c 20 74 76 61 6c 5f 62 75  er(slot, tval_bu
e3f0: 66 2c 20 74 6c 65 6e 2c 20 31 2c 20 6f 66 66 73  f, tlen, 1, offs
e400: 65 74 5f 74 29 3b 0a 09 69 66 20 28 72 65 61 64  et_t);..if (read
e410: 5f 72 65 74 20 21 3d 20 74 6c 65 6e 29 20 7b 0a  _ret != tlen) {.
e420: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e430: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
e440: 20 72 65 61 64 20 65 6e 74 69 72 65 20 54 2d 62   read entire T-b
e450: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
e460: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e470: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e480: 09 7d 0a 0a 09 72 65 61 64 5f 72 65 74 20 3d 20  .}...read_ret = 
e490: 63 61 63 6b 65 79 5f 72 65 61 64 5f 62 75 66 66  cackey_read_buff
e4a0: 65 72 28 73 6c 6f 74 2c 20 76 76 61 6c 5f 62 75  er(slot, vval_bu
e4b0: 66 2c 20 76 6c 65 6e 2c 20 32 2c 20 6f 66 66 73  f, vlen, 2, offs
e4c0: 65 74 5f 76 29 3b 0a 09 69 66 20 28 72 65 61 64  et_v);..if (read
e4d0: 5f 72 65 74 20 21 3d 20 76 6c 65 6e 29 20 7b 0a  _ret != vlen) {.
e4e0: 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
e4f0: 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74 6f  RINTF("Unable to
e500: 20 72 65 61 64 20 65 6e 74 69 72 65 20 56 2d 62   read entire V-b
e510: 75 66 66 65 72 2c 20 72 65 74 75 72 6e 69 6e 67  uffer, returning
e520: 20 69 6e 20 66 61 69 6c 75 72 65 22 29 3b 0a 0a   in failure");..
e530: 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
e540: 09 7d 0a 0a 09 74 76 61 6c 20 3d 20 74 76 61 6c  .}...tval = tval
e550: 5f 62 75 66 3b 0a 09 76 76 61 6c 20 3d 20 76 76  _buf;..vval = vv
e560: 61 6c 5f 62 75 66 3b 0a 09 77 68 69 6c 65 20 28  al_buf;..while (
e570: 74 6c 65 6e 20 3e 20 30 20 26 26 20 76 6c 65 6e  tlen > 0 && vlen
e580: 20 3e 20 30 29 20 7b 0a 09 09 74 61 67 20 3d 20   > 0) {...tag = 
e590: 2a 74 76 61 6c 3b 0a 09 09 74 76 61 6c 2b 2b 3b  *tval;...tval++;
e5a0: 0a 09 09 74 6c 65 6e 2d 2d 3b 0a 0a 09 09 69 66  ...tlen--;....if
e5b0: 20 28 2a 74 76 61 6c 20 3d 3d 20 30 78 66 66 29   (*tval == 0xff)
e5c0: 20 7b 0a 09 09 09 6c 65 6e 67 74 68 20 3d 20 28   {....length = (
e5d0: 74 76 61 6c 5b 32 5d 20 3c 3c 20 38 29 20 7c 20  tval[2] << 8) | 
e5e0: 74 76 61 6c 5b 31 5d 3b 0a 09 09 09 74 76 61 6c  tval[1];....tval
e5f0: 20 2b 3d 20 33 3b 0a 09 09 09 74 6c 65 6e 20 2d   += 3;....tlen -
e600: 3d 20 33 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  = 3;...} else {.
e610: 09 09 09 6c 65 6e 67 74 68 20 3d 20 2a 74 76 61  ...length = *tva
e620: 6c 3b 0a 09 09 09 74 76 61 6c 2b 2b 3b 0a 09 09  l;....tval++;...
e630: 09 74 6c 65 6e 2d 2d 3b 0a 09 09 7d 0a 0a 09 09  .tlen--;...}....
e640: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e650: 4e 54 46 28 22 54 61 67 3a 20 25 73 20 28 25 30  NTF("Tag: %s (%0
e660: 32 78 29 22 2c 20 43 41 43 4b 45 59 5f 44 45 42  2x)", CACKEY_DEB
e670: 55 47 5f 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53  UG_FUNC_TAG_TO_S
e680: 54 52 28 74 61 67 29 2c 20 28 75 6e 73 69 67 6e  TR(tag), (unsign
e690: 65 64 20 69 6e 74 29 20 74 61 67 29 3b 0a 09 09  ed int) tag);...
e6a0: 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
e6b0: 4e 54 42 55 46 28 22 56 61 6c 75 65 3a 22 2c 20  NTBUF("Value:", 
e6c0: 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29 3b 0a 0a  vval, length);..
e6d0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20 3d 20  ..curr_entity = 
e6e0: 4e 55 4c 4c 3b 0a 09 09 73 77 69 74 63 68 20 28  NULL;...switch (
e6f0: 74 61 67 29 20 7b 0a 09 09 09 63 61 73 65 20 47  tag) {....case G
e700: 53 43 49 53 5f 54 41 47 5f 43 41 52 44 55 52 4c  SCIS_TAG_CARDURL
e710: 3a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  :.....curr_entit
e720: 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
e730: 66 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29  f(*curr_entity))
e740: 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ;.....curr_entit
e750: 79 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  y->value_cardurl
e760: 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66   = malloc(sizeof
e770: 28 2a 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 76  (*curr_entity->v
e780: 61 6c 75 65 5f 63 61 72 64 75 72 6c 29 29 3b 0a  alue_cardurl));.
e790: 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72  .....memcpy(curr
e7a0: 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63  _entity->value_c
e7b0: 61 72 64 75 72 6c 2d 3e 72 69 64 2c 20 76 76 61  ardurl->rid, vva
e7c0: 6c 2c 20 35 29 3b 0a 09 09 09 09 63 75 72 72 5f  l, 5);.....curr_
e7d0: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 63 61  entity->value_ca
e7e0: 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 20 3d  rdurl->apptype =
e7f0: 20 76 76 61 6c 5b 35 5d 3b 0a 09 09 09 09 63 75   vval[5];.....cu
e800: 72 72 5f 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65  rr_entity->value
e810: 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74  _cardurl->object
e820: 69 64 20 3d 20 28 76 76 61 6c 5b 36 5d 20 3c 3c  id = (vval[6] <<
e830: 20 38 29 20 7c 20 76 76 61 6c 5b 37 5d 3b 0a 09   8) | vval[7];..
e840: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
e850: 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 61  value_cardurl->a
e860: 70 70 69 64 20 3d 20 28 76 76 61 6c 5b 38 5d 20  ppid = (vval[8] 
e870: 3c 3c 20 38 29 20 7c 20 76 76 61 6c 5b 39 5d 3b  << 8) | vval[9];
e880: 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74  ......curr_entit
e890: 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09 09  y->tag = tag;...
e8a0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
e8b0: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
e8c0: 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65  ..break;....case
e8d0: 20 47 53 43 49 53 5f 54 41 47 5f 41 43 52 5f 54   GSCIS_TAG_ACR_T
e8e0: 41 42 4c 45 3a 0a 09 09 09 09 63 75 72 72 5f 65  ABLE:.....curr_e
e8f0: 6e 74 69 74 79 20 3d 20 6d 61 6c 6c 6f 63 28 73  ntity = malloc(s
e900: 69 7a 65 6f 66 28 2a 63 75 72 72 5f 65 6e 74 69  izeof(*curr_enti
e910: 74 79 29 29 3b 0a 09 09 09 09 74 6d 70 62 75 66  ty));.....tmpbuf
e920: 20 3d 20 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68   = malloc(length
e930: 29 3b 0a 0a 09 09 09 09 6d 65 6d 63 70 79 28 74  );......memcpy(t
e940: 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20 6c 65 6e  mpbuf, vval, len
e950: 67 74 68 29 3b 0a 0a 09 09 09 09 63 75 72 72 5f  gth);......curr_
e960: 65 6e 74 69 74 79 2d 3e 74 61 67 20 3d 20 74 61  entity->tag = ta
e970: 67 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  g;.....curr_enti
e980: 74 79 2d 3e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  ty->length = len
e990: 67 74 68 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  gth;.....curr_en
e9a0: 74 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d  tity->value = tm
e9b0: 70 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65  pbuf;.....curr_e
e9c0: 6e 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e  ntity->_next = N
e9d0: 55 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  ULL;......break;
e9e0: 0a 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54  ....case GSCIS_T
e9f0: 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 3a 0a  AG_CERTIFICATE:.
ea00: 09 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 20  ....curr_entity 
ea10: 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
ea20: 2a 63 75 72 72 5f 65 6e 74 69 74 79 29 29 3b 0a  *curr_entity));.
ea30: 0a 23 69 66 64 65 66 20 48 41 56 45 5f 4c 49 42  .#ifdef HAVE_LIB
ea40: 5a 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20  Z.....tmpbuflen 
ea50: 3d 20 6c 65 6e 67 74 68 20 2a 20 32 3b 0a 09 09  = length * 2;...
ea60: 09 09 74 6d 70 62 75 66 20 3d 20 6d 61 6c 6c 6f  ..tmpbuf = mallo
ea70: 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b 0a 0a 09  c(tmpbuflen);...
ea80: 09 09 09 75 6e 63 6f 6d 70 72 65 73 73 5f 72 65  ...uncompress_re
ea90: 74 20 3d 20 75 6e 63 6f 6d 70 72 65 73 73 28 74  t = uncompress(t
eaa0: 6d 70 62 75 66 2c 20 26 74 6d 70 62 75 66 6c 65  mpbuf, &tmpbufle
eab0: 6e 2c 20 76 76 61 6c 2c 20 6c 65 6e 67 74 68 29  n, vval, length)
eac0: 3b 0a 09 09 09 09 69 66 20 28 75 6e 63 6f 6d 70  ;.....if (uncomp
ead0: 72 65 73 73 5f 72 65 74 20 21 3d 20 5a 5f 4f 4b  ress_ret != Z_OK
eae0: 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
eaf0: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61  DEBUG_PRINTF("Fa
eb00: 69 6c 65 64 20 74 6f 20 64 65 63 6f 6d 70 72 65  iled to decompre
eb10: 73 73 2c 20 75 6e 63 6f 6d 70 72 65 73 73 28 29  ss, uncompress()
eb20: 20 72 65 74 75 72 6e 65 64 20 25 69 20 2d 2d 20   returned %i -- 
eb30: 72 65 73 6f 72 74 69 6e 67 20 74 6f 20 64 69 72  resorting to dir
eb40: 65 63 74 20 63 6f 70 79 22 2c 20 75 6e 63 6f 6d  ect copy", uncom
eb50: 70 72 65 73 73 5f 72 65 74 29 3b 0a 0a 09 09 09  press_ret);.....
eb60: 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 6c 65  ..tmpbuflen = le
eb70: 6e 67 74 68 3b 0a 09 09 09 09 09 6d 65 6d 63 70  ngth;......memcp
eb80: 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c 2c 20  y(tmpbuf, vval, 
eb90: 6c 65 6e 67 74 68 29 3b 0a 09 09 09 09 7d 0a 0a  length);.....}..
eba0: 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
ebb0: 5f 50 52 49 4e 54 42 55 46 28 22 44 65 63 6f 6d  _PRINTBUF("Decom
ebc0: 70 72 65 73 73 65 64 20 74 6f 3a 22 2c 20 74 6d  pressed to:", tm
ebd0: 70 62 75 66 2c 20 74 6d 70 62 75 66 6c 65 6e 29  pbuf, tmpbuflen)
ebe0: 3b 0a 23 65 6c 73 65 0a 09 09 09 09 43 41 43 4b  ;.#else.....CACK
ebf0: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
ec00: 22 4d 69 73 73 69 6e 67 20 5a 4c 49 42 20 53 75  "Missing ZLIB Su
ec10: 70 70 6f 72 74 2c 20 74 68 69 73 20 63 65 72 74  pport, this cert
ec20: 69 66 69 63 61 74 65 20 69 73 20 6c 69 6b 65 6c  ificate is likel
ec30: 79 20 75 73 65 6c 65 73 73 2e 2e 2e 22 29 3b 0a  y useless...");.
ec40: 0a 09 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d  .....tmpbuflen =
ec50: 20 6c 65 6e 67 74 68 3b 0a 09 09 09 09 6d 65 6d   length;.....mem
ec60: 63 70 79 28 74 6d 70 62 75 66 2c 20 76 76 61 6c  cpy(tmpbuf, vval
ec70: 2c 20 6c 65 6e 67 74 68 29 3b 0a 23 65 6e 64 69  , length);.#endi
ec80: 66 0a 0a 09 09 09 09 63 75 72 72 5f 65 6e 74 69  f......curr_enti
ec90: 74 79 2d 3e 74 61 67 20 3d 20 74 61 67 3b 0a 09  ty->tag = tag;..
eca0: 09 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e  ...curr_entity->
ecb0: 6c 65 6e 67 74 68 20 3d 20 74 6d 70 62 75 66 6c  length = tmpbufl
ecc0: 65 6e 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e 74  en;.....curr_ent
ecd0: 69 74 79 2d 3e 76 61 6c 75 65 20 3d 20 74 6d 70  ity->value = tmp
ece0: 62 75 66 3b 0a 09 09 09 09 63 75 72 72 5f 65 6e  buf;.....curr_en
ecf0: 74 69 74 79 2d 3e 5f 6e 65 78 74 20 3d 20 4e 55  tity->_next = NU
ed00: 4c 4c 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  LL;......break;.
ed10: 09 09 09 63 61 73 65 20 47 53 43 49 53 5f 54 41  ...case GSCIS_TA
ed20: 47 5f 50 4b 43 53 31 35 3a 0a 09 09 09 09 63 75  G_PKCS15:.....cu
ed30: 72 72 5f 65 6e 74 69 74 79 20 3d 20 6d 61 6c 6c  rr_entity = mall
ed40: 6f 63 28 73 69 7a 65 6f 66 28 2a 63 75 72 72 5f  oc(sizeof(*curr_
ed50: 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09 09 63  entity));......c
ed60: 75 72 72 5f 65 6e 74 69 74 79 2d 3e 74 61 67 20  urr_entity->tag 
ed70: 3d 20 74 61 67 3b 0a 09 09 09 09 63 75 72 72 5f  = tag;.....curr_
ed80: 65 6e 74 69 74 79 2d 3e 76 61 6c 75 65 5f 62 79  entity->value_by
ed90: 74 65 20 3d 20 76 76 61 6c 5b 30 5d 3b 0a 09 09  te = vval[0];...
eda0: 09 09 63 75 72 72 5f 65 6e 74 69 74 79 2d 3e 5f  ..curr_entity->_
edb0: 6e 65 78 74 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09  next = NULL;....
edc0: 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
edd0: 76 76 61 6c 20 2b 3d 20 6c 65 6e 67 74 68 3b 0a  vval += length;.
ede0: 09 09 76 6c 65 6e 20 2d 3d 20 6c 65 6e 67 74 68  ..vlen -= length
edf0: 3b 0a 0a 09 09 69 66 20 28 63 75 72 72 5f 65 6e  ;....if (curr_en
ee00: 74 69 74 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  tity != NULL) {.
ee10: 09 09 09 69 66 20 28 72 6f 6f 74 20 3d 3d 20 4e  ...if (root == N
ee20: 55 4c 4c 29 20 7b 0a 09 09 09 09 72 6f 6f 74 20  ULL) {.....root 
ee30: 3d 20 63 75 72 72 5f 65 6e 74 69 74 79 3b 0a 09  = curr_entity;..
ee40: 09 09 7d 0a 0a 09 09 09 69 66 20 28 6c 61 73 74  ..}.....if (last
ee50: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09   != NULL) {.....
ee60: 6c 61 73 74 2d 3e 5f 6e 65 78 74 20 3d 20 63 75  last->_next = cu
ee70: 72 72 5f 65 6e 74 69 74 79 3b 0a 09 09 09 7d 0a  rr_entity;....}.
ee80: 0a 09 09 09 6c 61 73 74 20 3d 20 63 75 72 72 5f  ....last = curr_
ee90: 65 6e 74 69 74 79 3b 0a 09 09 7d 0a 09 7d 0a 0a  entity;...}..}..
eea0: 09 72 65 74 75 72 6e 28 72 6f 6f 74 29 3b 0a 7d  .return(root);.}
eeb0: 0a 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53  ../*. * SYNPOSIS
eec0: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
eed0: 2a 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20  * ARGUMENTS. *  
eee0: 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54     .... *. * RET
eef0: 55 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20  URN VALUE. *    
ef00: 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53   .... *. * NOTES
ef10: 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
ef20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
ef30: 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
ef40: 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70  (struct cackey_p
ef50: 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74  csc_identity *st
ef60: 61 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e  art, size_t coun
ef70: 74 2c 20 69 6e 74 20 66 72 65 65 5f 73 74 61 72  t, int free_star
ef80: 74 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78  t) {..size_t idx
ef90: 3b 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d  ;...if (start ==
efa0: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
efb0: 6e 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78  n;..}...for (idx
efc0: 20 3d 20 30 3b 20 69 64 78 20 3c 20 63 6f 75 6e   = 0; idx < coun
efd0: 74 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66  t; idx++) {...if
efe0: 20 28 73 74 61 72 74 5b 69 64 78 5d 2e 63 65 72   (start[idx].cer
eff0: 74 69 66 69 63 61 74 65 29 20 7b 0a 09 09 09 66  tificate) {....f
f000: 72 65 65 28 73 74 61 72 74 5b 69 64 78 5d 2e 63  ree(start[idx].c
f010: 65 72 74 69 66 69 63 61 74 65 29 3b 0a 09 09 7d  ertificate);...}
f020: 0a 09 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 73  ..}...if (free_s
f030: 74 61 72 74 29 20 7b 0a 09 09 66 72 65 65 28 73  tart) {...free(s
f040: 74 61 72 74 29 3b 0a 09 7d 0a 0a 09 72 65 74 75  tart);..}...retu
f050: 72 6e 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 74  rn;.}..static st
f060: 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63  ruct cackey_pcsc
f070: 5f 69 64 65 6e 74 69 74 79 20 2a 63 61 63 6b 65  _identity *cacke
f080: 79 5f 63 6f 70 79 5f 63 65 72 74 73 28 73 74 72  y_copy_certs(str
f090: 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f  uct cackey_pcsc_
f0a0: 69 64 65 6e 74 69 74 79 20 2a 64 65 73 74 2c 20  identity *dest, 
f0b0: 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63  struct cackey_pc
f0c0: 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 73 74 61  sc_identity *sta
f0d0: 72 74 2c 20 73 69 7a 65 5f 74 20 63 6f 75 6e 74  rt, size_t count
f0e0: 29 20 7b 0a 09 73 69 7a 65 5f 74 20 69 64 78 3b  ) {..size_t idx;
f0f0: 0a 0a 09 69 66 20 28 73 74 61 72 74 20 3d 3d 20  ...if (start == 
f100: 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e  NULL) {...return
f110: 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20  (NULL);..}...if 
f120: 28 64 65 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  (dest == NULL) {
f130: 0a 09 09 64 65 73 74 20 3d 20 6d 61 6c 6c 6f 63  ...dest = malloc
f140: 28 73 69 7a 65 6f 66 28 2a 64 65 73 74 29 20 2a  (sizeof(*dest) *
f150: 20 63 6f 75 6e 74 29 3b 0a 09 7d 0a 0a 09 66 6f   count);..}...fo
f160: 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
f170: 3c 20 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20  < count; idx++) 
f180: 7b 0a 09 09 64 65 73 74 5b 69 64 78 5d 2e 69 64  {...dest[idx].id
f190: 5f 74 79 70 65 20 3d 20 73 74 61 72 74 5b 69 64  _type = start[id
f1a0: 78 5d 2e 69 64 5f 74 79 70 65 3b 0a 0a 09 09 73  x].id_type;....s
f1b0: 77 69 74 63 68 20 28 64 65 73 74 5b 69 64 78 5d  witch (dest[idx]
f1c0: 2e 69 64 5f 74 79 70 65 29 20 7b 0a 09 09 09 63  .id_type) {....c
f1d0: 61 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59  ase CACKEY_ID_TY
f1e0: 50 45 5f 43 41 43 3a 0a 09 09 09 09 6d 65 6d 63  PE_CAC:.....memc
f1f0: 70 79 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72  py(dest[idx].car
f200: 64 2e 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 74  d.cac.applet, st
f210: 61 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61  art[idx].card.ca
f220: 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f 66  c.applet, sizeof
f230: 28 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  (dest[idx].card.
f240: 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09 09  cac.applet));...
f250: 09 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64  ..dest[idx].card
f260: 2e 63 61 63 2e 66 69 6c 65 20 3d 20 73 74 61 72  .cac.file = star
f270: 74 5b 69 64 78 5d 2e 63 61 72 64 2e 63 61 63 2e  t[idx].card.cac.
f280: 66 69 6c 65 3b 0a 09 09 09 09 62 72 65 61 6b 3b  file;.....break;
f290: 0a 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  ....case CACKEY_
f2a0: 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a 09 09 09  ID_TYPE_PIV:....
f2b0: 09 64 65 73 74 5b 69 64 78 5d 2e 63 61 72 64 2e  .dest[idx].card.
f2c0: 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20 73 74 61  piv.key_id = sta
f2d0: 72 74 5b 69 64 78 5d 2e 63 61 72 64 2e 70 69 76  rt[idx].card.piv
f2e0: 2e 6b 65 79 5f 69 64 3b 0a 09 09 09 09 62 72 65  .key_id;.....bre
f2f0: 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ak;....case CACK
f300: 45 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f  EY_ID_TYPE_CERT_
f310: 4f 4e 4c 59 3a 0a 09 09 09 09 62 72 65 61 6b 3b  ONLY:.....break;
f320: 0a 09 09 7d 0a 09 09 64 65 73 74 5b 69 64 78 5d  ...}...dest[idx]
f330: 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  .certificate_len
f340: 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e 63 65   = start[idx].ce
f350: 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 3b 0a 09  rtificate_len;..
f360: 09 64 65 73 74 5b 69 64 78 5d 2e 6b 65 79 73 69  .dest[idx].keysi
f370: 7a 65 20 3d 20 73 74 61 72 74 5b 69 64 78 5d 2e  ze = start[idx].
f380: 6b 65 79 73 69 7a 65 3b 0a 0a 09 09 64 65 73 74  keysize;....dest
f390: 5b 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74  [idx].certificat
f3a0: 65 20 3d 20 6d 61 6c 6c 6f 63 28 64 65 73 74 5b  e = malloc(dest[
f3b0: 69 64 78 5d 2e 63 65 72 74 69 66 69 63 61 74 65  idx].certificate
f3c0: 5f 6c 65 6e 29 3b 0a 09 09 6d 65 6d 63 70 79 28  _len);...memcpy(
f3d0: 64 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66  dest[idx].certif
f3e0: 69 63 61 74 65 2c 20 73 74 61 72 74 5b 69 64 78  icate, start[idx
f3f0: 5d 2e 63 65 72 74 69 66 69 63 61 74 65 2c 20 64  ].certificate, d
f400: 65 73 74 5b 69 64 78 5d 2e 63 65 72 74 69 66 69  est[idx].certifi
f410: 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09  cate_len);..}...
f420: 72 65 74 75 72 6e 28 64 65 73 74 29 3b 0a 7d 0a  return(dest);.}.
f430: 0a 2f 2a 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a  ./*. * SYNPOSIS.
f440: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
f450: 20 41 52 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20   ARGUMENTS. *   
f460: 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55    .... *. * RETU
f470: 52 4e 20 56 41 4c 55 45 0a 20 2a 20 20 20 20 20  RN VALUE. *     
f480: 2e 2e 2e 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a  .... *. * NOTES.
f490: 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a   *     .... *. *
f4a0: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
f4b0: 63 61 63 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e  cackey_pcsc_iden
f4c0: 74 69 74 79 20 2a 63 61 63 6b 65 79 5f 72 65 61  tity *cackey_rea
f4d0: 64 5f 63 65 72 74 73 28 73 74 72 75 63 74 20 63  d_certs(struct c
f4e0: 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
f4f0: 2c 20 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  , struct cackey_
f500: 70 63 73 63 5f 69 64 65 6e 74 69 74 79 20 2a 63  pcsc_identity *c
f510: 65 72 74 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  erts, unsigned l
f520: 6f 6e 67 20 2a 63 6f 75 6e 74 29 20 7b 0a 09 73  ong *count) {..s
f530: 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
f540: 63 5f 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72  c_identity *curr
f550: 5f 69 64 3b 0a 09 73 74 72 75 63 74 20 63 61 63  _id;..struct cac
f560: 6b 65 79 5f 74 6c 76 5f 65 6e 74 69 74 79 20 2a  key_tlv_entity *
f570: 63 63 63 5f 74 6c 76 2c 20 2a 63 63 63 5f 63 75  ccc_tlv, *ccc_cu
f580: 72 72 2c 20 2a 61 70 70 5f 74 6c 76 2c 20 2a 61  rr, *app_tlv, *a
f590: 70 70 5f 63 75 72 72 3b 0a 09 75 6e 73 69 67 6e  pp_curr;..unsign
f5a0: 65 64 20 63 68 61 72 20 63 63 63 5f 61 69 64 5b  ed char ccc_aid[
f5b0: 5d 20 3d 20 7b 47 53 43 49 53 5f 41 49 44 5f 43  ] = {GSCIS_AID_C
f5c0: 43 43 7d 2c 20 70 69 76 5f 61 69 64 5b 5d 20 3d  CC}, piv_aid[] =
f5d0: 20 7b 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33   {NISTSP800_73_3
f5e0: 5f 50 49 56 5f 41 49 44 7d 3b 0a 09 75 6e 73 69  _PIV_AID};..unsi
f5f0: 67 6e 65 64 20 63 68 61 72 20 2a 70 69 76 5f 6f  gned char *piv_o
f600: 69 64 2c 20 70 69 76 5f 6f 69 64 5f 70 69 76 61  id, piv_oid_piva
f610: 75 74 68 5b 5d 20 3d 20 7b 4e 49 53 54 53 50 38  uth[] = {NISTSP8
f620: 30 30 5f 37 33 5f 33 5f 4f 49 44 5f 50 49 56 41  00_73_3_OID_PIVA
f630: 55 54 48 7d 2c 20 70 69 76 5f 6f 69 64 5f 73 69  UTH}, piv_oid_si
f640: 67 6e 61 74 75 72 65 5b 5d 20 3d 20 7b 4e 49 53  gnature[] = {NIS
f650: 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f 49 44 5f  TSP800_73_3_OID_
f660: 53 49 47 4e 41 54 55 52 45 7d 2c 20 70 69 76 5f  SIGNATURE}, piv_
f670: 6f 69 64 5f 6b 65 79 6d 67 74 5b 5d 20 3d 20 7b  oid_keymgt[] = {
f680: 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33 5f 4f  NISTSP800_73_3_O
f690: 49 44 5f 4b 45 59 4d 47 54 7d 3b 0a 09 75 6e 73  ID_KEYMGT};..uns
f6a0: 69 67 6e 65 64 20 63 68 61 72 20 63 75 72 72 5f  igned char curr_
f6b0: 61 69 64 5b 37 5d 3b 0a 09 75 6e 73 69 67 6e 65  aid[7];..unsigne
f6c0: 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 38 31  d char buffer[81
f6d0: 39 32 5d 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  92];..unsigned l
f6e0: 6f 6e 67 20 6f 75 74 69 64 78 20 3d 20 30 3b 0a  ong outidx = 0;.
f6f0: 09 63 61 63 6b 65 79 5f 72 65 74 20 74 72 61 6e  .cackey_ret tran
f700: 73 61 63 74 69 6f 6e 5f 72 65 74 3b 0a 09 73 73  saction_ret;..ss
f710: 69 7a 65 5f 74 20 72 65 61 64 5f 72 65 74 3b 0a  ize_t read_ret;.
f720: 09 69 6e 74 20 63 65 72 74 73 5f 72 65 73 69 7a  .int certs_resiz
f730: 61 62 6c 65 3b 0a 09 69 6e 74 20 73 65 6e 64 5f  able;..int send_
f740: 72 65 74 2c 20 73 65 6c 65 63 74 5f 72 65 74 3b  ret, select_ret;
f750: 0a 09 69 6e 74 20 70 69 76 5f 6b 65 79 2c 20 70  ..int piv_key, p
f760: 69 76 20 3d 20 30 3b 0a 09 69 6e 74 20 69 64 78  iv = 0;..int idx
f770: 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
f780: 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
f790: 22 29 3b 0a 0a 09 69 66 20 28 63 6f 75 6e 74 20  ");...if (count 
f7a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
f7b0: 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
f7c0: 28 22 63 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2c  ("count is NULL,
f7d0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
f7e0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 72 65 74 75  ilure");....retu
f7f0: 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69  rn(NULL);..}...i
f800: 66 20 28 63 65 72 74 73 20 21 3d 20 4e 55 4c 4c  f (certs != NULL
f810: 29 20 7b 0a 09 09 69 66 20 28 2a 63 6f 75 6e 74  ) {...if (*count
f820: 20 3d 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   == 0) {....CACK
f830: 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
f840: 22 52 65 71 75 65 73 74 65 64 20 77 65 20 72 65  "Requested we re
f850: 74 75 72 6e 20 30 20 6f 62 6a 65 63 74 73 2c 20  turn 0 objects, 
f860: 73 68 6f 72 74 2d 63 69 72 63 75 69 74 22 29 3b  short-circuit");
f870: 0a 0a 09 09 09 72 65 74 75 72 6e 28 63 65 72 74  .....return(cert
f880: 73 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69 66 20  s);...}..}...if 
f890: 28 21 73 6c 6f 74 2d 3e 73 6c 6f 74 5f 72 65 73  (!slot->slot_res
f8a0: 65 74 29 20 7b 0a 09 09 69 66 20 28 73 6c 6f 74  et) {...if (slot
f8b0: 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73 29 20  ->cached_certs) 
f8c0: 7b 0a 09 09 09 69 66 20 28 63 65 72 74 73 20 3d  {....if (certs =
f8d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 09 63 65  = NULL) {.....ce
f8e0: 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  rts = malloc(siz
f8f0: 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 73 6c  eof(*certs) * sl
f900: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
f910: 5f 63 6f 75 6e 74 29 3b 0a 09 09 09 09 2a 63 6f  _count);.....*co
f920: 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61 63 68  unt = slot->cach
f930: 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 3b 0a  ed_certs_count;.
f940: 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
f950: 09 69 66 20 28 2a 63 6f 75 6e 74 20 3e 20 73 6c  .if (*count > sl
f960: 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74 73  ot->cached_certs
f970: 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 2a  _count) {......*
f980: 63 6f 75 6e 74 20 3d 20 73 6c 6f 74 2d 3e 63 61  count = slot->ca
f990: 63 68 65 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74  ched_certs_count
f9a0: 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  ;.....}....}....
f9b0: 09 63 61 63 6b 65 79 5f 63 6f 70 79 5f 63 65 72  .cackey_copy_cer
f9c0: 74 73 28 63 65 72 74 73 2c 20 73 6c 6f 74 2d 3e  ts(certs, slot->
f9d0: 63 61 63 68 65 64 5f 63 65 72 74 73 2c 20 2a 63  cached_certs, *c
f9e0: 6f 75 6e 74 29 3b 0a 0a 09 09 09 72 65 74 75 72  ount);.....retur
f9f0: 6e 28 63 65 72 74 73 29 3b 0a 09 09 7d 0a 09 7d  n(certs);...}..}
fa00: 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 63 61 63  ...if (slot->cac
fa10: 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09 09 63  hed_certs) {...c
fa20: 61 63 6b 65 79 5f 66 72 65 65 5f 63 65 72 74 73  ackey_free_certs
fa30: 28 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  (slot->cached_ce
fa40: 72 74 73 2c 20 73 6c 6f 74 2d 3e 63 61 63 68 65  rts, slot->cache
fa50: 64 5f 63 65 72 74 73 5f 63 6f 75 6e 74 2c 20 31  d_certs_count, 1
fa60: 29 3b 0a 0a 09 09 73 6c 6f 74 2d 3e 63 61 63 68  );....slot->cach
fa70: 65 64 5f 63 65 72 74 73 20 3d 20 4e 55 4c 4c 3b  ed_certs = NULL;
fa80: 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e 20 61  ..}.../* Begin a
fa90: 20 53 6d 61 72 74 43 61 72 64 20 74 72 61 6e 73   SmartCard trans
faa0: 61 63 74 69 6f 6e 20 2a 2f 0a 09 74 72 61 6e 73  action */..trans
fab0: 61 63 74 69 6f 6e 5f 72 65 74 20 3d 20 63 61 63  action_ret = cac
fac0: 6b 65 79 5f 62 65 67 69 6e 5f 74 72 61 6e 73 61  key_begin_transa
fad0: 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 09 69 66  ction(slot);..if
fae0: 20 28 74 72 61 6e 73 61 63 74 69 6f 6e 5f 72 65   (transaction_re
faf0: 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
fb00: 5f 53 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  _S_OK) {...CACKE
fb10: 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
fb20: 55 6e 61 62 6c 65 20 62 65 67 69 6e 20 74 72 61  Unable begin tra
fb30: 6e 73 61 63 74 69 6f 6e 2c 20 72 65 74 75 72 6e  nsaction, return
fb40: 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 22 29  ing in failure")
fb50: 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
fb60: 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 65 72 74  );..}...if (cert
fb70: 73 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 63  s == NULL) {...c
fb80: 65 72 74 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69  erts = malloc(si
fb90: 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a 20 35  zeof(*certs) * 5
fba0: 29 3b 0a 09 09 2a 63 6f 75 6e 74 20 3d 20 35 3b  );...*count = 5;
fbb0: 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61 62  ...certs_resizab
fbc0: 6c 65 20 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20  le = 1;..} else 
fbd0: 7b 0a 09 09 63 65 72 74 73 5f 72 65 73 69 7a 61  {...certs_resiza
fbe0: 62 6c 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09 2f 2a  ble = 0;..}.../*
fbf0: 20 53 65 6c 65 63 74 20 74 68 65 20 43 43 43 20   Select the CCC 
fc00: 41 70 70 6c 65 74 20 2a 2f 0a 09 73 65 6e 64 5f  Applet */..send_
fc10: 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c  ret = cackey_sel
fc20: 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74 2c  ect_applet(slot,
fc30: 20 63 63 63 5f 61 69 64 2c 20 73 69 7a 65 6f 66   ccc_aid, sizeof
fc40: 28 63 63 63 5f 61 69 64 29 29 3b 0a 09 69 66 20  (ccc_aid));..if 
fc50: 28 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43  (send_ret != CAC
fc60: 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b  KEY_PCSC_S_OK) {
fc70: 0a 09 09 2f 2a 20 54 72 79 20 50 49 56 20 61 70  .../* Try PIV ap
fc80: 70 6c 69 63 61 74 69 6f 6e 20 2a 2f 0a 09 09 73  plication */...s
fc90: 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
fca0: 5f 73 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73  _select_applet(s
fcb0: 6c 6f 74 2c 20 70 69 76 5f 61 69 64 2c 20 73 69  lot, piv_aid, si
fcc0: 7a 65 6f 66 28 70 69 76 5f 61 69 64 29 29 3b 0a  zeof(piv_aid));.
fcd0: 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d  ..if (send_ret =
fce0: 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f  = CACKEY_PCSC_S_
fcf0: 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OK) {....CACKEY_
fd00: 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 57 65  DEBUG_PRINTF("We
fd10: 20 68 61 76 65 20 61 20 50 49 56 20 63 61 72 64   have a PIV card
fd20: 20 2d 2d 20 6e 6f 74 20 75 73 69 6e 67 20 74 68   -- not using th
fd30: 65 20 43 43 43 2c 20 70 75 6c 6c 69 6e 67 20 70  e CCC, pulling p
fd40: 72 65 2d 73 65 6c 65 63 74 65 64 20 6b 65 79 73  re-selected keys
fd50: 22 29 3b 0a 0a 09 09 09 70 69 76 20 3d 20 31 3b  ");.....piv = 1;
fd60: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 43  ...} else {....C
fd70: 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
fd80: 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 73 65  TF("Unable to se
fd90: 6c 65 63 74 20 43 43 43 20 41 70 70 6c 65 74 2c  lect CCC Applet,
fda0: 20 72 65 74 75 72 6e 69 6e 67 20 69 6e 20 66 61   returning in fa
fdb0: 69 6c 75 72 65 22 29 3b 0a 0a 09 09 09 2f 2a 20  ilure");...../* 
fdc0: 54 65 72 6d 69 6e 61 74 65 20 53 6d 61 72 74 43  Terminate SmartC
fdd0: 61 72 64 20 54 72 61 6e 73 61 63 74 69 6f 6e 20  ard Transaction 
fde0: 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
fdf0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
fe00: 74 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 4e  t);.....return(N
fe10: 55 4c 4c 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 69  ULL);...}..}...i
fe20: 66 20 28 70 69 76 29 20 7b 0a 09 09 66 6f 72 20  f (piv) {...for 
fe30: 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20  (idx = 0; idx < 
fe40: 33 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 09 73  3; idx++) {....s
fe50: 77 69 74 63 68 20 28 69 64 78 29 20 7b 0a 09 09  witch (idx) {...
fe60: 09 09 63 61 73 65 20 30 3a 0a 09 09 09 09 09 70  ..case 0:......p
fe70: 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f 6f 69 64  iv_oid = piv_oid
fe80: 5f 70 69 76 61 75 74 68 3b 0a 09 09 09 09 09 70  _pivauth;......p
fe90: 69 76 5f 6b 65 79 20 3d 20 4e 49 53 54 53 50 38  iv_key = NISTSP8
fea0: 30 30 5f 37 38 5f 33 5f 4b 45 59 5f 50 49 56 41  00_78_3_KEY_PIVA
feb0: 55 54 48 3b 0a 09 09 09 09 09 62 72 65 61 6b 3b  UTH;......break;
fec0: 0a 09 09 09 09 63 61 73 65 20 31 3a 0a 09 09 09  .....case 1:....
fed0: 09 09 70 69 76 5f 6f 69 64 20 3d 20 70 69 76 5f  ..piv_oid = piv_
fee0: 6f 69 64 5f 73 69 67 6e 61 74 75 72 65 3b 0a 09  oid_signature;..
fef0: 09 09 09 09 70 69 76 5f 6b 65 79 20 3d 20 4e 49  ....piv_key = NI
ff00: 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 4b 45 59  STSP800_78_3_KEY
ff10: 5f 53 49 47 4e 41 54 55 52 45 3b 0a 09 09 09 09  _SIGNATURE;.....
ff20: 09 62 72 65 61 6b 3b 0a 09 09 09 09 63 61 73 65  .break;.....case
ff30: 20 32 3a 0a 09 09 09 09 09 70 69 76 5f 6f 69 64   2:......piv_oid
ff40: 20 3d 20 70 69 76 5f 6f 69 64 5f 6b 65 79 6d 67   = piv_oid_keymg
ff50: 74 3b 0a 09 09 09 09 09 70 69 76 5f 6b 65 79 20  t;......piv_key 
ff60: 3d 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33  = NISTSP800_78_3
ff70: 5f 4b 45 59 5f 4b 45 59 4d 47 54 3b 0a 09 09 09  _KEY_KEYMGT;....
ff80: 09 09 62 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09  ..break;....}...
ff90: 09 09 72 65 61 64 5f 72 65 74 20 3d 20 63 61 63  ..read_ret = cac
ffa0: 6b 65 79 5f 67 65 74 5f 64 61 74 61 28 73 6c 6f  key_get_data(slo
ffb0: 74 2c 20 62 75 66 66 65 72 2c 20 73 69 7a 65 6f  t, buffer, sizeo
ffc0: 66 28 62 75 66 66 65 72 29 2c 20 70 69 76 5f 6f  f(buffer), piv_o
ffd0: 69 64 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 61  id);.....if (rea
ffe0: 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a 09 09  d_ret <= 0) {...
fff0: 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 09 7d  ..continue;....}
10000 0a 0a 09 09 09 63 75 72 72 5f 69 64 20 3d 20 26  .....curr_id = &
10010 63 65 72 74 73 5b 6f 75 74 69 64 78 5d 3b 0a 09  certs[outidx];..
10020 09 09 6f 75 74 69 64 78 2b 2b 3b 0a 0a 09 09 09  ..outidx++;.....
10030 63 75 72 72 5f 69 64 2d 3e 6b 65 79 73 69 7a 65  curr_id->keysize
10040 20 3d 20 2d 31 3b 0a 09 09 09 63 75 72 72 5f 69   = -1;....curr_i
10050 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43 41 43  d->id_type = CAC
10060 4b 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3b  KEY_ID_TYPE_PIV;
10070 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 61 72  ....curr_id->car
10080 64 2e 70 69 76 2e 6b 65 79 5f 69 64 20 3d 20 70  d.piv.key_id = p
10090 69 76 5f 6b 65 79 3b 0a 0a 09 09 09 63 75 72 72  iv_key;.....curr
100a0 5f 69 64 2d 3e 63 65 72 74 69 66 69 63 61 74 65  _id->certificate
100b0 5f 6c 65 6e 20 3d 20 72 65 61 64 5f 72 65 74 3b  _len = read_ret;
100c0 0a 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72  ....curr_id->cer
100d0 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c 6f  tificate = mallo
100e0 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69  c(curr_id->certi
100f0 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09 09  ficate_len);....
10100 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64 2d 3e  memcpy(curr_id->
10110 63 65 72 74 69 66 69 63 61 74 65 2c 20 62 75 66  certificate, buf
10120 66 65 72 20 2b 20 34 2c 20 63 75 72 72 5f 69 64  fer + 4, curr_id
10130 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ->certificate_le
10140 6e 20 2d 20 34 29 3b 20 2f 2a 20 58 58 58 20 54  n - 4); /* XXX T
10150 4f 44 4f 20 50 49 56 20 28 2d 34 20 68 65 61 64  ODO PIV (-4 head
10160 65 72 2c 20 2d 35 20 74 72 61 69 6c 65 72 20 3d  er, -5 trailer =
10170 3d 20 77 68 79 20 3f 29 20 2a 2f 0a 09 09 09 63  = why ?) */....c
10180 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69 63  urr_id->certific
10190 61 74 65 5f 6c 65 6e 20 2d 3d 20 34 3b 0a 09 09  ate_len -= 4;...
101a0 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66  .curr_id->certif
101b0 69 63 61 74 65 5f 6c 65 6e 20 2d 3d 20 35 3b 0a  icate_len -= 5;.
101c0 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09  ..}..} else {...
101d0 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20  /* Read all the 
101e0 61 70 70 6c 65 74 73 20 66 72 6f 6d 20 74 68 65  applets from the
101f0 20 43 43 43 27 73 20 54 4c 56 20 2a 2f 0a 09 09   CCC's TLV */...
10200 63 63 63 5f 74 6c 76 20 3d 20 63 61 63 6b 65 79  ccc_tlv = cackey
10210 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f 74 29 3b  _read_tlv(slot);
10220 0a 0a 09 09 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..../* Look for 
10230 43 41 52 44 55 52 4c 73 20 74 68 61 74 20 63 6f  CARDURLs that co
10240 6f 72 65 73 70 6f 6e 64 20 74 6f 20 50 4b 49 20  orespond to PKI 
10250 61 70 70 6c 65 74 73 20 2a 2f 0a 09 09 66 6f 72  applets */...for
10260 20 28 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63   (ccc_curr = ccc
10270 5f 74 6c 76 3b 20 63 63 63 5f 63 75 72 72 3b 20  _tlv; ccc_curr; 
10280 63 63 63 5f 63 75 72 72 20 3d 20 63 63 63 5f 63  ccc_curr = ccc_c
10290 75 72 72 2d 3e 5f 6e 65 78 74 29 20 7b 0a 09 09  urr->_next) {...
102a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
102b0 49 4e 54 46 28 22 46 6f 75 6e 64 20 74 61 67 3a  INTF("Found tag:
102c0 20 25 73 20 2e 2e 2e 20 22 2c 20 43 41 43 4b 45   %s ... ", CACKE
102d0 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 54 41 47  Y_DEBUG_FUNC_TAG
102e0 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
102f0 2d 3e 74 61 67 29 29 3b 0a 0a 09 09 09 69 66 20  ->tag));.....if 
10300 28 63 63 63 5f 63 75 72 72 2d 3e 74 61 67 20 21  (ccc_curr->tag !
10310 3d 20 47 53 43 49 53 5f 54 41 47 5f 43 41 52 44  = GSCIS_TAG_CARD
10320 55 52 4c 29 20 7b 0a 09 09 09 09 43 41 43 4b 45  URL) {.....CACKE
10330 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
10340 20 20 2e 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69    ... skipping i
10350 74 20 28 77 65 20 6f 6e 6c 79 20 63 61 72 65 20  t (we only care 
10360 61 62 6f 75 74 20 43 41 52 44 55 52 4c 73 29 22  about CARDURLs)"
10370 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
10380 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 28  ;....}.....if ((
10390 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
103a0 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
103b0 20 26 20 43 41 43 4b 45 59 5f 54 4c 56 5f 41 50   & CACKEY_TLV_AP
103c0 50 5f 50 4b 49 29 20 21 3d 20 43 41 43 4b 45 59  P_PKI) != CACKEY
103d0 5f 54 4c 56 5f 41 50 50 5f 50 4b 49 29 20 7b 0a  _TLV_APP_PKI) {.
103e0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
103f0 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 73  _PRINTF("  ... s
10400 6b 69 70 70 69 6e 67 20 69 74 20 28 77 65 20 6f  kipping it (we o
10410 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 50  nly care about P
10420 4b 49 20 61 70 70 6c 65 74 73 2c 20 74 68 69 73  KI applets, this
10430 20 61 70 70 6c 65 74 20 73 75 70 70 6f 72 74 73   applet supports
10440 3a 20 25 73 2f 25 30 32 78 29 22 2c 20 43 41 43  : %s/%02x)", CAC
10450 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 41  KEY_DEBUG_FUNC_A
10460 50 50 54 59 50 45 5f 54 4f 5f 53 54 52 28 63 63  PPTYPE_TO_STR(cc
10470 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10480 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65 29 2c  rdurl->apptype),
10490 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
104a0 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f  ccc_curr->value_
104b0 63 61 72 64 75 72 6c 2d 3e 61 70 70 74 79 70 65  cardurl->apptype
104c0 29 3b 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65  );......continue
104d0 3b 0a 09 09 09 7d 0a 0a 09 09 09 43 41 43 4b 45  ;....}.....CACKE
104e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55 46  Y_DEBUG_PRINTBUF
104f0 28 22 52 49 44 3a 22 2c 20 63 63 63 5f 63 75 72  ("RID:", ccc_cur
10500 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
10510 2d 3e 72 69 64 2c 20 73 69 7a 65 6f 66 28 63 63  ->rid, sizeof(cc
10520 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10530 72 64 75 72 6c 2d 3e 72 69 64 29 29 3b 0a 09 09  rdurl->rid));...
10540 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
10550 49 4e 54 46 28 22 41 70 70 49 44 20 3d 20 25 73  INTF("AppID = %s
10560 2f 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f  /%04lx", CACKEY_
10570 44 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44  DEBUG_FUNC_OBJID
10580 5f 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72  _TO_STR(ccc_curr
10590 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d  ->value_cardurl-
105a0 3e 61 70 70 69 64 29 2c 20 28 75 6e 73 69 67 6e  >appid), (unsign
105b0 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63 75 72  ed long) ccc_cur
105c0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
105d0 2d 3e 61 70 70 69 64 29 3b 0a 09 09 09 43 41 43  ->appid);....CAC
105e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
105f0 28 22 4f 62 6a 65 63 74 49 44 20 3d 20 25 73 2f  ("ObjectID = %s/
10600 25 30 34 6c 78 22 2c 20 43 41 43 4b 45 59 5f 44  %04lx", CACKEY_D
10610 45 42 55 47 5f 46 55 4e 43 5f 4f 42 4a 49 44 5f  EBUG_FUNC_OBJID_
10620 54 4f 5f 53 54 52 28 63 63 63 5f 63 75 72 72 2d  TO_STR(ccc_curr-
10630 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e  >value_cardurl->
10640 6f 62 6a 65 63 74 69 64 29 2c 20 28 75 6e 73 69  objectid), (unsi
10650 67 6e 65 64 20 6c 6f 6e 67 29 20 63 63 63 5f 63  gned long) ccc_c
10660 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75  urr->value_cardu
10670 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29 3b 0a 0a  rl->objectid);..
10680 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 61  ...memcpy(curr_a
10690 69 64 2c 20 63 63 63 5f 63 75 72 72 2d 3e 76 61  id, ccc_curr->va
106a0 6c 75 65 5f 63 61 72 64 75 72 6c 2d 3e 72 69 64  lue_cardurl->rid
106b0 2c 20 73 69 7a 65 6f 66 28 63 63 63 5f 63 75 72  , sizeof(ccc_cur
106c0 72 2d 3e 76 61 6c 75 65 5f 63 61 72 64 75 72 6c  r->value_cardurl
106d0 2d 3e 72 69 64 29 29 3b 0a 09 09 09 63 75 72 72  ->rid));....curr
106e0 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75 72 72  _aid[sizeof(curr
106f0 5f 61 69 64 29 20 2d 20 32 5d 20 3d 20 28 63 63  _aid) - 2] = (cc
10700 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
10710 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 3e 3e 20  rdurl->appid >> 
10720 38 29 20 26 20 30 78 66 66 3b 0a 09 09 09 63 75  8) & 0xff;....cu
10730 72 72 5f 61 69 64 5b 73 69 7a 65 6f 66 28 63 75  rr_aid[sizeof(cu
10740 72 72 5f 61 69 64 29 20 2d 20 31 5d 20 3d 20 63  rr_aid) - 1] = c
10750 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63  cc_curr->value_c
10760 61 72 64 75 72 6c 2d 3e 61 70 70 69 64 20 26 20  ardurl->appid & 
10770 30 78 66 66 3b 0a 0a 09 09 09 2f 2a 20 53 65 6c  0xff;...../* Sel
10780 65 63 74 20 66 6f 75 6e 64 20 61 70 70 6c 65 74  ect found applet
10790 20 2e 2e 2e 20 2a 2f 0a 09 09 09 73 65 6c 65 63   ... */....selec
107a0 74 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  t_ret = cackey_s
107b0 65 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f  elect_applet(slo
107c0 74 2c 20 63 75 72 72 5f 61 69 64 2c 20 73 69 7a  t, curr_aid, siz
107d0 65 6f 66 28 63 75 72 72 5f 61 69 64 29 29 3b 0a  eof(curr_aid));.
107e0 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f 72 65  ...if (select_re
107f0 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t != CACKEY_PCSC
10800 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43  _S_OK) {.....CAC
10810 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
10820 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65 6c 65  ("Failed to sele
10830 63 74 20 61 70 70 6c 65 74 2c 20 73 6b 69 70 70  ct applet, skipp
10840 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
10850 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
10860 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
10870 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 2e 2e 2e 20  ...}...../* ... 
10880 61 6e 64 20 6f 62 6a 65 63 74 20 28 66 69 6c 65  and object (file
10890 29 20 2a 2f 0a 09 09 09 73 65 6c 65 63 74 5f 72  ) */....select_r
108a0 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6c 65  et = cackey_sele
108b0 63 74 5f 66 69 6c 65 28 73 6c 6f 74 2c 20 63 63  ct_file(slot, cc
108c0 63 5f 63 75 72 72 2d 3e 76 61 6c 75 65 5f 63 61  c_curr->value_ca
108d0 72 64 75 72 6c 2d 3e 6f 62 6a 65 63 74 69 64 29  rdurl->objectid)
108e0 3b 0a 09 09 09 69 66 20 28 73 65 6c 65 63 74 5f  ;....if (select_
108f0 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43  ret != CACKEY_PC
10900 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 09 43  SC_S_OK) {.....C
10910 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
10920 54 46 28 22 46 61 69 6c 65 64 20 74 6f 20 73 65  TF("Failed to se
10930 6c 65 63 74 20 66 69 6c 65 2c 20 73 6b 69 70 70  lect file, skipp
10940 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ing processing o
10950 66 20 74 68 69 73 20 6f 62 6a 65 63 74 22 29 3b  f this object");
10960 0a 0a 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  ......continue;.
10970 09 09 09 7d 0a 0a 09 09 09 2f 2a 20 50 72 6f 63  ...}...../* Proc
10980 65 73 73 20 74 68 69 73 20 66 69 6c 65 27 73 20  ess this file's 
10990 54 4c 56 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  TLV looking for 
109a0 63 65 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a  certificates */.
109b0 09 09 09 61 70 70 5f 74 6c 76 20 3d 20 63 61 63  ...app_tlv = cac
109c0 6b 65 79 5f 72 65 61 64 5f 74 6c 76 28 73 6c 6f  key_read_tlv(slo
109d0 74 29 3b 0a 09 0a 09 09 09 66 6f 72 20 28 61 70  t);......for (ap
109e0 70 5f 63 75 72 72 20 3d 20 61 70 70 5f 74 6c 76  p_curr = app_tlv
109f0 3b 20 61 70 70 5f 63 75 72 72 3b 20 61 70 70 5f  ; app_curr; app_
10a00 63 75 72 72 20 3d 20 61 70 70 5f 63 75 72 72 2d  curr = app_curr-
10a10 3e 5f 6e 65 78 74 29 20 7b 0a 09 09 09 09 43 41  >_next) {.....CA
10a20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
10a30 46 28 22 46 6f 75 6e 64 20 74 61 67 3a 20 25 73  F("Found tag: %s
10a40 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
10a50 46 55 4e 43 5f 54 41 47 5f 54 4f 5f 53 54 52 28  FUNC_TAG_TO_STR(
10a60 61 70 70 5f 63 75 72 72 2d 3e 74 61 67 29 29 3b  app_curr->tag));
10a70 0a 09 09 09 09 69 66 20 28 61 70 70 5f 63 75 72  .....if (app_cur
10a80 72 2d 3e 74 61 67 20 21 3d 20 47 53 43 49 53 5f  r->tag != GSCIS_
10a90 54 41 47 5f 43 45 52 54 49 46 49 43 41 54 45 29  TAG_CERTIFICATE)
10aa0 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44   {......CACKEY_D
10ab0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
10ac0 2e 2e 20 73 6b 69 70 70 69 6e 67 20 69 74 20 28  .. skipping it (
10ad0 77 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f  we only care abo
10ae0 75 74 20 43 45 52 54 49 46 49 43 41 54 45 73 29  ut CERTIFICATEs)
10af0 22 29 3b 0a 0a 09 09 09 09 09 63 6f 6e 74 69 6e  ");.......contin
10b00 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 63  ue;.....}......c
10b10 75 72 72 5f 69 64 20 3d 20 26 63 65 72 74 73 5b  urr_id = &certs[
10b20 6f 75 74 69 64 78 5d 3b 0a 09 09 09 09 6f 75 74  outidx];.....out
10b30 69 64 78 2b 2b 3b 0a 0a 09 09 09 09 63 75 72 72  idx++;......curr
10b40 5f 69 64 2d 3e 69 64 5f 74 79 70 65 20 3d 20 43  _id->id_type = C
10b50 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41  ACKEY_ID_TYPE_CA
10b60 43 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 63 75  C;.....memcpy(cu
10b70 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63 61 63 2e  rr_id->card.cac.
10b80 61 70 70 6c 65 74 2c 20 63 75 72 72 5f 61 69 64  applet, curr_aid
10b90 2c 20 73 69 7a 65 6f 66 28 63 75 72 72 5f 69 64  , sizeof(curr_id
10ba0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
10bb0 74 29 29 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  t));.....curr_id
10bc0 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 20  ->card.cac.file 
10bd0 3d 20 63 63 63 5f 63 75 72 72 2d 3e 76 61 6c 75  = ccc_curr->valu
10be0 65 5f 63 61 72 64 75 72 6c 2d 3e 6f 62 6a 65 63  e_cardurl->objec
10bf0 74 69 64 3b 0a 09 09 09 09 63 75 72 72 5f 69 64  tid;.....curr_id
10c00 2d 3e 6b 65 79 73 69 7a 65 20 3d 20 2d 31 3b 0a  ->keysize = -1;.
10c10 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
10c20 47 5f 50 52 49 4e 54 46 28 22 46 69 6c 6c 69 6e  G_PRINTF("Fillin
10c30 67 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  g curr_id->card.
10c40 63 61 63 2e 61 70 70 6c 65 74 20 28 25 70 29 20  cac.applet (%p) 
10c50 77 69 74 68 20 25 6c 75 20 62 79 74 65 73 3a 22  with %lu bytes:"
10c60 2c 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  , curr_id->card.
10c70 63 61 63 2e 61 70 70 6c 65 74 2c 20 28 75 6e 73  cac.applet, (uns
10c80 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 7a 65  igned long) size
10c90 6f 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64  of(curr_id->card
10ca0 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 09  .cac.applet));..
10cb0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
10cc0 50 52 49 4e 54 42 55 46 28 22 56 41 4c 3a 22 2c  PRINTBUF("VAL:",
10cd0 20 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e 63   curr_id->card.c
10ce0 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65 6f  ac.applet, sizeo
10cf0 66 28 63 75 72 72 5f 69 64 2d 3e 63 61 72 64 2e  f(curr_id->card.
10d00 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a 09  cac.applet));...
10d10 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  ...curr_id->cert
10d20 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 61 70  ificate_len = ap
10d30 70 5f 63 75 72 72 2d 3e 6c 65 6e 67 74 68 3b 0a  p_curr->length;.
10d40 0a 09 09 09 09 63 75 72 72 5f 69 64 2d 3e 63 65  .....curr_id->ce
10d50 72 74 69 66 69 63 61 74 65 20 3d 20 6d 61 6c 6c  rtificate = mall
10d60 6f 63 28 63 75 72 72 5f 69 64 2d 3e 63 65 72 74  oc(curr_id->cert
10d70 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
10d80 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f 69 64  ..memcpy(curr_id
10d90 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 61  ->certificate, a
10da0 70 70 5f 63 75 72 72 2d 3e 76 61 6c 75 65 2c 20  pp_curr->value, 
10db0 63 75 72 72 5f 69 64 2d 3e 63 65 72 74 69 66 69  curr_id->certifi
10dc0 63 61 74 65 5f 6c 65 6e 29 3b 0a 0a 09 09 09 09  cate_len);......
10dd0 69 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63  if (outidx >= *c
10de0 6f 75 6e 74 29 20 7b 0a 09 09 09 09 09 69 66 20  ount) {......if 
10df0 28 63 65 72 74 73 5f 72 65 73 69 7a 61 62 6c 65  (certs_resizable
10e00 29 20 7b 0a 09 09 09 09 09 09 2a 63 6f 75 6e 74  ) {.......*count
10e10 20 2a 3d 20 32 3b 0a 09 09 09 09 09 09 63 65 72   *= 2;.......cer
10e20 74 73 20 3d 20 72 65 61 6c 6c 6f 63 28 63 65 72  ts = realloc(cer
10e30 74 73 2c 20 73 69 7a 65 6f 66 28 2a 63 65 72 74  ts, sizeof(*cert
10e40 73 29 20 2a 20 28 2a 63 6f 75 6e 74 29 29 3b 0a  s) * (*count));.
10e50 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
10e60 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09  ....break;......
10e70 7d 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09  }.....}....}....
10e80 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76  .cackey_free_tlv
10e90 28 61 70 70 5f 74 6c 76 29 3b 0a 0a 09 09 09 69  (app_tlv);.....i
10ea0 66 20 28 6f 75 74 69 64 78 20 3e 3d 20 2a 63 6f  f (outidx >= *co
10eb0 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65 61 6b  unt) {.....break
10ec0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 61  ;....}...}....ca
10ed0 63 6b 65 79 5f 66 72 65 65 5f 74 6c 76 28 63 63  ckey_free_tlv(cc
10ee0 63 5f 74 6c 76 29 3b 0a 09 7d 0a 0a 09 2a 63 6f  c_tlv);..}...*co
10ef0 75 6e 74 20 3d 20 6f 75 74 69 64 78 3b 0a 0a 09  unt = outidx;...
10f00 69 66 20 28 63 65 72 74 73 5f 72 65 73 69 7a 61  if (certs_resiza
10f10 62 6c 65 29 20 7b 0a 09 09 63 65 72 74 73 20 3d  ble) {...certs =
10f20 20 72 65 61 6c 6c 6f 63 28 63 65 72 74 73 2c 20   realloc(certs, 
10f30 73 69 7a 65 6f 66 28 2a 63 65 72 74 73 29 20 2a  sizeof(*certs) *
10f40 20 28 2a 63 6f 75 6e 74 29 29 3b 0a 09 7d 0a 0a   (*count));..}..
10f50 09 73 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65  .slot->cached_ce
10f60 72 74 73 20 3d 20 63 61 63 6b 65 79 5f 63 6f 70  rts = cackey_cop
10f70 79 5f 63 65 72 74 73 28 4e 55 4c 4c 2c 20 63 65  y_certs(NULL, ce
10f80 72 74 73 2c 20 2a 63 6f 75 6e 74 29 3b 0a 09 73  rts, *count);..s
10f90 6c 6f 74 2d 3e 63 61 63 68 65 64 5f 63 65 72 74  lot->cached_cert
10fa0 73 5f 63 6f 75 6e 74 20 3d 20 2a 63 6f 75 6e 74  s_count = *count
10fb0 3b 0a 0a 09 2f 2a 20 54 65 72 6d 69 6e 61 74 65  ;.../* Terminate
10fc0 20 53 6d 61 72 74 43 61 72 64 20 54 72 61 6e 73   SmartCard Trans
10fd0 61 63 74 69 6f 6e 20 2a 2f 0a 09 63 61 63 6b 65  action */..cacke
10fe0 79 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  y_end_transactio
10ff0 6e 28 73 6c 6f 74 29 3b 0a 0a 09 72 65 74 75 72  n(slot);...retur
11000 6e 28 63 65 72 74 73 29 3b 0a 7d 0a 0a 2f 2a 0a  n(certs);.}../*.
11010 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20 20   * SYNPOSIS. *  
11020 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47     .... *. * ARG
11030 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e 2e  UMENTS. *     ..
11040 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20 56  .. *. * RETURN V
11050 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a  ALUE. *     ....
11060 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20 20   *. * NOTES. *  
11070 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74     .... *. */.st
11080 61 74 69 63 20 73 73 69 7a 65 5f 74 20 63 61 63  atic ssize_t cac
11090 6b 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28  key_signdecrypt(
110a0 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c  struct cackey_sl
110b0 6f 74 20 2a 73 6c 6f 74 2c 20 73 74 72 75 63 74  ot *slot, struct
110c0 20 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79   cackey_identity
110d0 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
110e0 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
110f0 73 69 7a 65 5f 74 20 62 75 66 6c 65 6e 2c 20 75  size_t buflen, u
11100 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
11110 74 62 75 66 2c 20 73 69 7a 65 5f 74 20 6f 75 74  tbuf, size_t out
11120 62 75 66 6c 65 6e 2c 20 69 6e 74 20 70 61 64 49  buflen, int padI
11130 6e 70 75 74 2c 20 69 6e 74 20 75 6e 70 61 64 4f  nput, int unpadO
11140 75 74 70 75 74 29 20 7b 0a 09 63 61 63 6b 65 79  utput) {..cackey
11150 5f 70 63 73 63 5f 69 64 5f 74 79 70 65 20 69 64  _pcsc_id_type id
11160 5f 74 79 70 65 3b 0a 09 75 6e 73 69 67 6e 65 64  _type;..unsigned
11170 20 63 68 61 72 20 64 79 6e 5f 61 75 74 68 5f 74   char dyn_auth_t
11180 65 6d 70 6c 61 74 65 5b 31 30 5d 3b 0a 09 75 6e  emplate[10];..un
11190 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 6d 70  signed char *tmp
111a0 62 75 66 2c 20 2a 74 6d 70 62 75 66 5f 73 2c 20  buf, *tmpbuf_s, 
111b0 2a 6f 75 74 62 75 66 5f 73 3b 0a 09 75 6e 73 69  *outbuf_s;..unsi
111c0 67 6e 65 64 20 63 68 61 72 20 62 79 74 65 73 5f  gned char bytes_
111d0 74 6f 5f 73 65 6e 64 2c 20 70 31 2c 20 63 6c 61  to_send, p1, cla
111e0 73 73 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  ss;..unsigned ch
111f0 61 72 20 62 6c 6f 63 6b 74 79 70 65 3b 0a 09 63  ar blocktype;..c
11200 61 63 6b 65 79 5f 72 65 74 20 73 65 6e 64 5f 72  ackey_ret send_r
11210 65 74 3b 0a 09 75 69 6e 74 31 36 5f 74 20 72 65  et;..uint16_t re
11220 73 70 63 6f 64 65 3b 0a 09 73 73 69 7a 65 5f 74  spcode;..ssize_t
11230 20 72 65 74 76 61 6c 20 3d 20 30 2c 20 75 6e 70   retval = 0, unp
11240 61 64 6f 66 66 73 65 74 3b 0a 09 73 69 7a 65 5f  adoffset;..size_
11250 74 20 74 6d 70 62 75 66 6c 65 6e 2c 20 70 61 64  t tmpbuflen, pad
11260 6c 65 6e 2c 20 74 6d 70 6f 75 74 62 75 66 6c 65  len, tmpoutbufle
11270 6e 3b 0a 09 69 6e 74 20 66 72 65 65 5f 74 6d 70  n;..int free_tmp
11280 62 75 66 20 3d 20 30 3b 0a 09 69 6e 74 20 6c 65  buf = 0;..int le
11290 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
112a0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
112b0 22 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 20 3d  ");...if (slot =
112c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
112d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
112e0 22 45 72 72 6f 72 2e 20 20 73 6c 6f 74 20 69 73  "Error.  slot is
112f0 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
11300 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
11310 28 62 75 66 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (buf == NULL) {.
11320 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11330 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 62  RINTF("Error.  b
11340 75 66 20 69 73 20 4e 55 4c 4c 22 29 3b 0a 0a 09  uf is NULL");...
11350 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
11360 0a 09 69 66 20 28 6f 75 74 62 75 66 20 3d 3d 20  ..if (outbuf == 
11370 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
11380 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
11390 72 72 6f 72 2e 20 20 6f 75 74 62 75 66 20 69 73  rror.  outbuf is
113a0 20 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75   NULL");....retu
113b0 72 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20  rn(-1);..}...if 
113c0 28 69 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c  (identity == NUL
113d0 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
113e0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
113f0 72 2e 20 20 69 64 65 6e 74 69 74 79 20 69 73 20  r.  identity is 
11400 4e 55 4c 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72  NULL");....retur
11410 6e 28 2d 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  n(-1);..}...if (
11420 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
11430 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
11440 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
11450 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
11460 20 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63    identity->pcsc
11470 5f 69 64 65 6e 74 69 74 79 20 69 73 20 4e 55 4c  _identity is NUL
11480 4c 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 2d  L");....return(-
11490 31 29 3b 0a 09 7d 0a 0a 09 69 64 5f 74 79 70 65  1);..}...id_type
114a0 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73   = identity->pcs
114b0 63 5f 69 64 65 6e 74 69 74 79 2d 3e 69 64 5f 74  c_identity->id_t
114c0 79 70 65 3b 0a 09 69 66 20 28 69 64 5f 74 79 70  ype;..if (id_typ
114d0 65 20 3d 3d 20 43 41 43 4b 45 59 5f 49 44 5f 54  e == CACKEY_ID_T
114e0 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59 29 20 7b  YPE_CERT_ONLY) {
114f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
11500 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
11510 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
11520 64 65 6e 74 69 74 79 20 69 73 20 43 41 43 4b 45  dentity is CACKE
11530 59 5f 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f  Y_ID_TYPE_CERT_O
11540 4e 4c 59 2c 20 77 68 69 63 68 20 63 61 6e 6e 6f  NLY, which canno
11550 74 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 69  t be used for si
11560 67 6e 2f 64 65 63 72 79 70 74 22 29 3b 0a 0a 09  gn/decrypt");...
11570 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d 0a  .return(-1);..}.
11580 0a 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70  ..switch (id_typ
11590 65 29 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b  e) {...case CACK
115a0 45 59 5f 49 44 5f 54 59 50 45 5f 50 49 56 3a 0a  EY_ID_TYPE_PIV:.
115b0 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49 44  ..case CACKEY_ID
115c0 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09 09 62 72  _TYPE_CAC:....br
115d0 65 61 6b 3b 0a 09 09 64 65 66 61 75 6c 74 3a 0a  eak;...default:.
115e0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
115f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
11600 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
11610 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74 20 61  dentity is not a
11620 20 73 75 70 70 6f 72 74 65 64 20 76 61 6c 75 65   supported value
11630 2e 20 54 79 70 65 20 69 73 3a 20 30 78 25 6c 78  . Type is: 0x%lx
11640 20 28 50 49 56 20 3d 20 30 78 25 6c 78 2c 20 43   (PIV = 0x%lx, C
11650 41 43 20 3d 20 30 78 25 6c 78 29 22 2c 20 28 75  AC = 0x%lx)", (u
11660 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 69 64  nsigned long) id
11670 5f 74 79 70 65 2c 20 28 75 6e 73 69 67 6e 65 64  _type, (unsigned
11680 20 6c 6f 6e 67 29 20 43 41 43 4b 45 59 5f 49 44   long) CACKEY_ID
11690 5f 54 59 50 45 5f 50 49 56 2c 20 28 75 6e 73 69  _TYPE_PIV, (unsi
116a0 67 6e 65 64 20 6c 6f 6e 67 29 20 43 41 43 4b 45  gned long) CACKE
116b0 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 29 3b 0a  Y_ID_TYPE_CAC);.
116c0 0a 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
116d0 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
116e0 65 20 69 64 65 6e 74 69 74 79 20 4b 65 79 20 73  e identity Key s
116f0 69 7a 65 20 2a 2f 0a 09 69 66 20 28 69 64 65 6e  ize */..if (iden
11700 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74  tity->pcsc_ident
11710 69 74 79 2d 3e 6b 65 79 73 69 7a 65 20 3c 20 30  ity->keysize < 0
11720 29 20 7b 0a 09 09 69 64 65 6e 74 69 74 79 2d 3e  ) {...identity->
11730 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b  pcsc_identity->k
11740 65 79 73 69 7a 65 20 3d 20 78 35 30 39 5f 74 6f  eysize = x509_to
11750 5f 6b 65 79 73 69 7a 65 28 69 64 65 6e 74 69 74  _keysize(identit
11760 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11770 2d 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 69  ->certificate, i
11780 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
11790 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66 69 63  entity->certific
117a0 61 74 65 5f 6c 65 6e 29 3b 0a 09 7d 0a 0a 09 2f  ate_len);..}.../
117b0 2a 20 50 61 64 20 6d 65 73 73 61 67 65 20 74 6f  * Pad message to
117c0 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 09 69 66   key size */..if
117d0 20 28 70 61 64 49 6e 70 75 74 29 20 7b 0a 09 09   (padInput) {...
117e0 69 66 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63  if (identity->pc
117f0 73 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79  sc_identity->key
11800 73 69 7a 65 20 3e 20 30 29 20 7b 0a 09 09 09 69  size > 0) {....i
11810 66 20 28 62 75 66 6c 65 6e 20 21 3d 20 69 64 65  f (buflen != ide
11820 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
11830 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 29 20 7b  tity->keysize) {
11840 0a 09 09 09 09 69 66 20 28 62 75 66 6c 65 6e 20  .....if (buflen 
11850 3e 20 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  > (identity->pcs
11860 63 5f 69 64 65 6e 74 69 74 79 2d 3e 6b 65 79 73  c_identity->keys
11870 69 7a 65 20 2b 20 33 29 29 20 7b 0a 09 09 09 09  ize + 3)) {.....
11880 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11890 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 65  INTF("Error.  Me
118a0 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
118b0 67 65 20 74 6f 20 73 69 67 6e 2f 64 65 63 72 79  ge to sign/decry
118c0 70 74 22 29 3b 0a 0a 09 09 09 09 09 72 65 74 75  pt");.......retu
118d0 72 6e 28 2d 31 29 3b 0a 09 09 09 09 7d 0a 0a 09  rn(-1);.....}...
118e0 09 09 09 74 6d 70 62 75 66 6c 65 6e 20 3d 20 69  ...tmpbuflen = i
118f0 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64  dentity->pcsc_id
11900 65 6e 74 69 74 79 2d 3e 6b 65 79 73 69 7a 65 3b  entity->keysize;
11910 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20 6d 61  .....tmpbuf = ma
11920 6c 6c 6f 63 28 74 6d 70 62 75 66 6c 65 6e 29 3b  lloc(tmpbuflen);
11930 0a 09 09 09 09 66 72 65 65 5f 74 6d 70 62 75 66  .....free_tmpbuf
11940 20 3d 20 31 3b 0a 0a 09 09 09 09 70 61 64 6c 65   = 1;......padle
11950 6e 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 2d 20  n = tmpbuflen - 
11960 62 75 66 6c 65 6e 20 2d 20 33 3b 0a 0a 09 09 09  buflen - 3;.....
11970 09 2f 2a 20 52 53 41 20 50 4b 43 53 23 31 20 45  ./* RSA PKCS#1 E
11980 4d 53 41 2d 50 4b 43 53 31 2d 76 31 5f 35 20 50  MSA-PKCS1-v1_5 P
11990 61 64 64 69 6e 67 20 2a 2f 0a 09 09 09 09 74 6d  adding */.....tm
119a0 70 62 75 66 5b 30 5d 20 3d 20 30 78 30 30 3b 0a  pbuf[0] = 0x00;.
119b0 09 09 09 09 74 6d 70 62 75 66 5b 31 5d 20 3d 20  ....tmpbuf[1] = 
119c0 30 78 30 31 3b 0a 09 09 09 09 6d 65 6d 73 65 74  0x01;.....memset
119d0 28 26 74 6d 70 62 75 66 5b 32 5d 2c 20 30 78 46  (&tmpbuf[2], 0xF
119e0 46 2c 20 70 61 64 6c 65 6e 29 3b 0a 09 09 09 09  F, padlen);.....
119f0 74 6d 70 62 75 66 5b 70 61 64 6c 65 6e 20 2b 20  tmpbuf[padlen + 
11a00 32 5d 3d 20 30 78 30 30 3b 0a 09 09 09 09 6d 65  2]= 0x00;.....me
11a10 6d 63 70 79 28 26 74 6d 70 62 75 66 5b 70 61 64  mcpy(&tmpbuf[pad
11a20 6c 65 6e 20 2b 20 33 5d 2c 20 62 75 66 2c 20 62  len + 3], buf, b
11a30 75 66 6c 65 6e 29 3b 0a 0a 09 09 09 09 43 41 43  uflen);......CAC
11a40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
11a50 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20  UF("Unpadded:", 
11a60 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09 09  buf, buflen);...
11a70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
11a80 52 49 4e 54 42 55 46 28 22 50 61 64 64 65 64 3a  RINTBUF("Padded:
11a90 22 2c 20 74 6d 70 62 75 66 2c 20 74 6d 70 62 75  ", tmpbuf, tmpbu
11aa0 66 6c 65 6e 29 3b 0a 09 09 09 7d 20 65 6c 73 65  flen);....} else
11ab0 20 7b 0a 09 09 09 09 74 6d 70 62 75 66 20 3d 20   {.....tmpbuf = 
11ac0 62 75 66 3b 0a 09 09 09 09 74 6d 70 62 75 66 6c  buf;.....tmpbufl
11ad0 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09  en = buflen;....
11ae0 09 66 72 65 65 5f 74 6d 70 62 75 66 20 3d 20 30  .free_tmpbuf = 0
11af0 3b 0a 09 09 09 09 70 61 64 6c 65 6e 20 3d 20 30  ;.....padlen = 0
11b00 3b 0a 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20  ;....}...} else 
11b10 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  {....CACKEY_DEBU
11b20 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65  G_PRINTF("Unable
11b30 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 6b 65   to determine ke
11b40 79 20 73 69 7a 65 2c 20 68 6f 70 69 6e 67 20 74  y size, hoping t
11b50 68 65 20 6d 65 73 73 61 67 65 20 69 73 20 70 72  he message is pr
11b60 6f 70 65 72 6c 79 20 70 61 64 64 65 64 21 22 29  operly padded!")
11b70 3b 0a 0a 09 09 09 74 6d 70 62 75 66 20 3d 20 62  ;.....tmpbuf = b
11b80 75 66 3b 0a 09 09 09 74 6d 70 62 75 66 6c 65 6e  uf;....tmpbuflen
11b90 20 3d 20 62 75 66 6c 65 6e 3b 0a 09 09 09 66 72   = buflen;....fr
11ba0 65 65 5f 74 6d 70 62 75 66 20 3d 20 30 3b 0a 09  ee_tmpbuf = 0;..
11bb0 09 09 70 61 64 6c 65 6e 20 3d 20 30 3b 0a 09 09  ..padlen = 0;...
11bc0 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 74 6d  }..} else {...tm
11bd0 70 62 75 66 20 3d 20 62 75 66 3b 0a 09 09 74 6d  pbuf = buf;...tm
11be0 70 62 75 66 6c 65 6e 20 3d 20 62 75 66 6c 65 6e  pbuflen = buflen
11bf0 3b 0a 09 09 66 72 65 65 5f 74 6d 70 62 75 66 20  ;...free_tmpbuf 
11c00 3d 20 30 3b 0a 09 09 70 61 64 6c 65 6e 20 3d 20  = 0;...padlen = 
11c10 30 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 65 67 69 6e  0;..}.../* Begin
11c20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
11c30 09 63 61 63 6b 65 79 5f 62 65 67 69 6e 5f 74 72  .cackey_begin_tr
11c40 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b  ansaction(slot);
11c50 0a 0a 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72  .../* Select cor
11c60 72 65 63 74 20 61 70 70 6c 65 74 20 2a 2f 0a 09  rect applet */..
11c70 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65 29  switch (id_type)
11c80 20 7b 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59   {...case CACKEY
11c90 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a 09 09  _ID_TYPE_CAC:...
11ca0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
11cb0 49 4e 54 46 28 22 53 65 6c 65 63 74 69 6e 67 20  INTF("Selecting 
11cc0 61 70 70 6c 65 74 20 66 6f 75 6e 64 20 61 74 20  applet found at 
11cd0 25 70 20 2e 2e 2e 22 2c 20 69 64 65 6e 74 69 74  %p ...", identit
11ce0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11cf0 2d 3e 63 61 72 64 2e 63 61 63 2e 61 70 70 6c 65  ->card.cac.apple
11d00 74 29 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  t);....cackey_se
11d10 6c 65 63 74 5f 61 70 70 6c 65 74 28 73 6c 6f 74  lect_applet(slot
11d20 2c 20 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63  , identity->pcsc
11d30 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e  _identity->card.
11d40 63 61 63 2e 61 70 70 6c 65 74 2c 20 73 69 7a 65  cac.applet, size
11d50 6f 66 28 69 64 65 6e 74 69 74 79 2d 3e 70 63 73  of(identity->pcs
11d60 63 5f 69 64 65 6e 74 69 74 79 2d 3e 63 61 72 64  c_identity->card
11d70 2e 63 61 63 2e 61 70 70 6c 65 74 29 29 3b 0a 0a  .cac.applet));..
11d80 09 09 09 2f 2a 20 53 65 6c 65 63 74 20 63 6f 72  .../* Select cor
11d90 72 65 63 74 20 66 69 6c 65 20 2a 2f 0a 09 09 09  rect file */....
11da0 63 61 63 6b 65 79 5f 73 65 6c 65 63 74 5f 66 69  cackey_select_fi
11db0 6c 65 28 73 6c 6f 74 2c 20 69 64 65 6e 74 69 74  le(slot, identit
11dc0 79 2d 3e 70 63 73 63 5f 69 64 65 6e 74 69 74 79  y->pcsc_identity
11dd0 2d 3e 63 61 72 64 2e 63 61 63 2e 66 69 6c 65 29  ->card.cac.file)
11de0 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61  ;....break;...ca
11df0 73 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50  se CACKEY_ID_TYP
11e00 45 5f 50 49 56 3a 0a 09 09 09 64 79 6e 5f 61 75  E_PIV:....dyn_au
11e10 74 68 5f 74 65 6d 70 6c 61 74 65 5b 30 5d 20 3d  th_template[0] =
11e20 20 30 78 37 43 3b 0a 09 09 09 64 79 6e 5f 61 75   0x7C;....dyn_au
11e30 74 68 5f 74 65 6d 70 6c 61 74 65 5b 31 5d 20 3d  th_template[1] =
11e40 20 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75   0x82;....dyn_au
11e50 74 68 5f 74 65 6d 70 6c 61 74 65 5b 32 5d 20 3d  th_template[2] =
11e60 20 28 28 74 6d 70 62 75 66 6c 65 6e 20 2b 20 36   ((tmpbuflen + 6
11e70 29 20 26 20 30 78 66 66 30 30 29 20 3e 3e 20 38  ) & 0xff00) >> 8
11e80 3b 0a 09 09 09 64 79 6e 5f 61 75 74 68 5f 74 65  ;....dyn_auth_te
11e90 6d 70 6c 61 74 65 5b 33 5d 20 3d 20 28 74 6d 70  mplate[3] = (tmp
11ea0 62 75 66 6c 65 6e 20 2b 20 36 29 20 26 20 30 78  buflen + 6) & 0x
11eb0 30 30 66 66 3b 0a 09 09 09 64 79 6e 5f 61 75 74  00ff;....dyn_aut
11ec0 68 5f 74 65 6d 70 6c 61 74 65 5b 34 5d 20 3d 20  h_template[4] = 
11ed0 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x82;....dyn_aut
11ee0 68 5f 74 65 6d 70 6c 61 74 65 5b 35 5d 20 3d 20  h_template[5] = 
11ef0 30 78 30 30 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x00;....dyn_aut
11f00 68 5f 74 65 6d 70 6c 61 74 65 5b 36 5d 20 3d 20  h_template[6] = 
11f10 30 78 38 31 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x81;....dyn_aut
11f20 68 5f 74 65 6d 70 6c 61 74 65 5b 37 5d 20 3d 20  h_template[7] = 
11f30 30 78 38 32 3b 0a 09 09 09 64 79 6e 5f 61 75 74  0x82;....dyn_aut
11f40 68 5f 74 65 6d 70 6c 61 74 65 5b 38 5d 20 3d 20  h_template[8] = 
11f50 28 74 6d 70 62 75 66 6c 65 6e 20 26 20 30 78 66  (tmpbuflen & 0xf
11f60 66 30 30 29 20 3e 3e 20 38 3b 0a 09 09 09 64 79  f00) >> 8;....dy
11f70 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61 74 65 5b  n_auth_template[
11f80 39 5d 20 3d 20 74 6d 70 62 75 66 6c 65 6e 20 26  9] = tmpbuflen &
11f90 20 30 78 30 30 66 66 3b 0a 0a 09 09 09 73 65 6e   0x00ff;.....sen
11fa0 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 73  d_ret = cackey_s
11fb0 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c 20 30  end_apdu(slot, 0
11fc0 78 31 30 2c 20 4e 49 53 54 53 50 38 30 30 5f 37  x10, NISTSP800_7
11fd0 33 5f 33 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54  3_3_INSTR_GENAUT
11fe0 48 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 38 5f  H, NISTSP800_78_
11ff0 33 5f 41 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20  3_ALGO_RSA2048, 
12000 69 64 65 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69  identity->pcsc_i
12010 64 65 6e 74 69 74 79 2d 3e 63 61 72 64 2e 70 69  dentity->card.pi
12020 76 2e 6b 65 79 5f 69 64 2c 20 73 69 7a 65 6f 66  v.key_id, sizeof
12030 28 64 79 6e 5f 61 75 74 68 5f 74 65 6d 70 6c 61  (dyn_auth_templa
12040 74 65 29 2c 20 64 79 6e 5f 61 75 74 68 5f 74 65  te), dyn_auth_te
12050 6d 70 6c 61 74 65 2c 20 30 78 30 30 2c 20 4e 55  mplate, 0x00, NU
12060 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
12070 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 61 73  ....break;...cas
12080 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
12090 5f 43 45 52 54 5f 4f 4e 4c 59 3a 0a 09 09 09 62  _CERT_ONLY:....b
120a0 72 65 61 6b 3b 0a 09 7d 0a 0a 09 74 6d 70 62 75  reak;..}...tmpbu
120b0 66 5f 73 20 3d 20 74 6d 70 62 75 66 3b 0a 09 6f  f_s = tmpbuf;..o
120c0 75 74 62 75 66 5f 73 20 3d 20 6f 75 74 62 75 66  utbuf_s = outbuf
120d0 3b 0a 09 77 68 69 6c 65 20 28 74 6d 70 62 75 66  ;..while (tmpbuf
120e0 6c 65 6e 29 20 7b 0a 09 09 74 6d 70 6f 75 74 62  len) {...tmpoutb
120f0 75 66 6c 65 6e 20 3d 20 6f 75 74 62 75 66 6c 65  uflen = outbufle
12100 6e 3b 0a 0a 09 09 69 66 20 28 74 6d 70 62 75 66  n;....if (tmpbuf
12110 6c 65 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44  len > CACKEY_APD
12120 55 5f 4d 54 55 29 20 7b 0a 09 09 09 62 79 74 65  U_MTU) {....byte
12130 73 5f 74 6f 5f 73 65 6e 64 20 3d 20 43 41 43 4b  s_to_send = CACK
12140 45 59 5f 41 50 44 55 5f 4d 54 55 3b 0a 09 09 7d  EY_APDU_MTU;...}
12150 20 65 6c 73 65 20 7b 0a 09 09 09 62 79 74 65 73   else {....bytes
12160 5f 74 6f 5f 73 65 6e 64 20 3d 20 74 6d 70 62 75  _to_send = tmpbu
12170 66 6c 65 6e 3b 0a 09 09 7d 0a 0a 09 09 73 65 6e  flen;...}....sen
12180 64 5f 72 65 74 20 3d 20 43 41 43 4b 45 59 5f 50  d_ret = CACKEY_P
12190 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 3b 0a 09  CSC_E_GENERIC;..
121a0 09 73 77 69 74 63 68 20 28 69 64 5f 74 79 70 65  .switch (id_type
121b0 29 20 7b 0a 09 09 09 63 61 73 65 20 43 41 43 4b  ) {....case CACK
121c0 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43 3a 0a  EY_ID_TYPE_CAC:.
121d0 09 09 09 09 69 66 20 28 74 6d 70 62 75 66 6c 65  ....if (tmpbufle
121e0 6e 20 3e 20 43 41 43 4b 45 59 5f 41 50 44 55 5f  n > CACKEY_APDU_
121f0 4d 54 55 29 20 7b 0a 09 09 09 09 09 70 31 20 3d  MTU) {......p1 =
12200 20 30 78 38 30 3b 0a 09 09 09 09 09 6c 65 20 3d   0x80;......le =
12210 20 30 78 30 30 3b 0a 09 09 09 09 7d 20 65 6c 73   0x00;.....} els
12220 65 20 7b 0a 09 09 09 09 09 70 31 20 3d 20 30 78  e {......p1 = 0x
12230 30 30 3b 0a 09 09 09 09 09 6c 65 20 3d 20 30 78  00;......le = 0x
12240 30 30 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 73  00;.....}......s
12250 65 6e 64 5f 72 65 74 20 3d 20 63 61 63 6b 65 79  end_ret = cackey
12260 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c 6f 74 2c  _send_apdu(slot,
12270 20 47 53 43 49 53 5f 43 4c 41 53 53 5f 47 4c 4f   GSCIS_CLASS_GLO
12280 42 41 4c 5f 50 4c 41 54 46 4f 52 4d 2c 20 47 53  BAL_PLATFORM, GS
12290 43 49 53 5f 49 4e 53 54 52 5f 53 49 47 4e 44 45  CIS_INSTR_SIGNDE
122a0 43 52 59 50 54 2c 20 70 31 2c 20 30 78 30 30 2c  CRYPT, p1, 0x00,
122b0 20 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 2c 20   bytes_to_send, 
122c0 74 6d 70 62 75 66 2c 20 6c 65 2c 20 26 72 65 73  tmpbuf, le, &res
122d0 70 63 6f 64 65 2c 20 6f 75 74 62 75 66 2c 20 26  pcode, outbuf, &
122e0 74 6d 70 6f 75 74 62 75 66 6c 65 6e 29 3b 0a 09  tmpoutbuflen);..
122f0 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73  ...break;....cas
12300 65 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45  e CACKEY_ID_TYPE
12310 5f 50 49 56 3a 0a 09 09 09 09 69 66 20 28 74 6d  _PIV:.....if (tm
12320 70 62 75 66 6c 65 6e 20 3e 20 43 41 43 4b 45 59  pbuflen > CACKEY
12330 5f 41 50 44 55 5f 4d 54 55 29 20 7b 0a 09 09 09  _APDU_MTU) {....
12340 09 09 63 6c 61 73 73 20 3d 20 30 78 31 30 3b 0a  ..class = 0x10;.
12350 09 09 09 09 09 6c 65 20 3d 20 30 78 30 30 3b 0a  .....le = 0x00;.
12360 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
12370 09 09 63 6c 61 73 73 20 3d 20 47 53 43 49 53 5f  ..class = GSCIS_
12380 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 3b 0a 09  CLASS_ISO7816;..
12390 09 09 09 09 6c 65 20 3d 20 32 35 36 3b 0a 09 09  ....le = 256;...
123a0 09 09 7d 0a 0a 09 09 09 09 73 65 6e 64 5f 72 65  ..}......send_re
123b0 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64 5f  t = cackey_send_
123c0 61 70 64 75 28 73 6c 6f 74 2c 20 63 6c 61 73 73  apdu(slot, class
123d0 2c 20 4e 49 53 54 53 50 38 30 30 5f 37 33 5f 33  , NISTSP800_73_3
123e0 5f 49 4e 53 54 52 5f 47 45 4e 41 55 54 48 2c 20  _INSTR_GENAUTH, 
123f0 4e 49 53 54 53 50 38 30 30 5f 37 38 5f 33 5f 41  NISTSP800_78_3_A
12400 4c 47 4f 5f 52 53 41 32 30 34 38 2c 20 69 64 65  LGO_RSA2048, ide
12410 6e 74 69 74 79 2d 3e 70 63 73 63 5f 69 64 65 6e  ntity->pcsc_iden
12420 74 69 74 79 2d 3e 63 61 72 64 2e 70 69 76 2e 6b  tity->card.piv.k
12430 65 79 5f 69 64 2c 20 62 79 74 65 73 5f 74 6f 5f  ey_id, bytes_to_
12440 73 65 6e 64 2c 20 74 6d 70 62 75 66 2c 20 6c 65  send, tmpbuf, le
12450 2c 20 26 72 65 73 70 63 6f 64 65 2c 20 6f 75 74  , &respcode, out
12460 62 75 66 2c 20 26 74 6d 70 6f 75 74 62 75 66 6c  buf, &tmpoutbufl
12470 65 6e 29 3b 0a 09 09 09 09 62 72 65 61 6b 3b 0a  en);.....break;.
12480 09 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f 49  ...case CACKEY_I
12490 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c 59  D_TYPE_CERT_ONLY
124a0 3a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d  :.....break;...}
124b0 0a 0a 09 09 69 66 20 28 73 65 6e 64 5f 72 65 74  ....if (send_ret
124c0 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   != CACKEY_PCSC_
124d0 53 5f 4f 4b 29 20 7b 0a 09 09 09 43 41 43 4b 45  S_OK) {....CACKE
124e0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
124f0 41 44 50 55 20 53 65 6e 64 69 6e 67 20 46 61 69  ADPU Sending Fai
12500 6c 65 64 20 2d 2d 20 72 65 74 75 72 6e 69 6e 67  led -- returning
12510 20 69 6e 20 65 72 72 6f 72 2e 22 29 3b 0a 0a 09   in error.");...
12520 09 09 69 66 20 28 66 72 65 65 5f 74 6d 70 62 75  ..if (free_tmpbu
12530 66 29 20 7b 0a 09 09 09 09 69 66 20 28 74 6d 70  f) {.....if (tmp
12540 62 75 66 5f 73 29 20 7b 0a 09 09 09 09 09 66 72  buf_s) {......fr
12550 65 65 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09  ee(tmpbuf_s);...
12560 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a 20  ..}....}...../* 
12570 45 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  End transaction 
12580 2a 2f 0a 09 09 09 63 61 63 6b 65 79 5f 65 6e 64  */....cackey_end
12590 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 73 6c 6f  _transaction(slo
125a0 74 29 3b 0a 0a 09 09 09 69 66 20 28 72 65 73 70  t);.....if (resp
125b0 63 6f 64 65 20 3d 3d 20 30 78 36 39 38 32 29 20  code == 0x6982) 
125c0 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  {.....CACKEY_DEB
125d0 55 47 5f 50 52 49 4e 54 46 28 22 53 65 63 75 72  UG_PRINTF("Secur
125e0 69 74 79 20 73 74 61 74 75 73 20 6e 6f 74 20 73  ity status not s
125f0 61 74 69 73 69 66 69 65 64 2e 20 20 52 65 74 75  atisified.  Retu
12600 72 6e 69 6e 67 20 4e 45 45 44 4c 4f 47 49 4e 22  rning NEEDLOGIN"
12610 29 3b 0a 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  );......cackey_m
12620 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 73  ark_slot_reset(s
12630 6c 6f 74 29 3b 0a 09 09 09 09 73 6c 6f 74 2d 3e  lot);.....slot->
12640 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43 4b  token_flags = CK
12650 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45 44  F_LOGIN_REQUIRED
12660 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  ;......return(CA
12670 43 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44  CKEY_PCSC_E_NEED
12680 4c 4f 47 49 4e 29 3b 0a 09 09 09 7d 0a 0a 09 09  LOGIN);....}....
12690 09 69 66 20 28 73 65 6e 64 5f 72 65 74 20 3d 3d  .if (send_ret ==
126a0 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54   CACKEY_PCSC_E_T
126b0 4f 4b 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09  OKENABSENT) {...
126c0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
126d0 52 49 4e 54 46 28 22 54 6f 6b 65 6e 20 61 62 73  RINTF("Token abs
126e0 65 6e 74 2e 20 20 52 65 74 75 72 6e 69 6e 67 20  ent.  Returning 
126f0 54 4f 4b 45 4e 41 42 53 45 4e 54 22 29 3b 0a 0a  TOKENABSENT");..
12700 09 09 09 09 63 61 63 6b 65 79 5f 6d 61 72 6b 5f  ....cackey_mark_
12710 73 6c 6f 74 5f 72 65 73 65 74 28 73 6c 6f 74 29  slot_reset(slot)
12720 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 41  ;......return(CA
12730 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
12740 4e 41 42 53 45 4e 54 29 3b 0a 09 09 09 7d 0a 0a  NABSENT);....}..
12750 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
12760 09 7d 0a 0a 09 09 74 6d 70 62 75 66 20 2b 3d 20  .}....tmpbuf += 
12770 62 79 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 09  bytes_to_send;..
12780 09 74 6d 70 62 75 66 6c 65 6e 20 2d 3d 20 62 79  .tmpbuflen -= by
12790 74 65 73 5f 74 6f 5f 73 65 6e 64 3b 0a 0a 09 09  tes_to_send;....
127a0 6f 75 74 62 75 66 20 2b 3d 20 74 6d 70 6f 75 74  outbuf += tmpout
127b0 62 75 66 6c 65 6e 3b 0a 09 09 6f 75 74 62 75 66  buflen;...outbuf
127c0 6c 65 6e 20 2d 3d 20 74 6d 70 6f 75 74 62 75 66  len -= tmpoutbuf
127d0 6c 65 6e 3b 0a 09 09 72 65 74 76 61 6c 20 2b 3d  len;...retval +=
127e0 20 74 6d 70 6f 75 74 62 75 66 6c 65 6e 3b 0a 09   tmpoutbuflen;..
127f0 7d 0a 0a 09 69 66 20 28 66 72 65 65 5f 74 6d 70  }...if (free_tmp
12800 62 75 66 29 20 7b 0a 09 09 69 66 20 28 74 6d 70  buf) {...if (tmp
12810 62 75 66 5f 73 29 20 7b 0a 09 09 09 66 72 65 65  buf_s) {....free
12820 28 74 6d 70 62 75 66 5f 73 29 3b 0a 09 09 7d 0a  (tmpbuf_s);...}.
12830 09 7d 0a 0a 09 6f 75 74 62 75 66 20 3d 20 6f 75  .}...outbuf = ou
12840 74 62 75 66 5f 73 3b 0a 0a 09 2f 2a 20 45 6e 64  tbuf_s;.../* End
12850 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
12860 09 63 61 63 6b 65 79 5f 65 6e 64 5f 74 72 61 6e  .cackey_end_tran
12870 73 61 63 74 69 6f 6e 28 73 6c 6f 74 29 3b 0a 0a  saction(slot);..
12880 23 69 66 64 65 66 20 43 41 43 4b 45 59 5f 50 41  #ifdef CACKEY_PA
12890 52 41 4e 4f 49 44 0a 23 20 20 69 66 64 65 66 20  RANOID.#  ifdef 
128a0 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58  _POSIX_SSIZE_MAX
128b0 0a 09 69 66 20 28 6f 75 74 62 75 66 6c 65 6e 20  ..if (outbuflen 
128c0 3e 20 5f 50 4f 53 49 58 5f 53 53 49 5a 45 5f 4d  > _POSIX_SSIZE_M
128d0 41 58 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  AX) {...CACKEY_D
128e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4f 75 74  EBUG_PRINTF("Out
128f0 62 75 66 6c 65 6e 20 65 78 63 65 65 64 73 20 6d  buflen exceeds m
12900 61 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65  aximum value, re
12910 74 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75  turning in failu
12920 72 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20  re. (max = %li, 
12930 6f 75 74 62 75 66 6c 65 6e 20 3d 20 25 6c 75 29  outbuflen = %lu)
12940 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f 53 49 58  ", (long) _POSIX
12950 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28 75 6e 73  _SSIZE_MAX, (uns
12960 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 75 74 62  igned long) outb
12970 75 66 6c 65 6e 29 3b 0a 0a 09 09 72 65 74 75 72  uflen);....retur
12980 6e 28 2d 31 29 3b 0a 09 7d 0a 23 20 20 65 6e 64  n(-1);..}.#  end
12990 69 66 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 57  if.#endif.../* W
129a0 65 20 6d 75 73 74 20 72 65 6d 6f 76 65 20 74 68  e must remove th
129b0 65 20 22 37 43 22 20 74 61 67 20 74 6f 20 67 65  e "7C" tag to ge
129c0 74 20 74 6f 20 74 68 65 20 73 69 67 6e 61 74 75  t to the signatu
129d0 72 65 20 2a 2f 0a 09 73 77 69 74 63 68 20 28 69  re */..switch (i
129e0 64 5f 74 79 70 65 29 20 7b 0a 09 09 63 61 73 65  d_type) {...case
129f0 20 43 41 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f   CACKEY_ID_TYPE_
12a00 50 49 56 3a 0a 09 09 09 69 66 20 28 6f 75 74 62  PIV:....if (outb
12a10 75 66 5b 30 5d 20 21 3d 20 30 78 37 43 29 20 7b  uf[0] != 0x7C) {
12a20 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
12a30 47 5f 50 52 49 4e 54 46 28 22 52 65 73 70 6f 6e  G_PRINTF("Respon
12a40 73 65 20 66 72 6f 6d 20 50 49 56 20 66 6f 72 20  se from PIV for 
12a50 47 45 4e 45 52 41 54 45 20 41 55 54 48 45 4e 54  GENERATE AUTHENT
12a60 49 43 41 54 49 4f 4e 20 77 61 73 20 6e 6f 74 20  ICATION was not 
12a70 61 20 30 78 37 43 20 74 61 67 2c 20 72 65 74 75  a 0x7C tag, retu
12a80 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65  rning in failure
12a90 22 29 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28  ");......return(
12aa0 2d 31 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 2f 2a  -1);....}...../*
12ab0 20 58 58 58 20 54 4f 44 4f 20 50 49 56 20 2a 2f   XXX TODO PIV */
12ac0 0a 09 09 09 6d 65 6d 6d 6f 76 65 28 6f 75 74 62  ....memmove(outb
12ad0 75 66 2c 20 6f 75 74 62 75 66 20 2b 20 38 2c 20  uf, outbuf + 8, 
12ae0 72 65 74 76 61 6c 20 2d 20 38 29 3b 0a 09 09 09  retval - 8);....
12af0 72 65 74 76 61 6c 20 2d 3d 20 38 3b 0a 09 09 09  retval -= 8;....
12b00 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 43 41  break;...case CA
12b10 43 4b 45 59 5f 49 44 5f 54 59 50 45 5f 43 41 43  CKEY_ID_TYPE_CAC
12b20 3a 0a 09 09 63 61 73 65 20 43 41 43 4b 45 59 5f  :...case CACKEY_
12b30 49 44 5f 54 59 50 45 5f 43 45 52 54 5f 4f 4e 4c  ID_TYPE_CERT_ONL
12b40 59 3a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  Y:....break;..}.
12b50 0a 09 2f 2a 20 55 6e 70 61 64 20 72 65 70 6c 79  ../* Unpad reply
12b60 20 2a 2f 0a 09 69 66 20 28 75 6e 70 61 64 4f 75   */..if (unpadOu
12b70 74 70 75 74 29 20 7b 0a 09 09 69 66 20 28 72 65  tput) {...if (re
12b80 74 76 61 6c 20 3c 20 33 29 20 7b 0a 09 09 09 43  tval < 3) {....C
12b90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
12ba0 54 46 28 22 52 65 70 6c 79 20 69 73 20 74 6f 6f  TF("Reply is too
12bb0 20 73 6d 61 6c 6c 2c 20 77 65 20 61 72 65 20 6e   small, we are n
12bc0 6f 74 20 61 62 6c 65 20 74 6f 20 75 6e 70 61 64  ot able to unpad
12bd0 20 2d 2d 20 70 61 73 73 69 6e 67 20 62 61 63 6b   -- passing back
12be0 20 61 6e 64 20 68 6f 70 69 6e 67 20 66 6f 72 20   and hoping for 
12bf0 74 68 65 20 62 65 73 74 21 22 29 3b 0a 0a 09 09  the best!");....
12c00 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
12c10 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
12c20 69 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 76  in success, retv
12c30 61 6c 20 3d 20 25 6c 69 20 28 62 79 74 65 73 29  al = %li (bytes)
12c40 22 2c 20 28 6c 6f 6e 67 29 20 72 65 74 76 61 6c  ", (long) retval
12c50 29 3b 0a 09 09 09 72 65 74 75 72 6e 28 72 65 74  );....return(ret
12c60 76 61 6c 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  val);...}....if 
12c70 28 6f 75 74 62 75 66 5b 30 5d 20 21 3d 20 30 78  (outbuf[0] != 0x
12c80 30 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  00) {....CACKEY_
12c90 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e  DEBUG_PRINTF("Un
12ca0 72 65 63 6f 67 6e 69 7a 65 64 20 70 61 64 64 69  recognized paddi
12cb0 6e 67 20 73 63 68 65 6d 65 20 2d 2d 20 70 61 73  ng scheme -- pas
12cc0 73 69 6e 67 20 62 61 63 6b 20 61 6e 64 20 68 6f  sing back and ho
12cd0 70 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73  ping for the bes
12ce0 74 21 22 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  t!");.....CACKEY
12cf0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
12d00 65 74 75 72 6e 69 6e 67 20 69 6e 20 73 75 63 63  eturning in succ
12d10 65 73 73 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c  ess, retval = %l
12d20 69 20 28 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e  i (bytes)", (lon
12d30 67 29 20 72 65 74 76 61 6c 29 3b 0a 09 09 09 72  g) retval);....r
12d40 65 74 75 72 6e 28 72 65 74 76 61 6c 29 3b 0a 09  eturn(retval);..
12d50 09 7d 0a 0a 09 09 62 6c 6f 63 6b 74 79 70 65 20  .}....blocktype 
12d60 3d 20 6f 75 74 62 75 66 5b 31 5d 3b 0a 09 09 75  = outbuf[1];...u
12d70 6e 70 61 64 6f 66 66 73 65 74 20 3d 20 30 3b 0a  npadoffset = 0;.
12d80 0a 09 09 73 77 69 74 63 68 20 28 62 6c 6f 63 6b  ...switch (block
12d90 74 79 70 65 29 20 7b 0a 09 09 09 63 61 73 65 20  type) {....case 
12da0 30 78 30 30 3a 0a 09 09 09 09 2f 2a 20 50 61 64  0x00:...../* Pad
12db0 64 69 6e 67 20 53 63 68 65 6d 65 20 31 2c 20 74  ding Scheme 1, t
12dc0 68 65 20 66 69 72 73 74 20 6e 6f 6e 2d 7a 65 72  he first non-zer
12dd0 6f 20 62 79 74 65 20 69 73 20 74 68 65 20 73 74  o byte is the st
12de0 61 72 74 20 6f 66 20 64 61 74 61 20 2a 2f 0a 09  art of data */..
12df0 09 09 09 66 6f 72 20 28 75 6e 70 61 64 6f 66 66  ...for (unpadoff
12e00 73 65 74 20 3d 20 32 3b 20 75 6e 70 61 64 6f 66  set = 2; unpadof
12e10 66 73 65 74 20 3c 20 72 65 74 76 61 6c 3b 20 75  fset < retval; u
12e20 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29 20 7b 0a  npadoffset++) {.
12e30 09 09 09 09 09 69 66 20 28 6f 75 74 62 75 66 5b  .....if (outbuf[
12e40 75 6e 70 61 64 6f 66 66 73 65 74 5d 20 21 3d 20  unpadoffset] != 
12e50 30 78 30 30 29 20 7b 0a 09 09 09 09 09 09 62 72  0x00) {.......br
12e60 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09  eak;......}.....
12e70 7d 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  }.....break;....
12e80 63 61 73 65 20 30 78 30 31 3a 0a 09 09 09 09 2f  case 0x01:...../
12e90 2a 20 50 61 64 64 69 6e 67 20 53 63 68 65 6d 65  * Padding Scheme
12ea0 20 32 2c 20 70 61 64 20 62 79 74 65 73 20 61 72   2, pad bytes ar
12eb0 65 20 30 78 46 46 20 66 6f 6c 6c 6f 77 65 64 20  e 0xFF followed 
12ec0 62 79 20 30 78 30 30 20 2a 2f 0a 09 09 09 09 66  by 0x00 */.....f
12ed0 6f 72 20 28 75 6e 70 61 64 6f 66 66 73 65 74 20  or (unpadoffset 
12ee0 3d 20 32 3b 20 75 6e 70 61 64 6f 66 66 73 65 74  = 2; unpadoffset
12ef0 20 3c 20 72 65 74 76 61 6c 3b 20 75 6e 70 61 64   < retval; unpad
12f00 6f 66 66 73 65 74 2b 2b 29 20 7b 0a 09 09 09 09  offset++) {.....
12f10 09 69 66 20 28 6f 75 74 62 75 66 5b 75 6e 70 61  .if (outbuf[unpa
12f20 64 6f 66 66 73 65 74 5d 20 21 3d 20 30 78 46 46  doffset] != 0xFF
12f30 29 20 7b 0a 09 09 09 09 09 09 69 66 20 28 6f 75  ) {.......if (ou
12f40 74 62 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74  tbuf[unpadoffset
12f50 5d 20 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09  ] == 0x00) {....
12f60 09 09 09 09 75 6e 70 61 64 6f 66 66 73 65 74 2b  ....unpadoffset+
12f70 2b 3b 0a 0a 09 09 09 09 09 09 09 62 72 65 61 6b  +;.........break
12f80 3b 0a 09 09 09 09 09 09 7d 20 65 6c 73 65 20 7b  ;.......} else {
12f90 0a 09 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44  ........CACKEY_D
12fa0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e 76  EBUG_PRINTF("Inv
12fb0 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61 74  alid padding dat
12fc0 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 69  a found, returni
12fd0 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20 73  ng in failure, s
12fe0 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
12ff0 30 78 30 30 20 66 6f 75 6e 64 20 30 78 25 30 32  0x00 found 0x%02
13000 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  x", (unsigned in
13010 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64 6f  t) outbuf[unpado
13020 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09 09  ffset]);........
13030 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
13040 09 09 09 7d 0a 09 09 09 09 09 7d 20 65 6c 73 65  ...}......} else
13050 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
13060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49 6e  DEBUG_PRINTF("In
13070 76 61 6c 69 64 20 70 61 64 64 69 6e 67 20 64 61  valid padding da
13080 74 61 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e  ta found, return
13090 69 6e 67 20 69 6e 20 66 61 69 6c 75 72 65 2c 20  ing in failure, 
130a0 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
130b0 20 30 78 46 46 20 66 6f 75 6e 64 20 30 78 25 30   0xFF found 0x%0
130c0 32 78 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  2x", (unsigned i
130d0 6e 74 29 20 6f 75 74 62 75 66 5b 75 6e 70 61 64  nt) outbuf[unpad
130e0 6f 66 66 73 65 74 5d 29 3b 0a 0a 09 09 09 09 09  offset]);.......
130f0 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09  .return(-1);....
13100 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62 72  ..}.....}.....br
13110 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 30 78 30  eak;....case 0x0
13120 32 3a 0a 09 09 09 09 2f 2a 20 50 61 64 64 69 6e  2:...../* Paddin
13130 67 20 53 63 68 65 6d 65 20 33 2c 20 70 61 64 20  g Scheme 3, pad 
13140 62 79 74 65 73 20 61 72 65 20 6e 6f 6e 2d 7a 65  bytes are non-ze
13150 72 6f 20 66 69 72 73 74 20 7a 65 72 6f 20 62 79  ro first zero by
13160 74 65 20 66 6f 75 6e 64 20 69 73 20 74 68 65 20  te found is the 
13170 73 65 70 65 72 61 74 6f 72 20 62 79 74 65 20 2a  seperator byte *
13180 2f 0a 09 09 09 09 66 6f 72 20 28 75 6e 70 61 64  /.....for (unpad
13190 6f 66 66 73 65 74 20 3d 20 32 3b 20 75 6e 70 61  offset = 2; unpa
131a0 64 6f 66 66 73 65 74 20 3c 20 72 65 74 76 61 6c  doffset < retval
131b0 3b 20 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 29  ; unpadoffset++)
131c0 20 7b 0a 09 09 09 09 09 69 66 20 28 6f 75 74 62   {......if (outb
131d0 75 66 5b 75 6e 70 61 64 6f 66 66 73 65 74 5d 20  uf[unpadoffset] 
131e0 3d 3d 20 30 78 30 30 29 20 7b 0a 09 09 09 09 09  == 0x00) {......
131f0 09 75 6e 70 61 64 6f 66 66 73 65 74 2b 2b 3b 0a  .unpadoffset++;.
13200 0a 09 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
13210 09 09 09 7d 0a 09 09 09 09 7d 0a 09 09 09 09 62  ...}.....}.....b
13220 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  reak;...}....if 
13230 28 75 6e 70 61 64 6f 66 66 73 65 74 20 3e 20 72  (unpadoffset > r
13240 65 74 76 61 6c 29 20 7b 0a 09 09 09 43 41 43 4b  etval) {....CACK
13250 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13260 22 4f 66 66 73 65 74 20 67 72 65 61 74 65 72 20  "Offset greater 
13270 74 68 61 6e 20 72 65 70 6c 79 20 73 69 7a 65 2c  than reply size,
13280 20 61 62 6f 72 74 69 6e 67 2e 20 20 28 75 6e 70   aborting.  (unp
13290 61 64 6f 66 66 73 65 74 20 3d 20 25 6c 75 2c 20  adoffset = %lu, 
132a0 72 65 74 76 61 6c 20 3d 20 25 6c 75 29 22 2c 20  retval = %lu)", 
132b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
132c0 75 6e 70 61 64 6f 66 66 73 65 74 2c 20 28 75 6e  unpadoffset, (un
132d0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 72 65 74  signed long) ret
132e0 76 61 6c 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e  val);.....return
132f0 28 2d 31 29 3b 0a 09 09 7d 0a 0a 09 09 43 41 43  (-1);...}....CAC
13300 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
13310 55 46 28 22 50 61 64 64 65 64 3a 22 2c 20 6f 75  UF("Padded:", ou
13320 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b 0a 0a  tbuf, retval);..
13330 09 09 72 65 74 76 61 6c 20 2d 3d 20 75 6e 70 61  ..retval -= unpa
13340 64 6f 66 66 73 65 74 3b 0a 09 09 6d 65 6d 6d 6f  doffset;...memmo
13350 76 65 28 6f 75 74 62 75 66 2c 20 6f 75 74 62 75  ve(outbuf, outbu
13360 66 20 2b 20 75 6e 70 61 64 6f 66 66 73 65 74 2c  f + unpadoffset,
13370 20 72 65 74 76 61 6c 29 3b 0a 0a 09 09 43 41 43   retval);....CAC
13380 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42  KEY_DEBUG_PRINTB
13390 55 46 28 22 55 6e 70 61 64 64 65 64 3a 22 2c 20  UF("Unpadded:", 
133a0 6f 75 74 62 75 66 2c 20 72 65 74 76 61 6c 29 3b  outbuf, retval);
133b0 0a 09 7d 0a 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
133c0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
133d0 72 6e 69 6e 67 20 69 6e 20 73 75 63 63 65 73 73  rning in success
133e0 2c 20 72 65 74 76 61 6c 20 3d 20 25 6c 69 20 28  , retval = %li (
133f0 62 79 74 65 73 29 22 2c 20 28 6c 6f 6e 67 29 20  bytes)", (long) 
13400 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75 72  retval);...retur
13410 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 2f 2a  n(retval);.}../*
13420 0a 20 2a 20 53 59 4e 50 4f 53 49 53 0a 20 2a 20  . * SYNPOSIS. * 
13430 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20 41 52      .... *. * AR
13440 47 55 4d 45 4e 54 53 0a 20 2a 20 20 20 20 20 2e  GUMENTS. *     .
13450 2e 2e 0a 20 2a 0a 20 2a 20 52 45 54 55 52 4e 20  ... *. * RETURN 
13460 56 41 4c 55 45 0a 20 2a 20 20 20 20 20 2e 2e 2e  VALUE. *     ...
13470 0a 20 2a 0a 20 2a 20 4e 4f 54 45 53 0a 20 2a 20  . *. * NOTES. * 
13480 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73      .... *. */.s
13490 74 61 74 69 63 20 63 61 63 6b 65 79 5f 72 65 74  tatic cackey_ret
134a0 20 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 73 74   cackey_login(st
134b0 72 75 63 74 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ruct cackey_slot
134c0 20 2a 73 6c 6f 74 2c 20 75 6e 73 69 67 6e 65 64   *slot, unsigned
134d0 20 63 68 61 72 20 2a 70 69 6e 2c 20 75 6e 73 69   char *pin, unsi
134e0 67 6e 65 64 20 6c 6f 6e 67 20 70 69 6e 5f 6c 65  gned long pin_le
134f0 6e 2c 20 69 6e 74 20 2a 74 72 69 65 73 5f 72 65  n, int *tries_re
13500 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 75 6e  maining_p) {..un
13510 73 69 67 6e 65 64 20 63 68 61 72 20 63 61 63 5f  signed char cac_
13520 70 69 6e 5b 38 5d 20 3d 20 7b 30 78 46 46 2c 20  pin[8] = {0xFF, 
13530 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78 46 46  0xFF, 0xFF, 0xFF
13540 2c 20 30 78 46 46 2c 20 30 78 46 46 2c 20 30 78  , 0xFF, 0xFF, 0x
13550 46 46 2c 20 30 78 46 46 7d 3b 0a 09 75 69 6e 74  FF, 0xFF};..uint
13560 31 36 5f 74 20 72 65 73 70 6f 6e 73 65 5f 63 6f  16_t response_co
13570 64 65 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f 72  de;..int tries_r
13580 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20 73  emaining;..int s
13590 65 6e 64 5f 72 65 74 3b 0a 09 69 6e 74 20 6b 65  end_ret;..int ke
135a0 79 5f 72 65 66 65 72 65 6e 63 65 20 3d 20 30 78  y_reference = 0x
135b0 30 30 3b 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74  00;.../* Indicat
135c0 65 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74  e that we do not
135d0 20 6b 6e 6f 77 20 61 62 6f 75 74 20 68 6f 77 20   know about how 
135e0 6d 61 6e 79 20 74 72 69 65 73 20 61 72 65 20 72  many tries are r
135f0 65 6d 61 69 6e 69 6e 67 20 2a 2f 0a 09 69 66 20  emaining */..if 
13600 28 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67  (tries_remaining
13610 5f 70 29 20 7b 0a 09 09 2a 74 72 69 65 73 5f 72  _p) {...*tries_r
13620 65 6d 61 69 6e 69 6e 67 5f 70 20 3d 20 2d 31 3b  emaining_p = -1;
13630 0a 09 7d 0a 0a 09 2f 2a 20 41 70 70 61 72 65 6e  ..}.../* Apparen
13640 74 6c 79 2c 20 43 41 43 20 50 49 4e 73 20 61 72  tly, CAC PINs ar
13650 65 20 2a 45 58 41 43 54 4c 59 2a 20 38 20 62 79  e *EXACTLY* 8 by
13660 74 65 73 20 6c 6f 6e 67 20 2d 2d 20 70 61 64 20  tes long -- pad 
13670 77 69 74 68 20 30 78 46 46 20 69 66 20 74 6f 6f  with 0xFF if too
13680 20 73 68 6f 72 74 20 2a 2f 0a 09 69 66 20 28 70   short */..if (p
13690 69 6e 5f 6c 65 6e 20 3e 3d 20 38 29 20 7b 0a 09  in_len >= 8) {..
136a0 09 6d 65 6d 63 70 79 28 63 61 63 5f 70 69 6e 2c  .memcpy(cac_pin,
136b0 20 70 69 6e 2c 20 38 29 3b 0a 09 7d 20 65 6c 73   pin, 8);..} els
136c0 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 63 61 63  e {...memcpy(cac
136d0 5f 70 69 6e 2c 20 70 69 6e 2c 20 70 69 6e 5f 6c  _pin, pin, pin_l
136e0 65 6e 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 49 73 73  en);..}.../* Iss
136f0 75 65 20 50 49 4e 20 56 65 72 69 66 79 20 2a 2f  ue PIN Verify */
13700 0a 09 73 65 6e 64 5f 72 65 74 20 3d 20 63 61 63  ..send_ret = cac
13710 6b 65 79 5f 73 65 6e 64 5f 61 70 64 75 28 73 6c  key_send_apdu(sl
13720 6f 74 2c 20 47 53 43 49 53 5f 43 4c 41 53 53 5f  ot, GSCIS_CLASS_
13730 49 53 4f 37 38 31 36 2c 20 47 53 43 49 53 5f 49  ISO7816, GSCIS_I
13740 4e 53 54 52 5f 56 45 52 49 46 59 2c 20 30 78 30  NSTR_VERIFY, 0x0
13750 30 2c 20 6b 65 79 5f 72 65 66 65 72 65 6e 63 65  0, key_reference
13760 2c 20 73 69 7a 65 6f 66 28 63 61 63 5f 70 69 6e  , sizeof(cac_pin
13770 29 2c 20 63 61 63 5f 70 69 6e 2c 20 30 78 30 30  ), cac_pin, 0x00
13780 2c 20 26 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65  , &response_code
13790 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
137a0 69 66 20 28 73 65 6e 64 5f 72 65 74 20 21 3d 20  if (send_ret != 
137b0 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b  CACKEY_PCSC_S_OK
137c0 20 26 26 20 72 65 73 70 6f 6e 73 65 5f 63 6f 64   && response_cod
137d0 65 20 3d 3d 20 30 78 36 41 38 38 29 20 7b 0a 09  e == 0x6A88) {..
137e0 09 6b 65 79 5f 72 65 66 65 72 65 6e 63 65 20 3d  .key_reference =
137f0 20 30 78 38 30 3b 0a 0a 09 09 73 65 6e 64 5f 72   0x80;....send_r
13800 65 74 20 3d 20 63 61 63 6b 65 79 5f 73 65 6e 64  et = cackey_send
13810 5f 61 70 64 75 28 73 6c 6f 74 2c 20 47 53 43 49  _apdu(slot, GSCI
13820 53 5f 43 4c 41 53 53 5f 49 53 4f 37 38 31 36 2c  S_CLASS_ISO7816,
13830 20 47 53 43 49 53 5f 49 4e 53 54 52 5f 56 45 52   GSCIS_INSTR_VER
13840 49 46 59 2c 20 30 78 30 30 2c 20 6b 65 79 5f 72  IFY, 0x00, key_r
13850 65 66 65 72 65 6e 63 65 2c 20 73 69 7a 65 6f 66  eference, sizeof
13860 28 63 61 63 5f 70 69 6e 29 2c 20 63 61 63 5f 70  (cac_pin), cac_p
13870 69 6e 2c 20 30 78 30 30 2c 20 26 72 65 73 70 6f  in, 0x00, &respo
13880 6e 73 65 5f 63 6f 64 65 2c 20 4e 55 4c 4c 2c 20  nse_code, NULL, 
13890 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  NULL);..}...if (
138a0 73 65 6e 64 5f 72 65 74 20 21 3d 20 43 41 43 4b  send_ret != CACK
138b0 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a  EY_PCSC_S_OK) {.
138c0 09 09 69 66 20 28 28 72 65 73 70 6f 6e 73 65 5f  ..if ((response_
138d0 63 6f 64 65 20 26 20 30 78 36 33 43 30 29 20 3d  code & 0x63C0) =
138e0 3d 20 30 78 36 33 43 30 29 20 7b 0a 09 09 09 74  = 0x63C0) {....t
138f0 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 20 3d  ries_remaining =
13900 20 28 72 65 73 70 6f 6e 73 65 5f 63 6f 64 65 20   (response_code 
13910 26 20 30 78 46 29 3b 0a 0a 09 09 09 43 41 43 4b  & 0xF);.....CACK
13920 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
13930 22 50 49 4e 20 56 65 72 69 66 69 63 61 74 69 6f  "PIN Verificatio
13940 6e 20 66 61 69 6c 65 64 2c 20 25 69 20 74 72 69  n failed, %i tri
13950 65 73 20 72 65 6d 61 69 6e 69 6e 67 22 2c 20 74  es remaining", t
13960 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e 67 29 3b  ries_remaining);
13970 0a 0a 09 09 09 69 66 20 28 74 72 69 65 73 5f 72  .....if (tries_r
13980 65 6d 61 69 6e 69 6e 67 5f 70 29 20 7b 0a 09 09  emaining_p) {...
13990 09 09 2a 74 72 69 65 73 5f 72 65 6d 61 69 6e 69  ..*tries_remaini
139a0 6e 67 5f 70 20 3d 20 74 72 69 65 73 5f 72 65 6d  ng_p = tries_rem
139b0 61 69 6e 69 6e 67 3b 0a 09 09 09 7d 0a 0a 09 09  aining;....}....
139c0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
139d0 43 53 43 5f 45 5f 42 41 44 50 49 4e 29 3b 0a 09  CSC_E_BADPIN);..
139e0 09 7d 0a 0a 09 09 69 66 20 28 72 65 73 70 6f 6e  .}....if (respon
139f0 73 65 5f 63 6f 64 65 20 3d 3d 20 30 78 36 39 38  se_code == 0x698
13a00 33 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  3) {....CACKEY_D
13a10 45 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e  EBUG_PRINTF("PIN
13a20 20 56 65 72 69 66 69 63 61 74 69 6f 6e 20 66 61   Verification fa
13a30 69 6c 65 64 2c 20 64 65 76 69 63 65 20 69 73 20  iled, device is 
13a40 6c 6f 63 6b 65 64 22 29 3b 0a 0a 09 09 09 72 65  locked");.....re
13a50 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43  turn(CACKEY_PCSC
13a60 5f 45 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 0a  _E_LOCKED);...}.
13a70 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59  ...return(CACKEY
13a80 5f 50 43 53 43 5f 45 5f 47 45 4e 45 52 49 43 29  _PCSC_E_GENERIC)
13a90 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
13aa0 42 55 47 5f 50 52 49 4e 54 46 28 22 50 49 4e 20  BUG_PRINTF("PIN 
13ab0 56 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 63  Verification suc
13ac0 63 65 65 64 65 64 22 29 3b 0a 0a 09 72 65 74 75  ceeded");...retu
13ad0 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f 53  rn(CACKEY_PCSC_S
13ae0 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53  _OK);.}../*. * S
13af0 59 4e 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e  YNPOSIS. *     .
13b00 2e 2e 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e  ... *. * ARGUMEN
13b10 54 53 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a  TS. *     .... *
13b20 0a 20 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45  . * RETURN VALUE
13b30 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
13b40 2a 20 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e  * NOTES. *     .
13b50 2e 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ... *. */.static
13b60 20 63 61 63 6b 65 79 5f 72 65 74 20 63 61 63 6b   cackey_ret cack
13b70 65 79 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74  ey_token_present
13b80 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f 73  (struct cackey_s
13b90 6c 6f 74 20 2a 73 6c 6f 74 29 20 7b 0a 09 63 61  lot *slot) {..ca
13ba0 63 6b 65 79 5f 72 65 74 20 70 63 73 63 5f 63 6f  ckey_ret pcsc_co
13bb0 6e 6e 65 63 74 5f 72 65 74 3b 0a 09 44 57 4f 52  nnect_ret;..DWOR
13bc0 44 20 72 65 61 64 65 72 5f 6c 65 6e 20 3d 20 30  D reader_len = 0
13bd0 2c 20 73 74 61 74 65 20 3d 20 30 2c 20 70 72 6f  , state = 0, pro
13be0 74 6f 63 6f 6c 20 3d 20 30 2c 20 61 74 72 5f 6c  tocol = 0, atr_l
13bf0 65 6e 3b 0a 09 42 59 54 45 20 61 74 72 5b 4d 41  en;..BYTE atr[MA
13c00 58 5f 41 54 52 5f 53 49 5a 45 5d 3b 0a 09 4c 4f  X_ATR_SIZE];..LO
13c10 4e 47 20 73 74 61 74 75 73 5f 72 65 74 2c 20 73  NG status_ret, s
13c20 63 61 72 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 3b  card_reconn_ret;
13c30 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
13c40 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
13c50 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 2d 3e 69  );...if (slot->i
13c60 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09 43 41 43  nternal) {...CAC
13c70 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
13c80 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  ("Returning toke
13c90 6e 20 70 72 65 73 65 6e 74 20 28 69 6e 74 65 72  n present (inter
13ca0 6e 61 6c 20 74 6f 6b 65 6e 29 22 29 3b 0a 0a 09  nal token)");...
13cb0 09 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50  .return(CACKEY_P
13cc0 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
13cd0 4e 54 29 3b 0a 09 7d 0a 0a 09 70 63 73 63 5f 63  NT);..}...pcsc_c
13ce0 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61 63  onnect_ret = cac
13cf0 6b 65 79 5f 63 6f 6e 6e 65 63 74 5f 63 61 72 64  key_connect_card
13d00 28 73 6c 6f 74 29 3b 0a 09 69 66 20 28 70 63 73  (slot);..if (pcs
13d10 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d  c_connect_ret !=
13d20 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f   CACKEY_PCSC_S_O
13d30 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  K) {...CACKEY_DE
13d40 42 55 47 5f 50 52 49 4e 54 46 28 22 55 6e 61 62  BUG_PRINTF("Unab
13d50 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 20 74 6f  le to connect to
13d60 20 63 61 72 64 2c 20 72 65 74 75 72 6e 69 6e 67   card, returning
13d70 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29 3b   token absent");
13d80 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b 45  ....return(CACKE
13d90 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41 42  Y_PCSC_E_TOKENAB
13da0 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 61 74 72 5f  SENT);..}...atr_
13db0 6c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 61 74 72  len = sizeof(atr
13dc0 29 3b 0a 09 73 74 61 74 75 73 5f 72 65 74 20 3d  );..status_ret =
13dd0 20 53 43 61 72 64 53 74 61 74 75 73 28 73 6c 6f   SCardStatus(slo
13de0 74 2d 3e 70 63 73 63 5f 63 61 72 64 2c 20 4e 55  t->pcsc_card, NU
13df0 4c 4c 2c 20 26 72 65 61 64 65 72 5f 6c 65 6e 2c  LL, &reader_len,
13e00 20 26 73 74 61 74 65 2c 20 26 70 72 6f 74 6f 63   &state, &protoc
13e10 6f 6c 2c 20 61 74 72 2c 20 26 61 74 72 5f 6c 65  ol, atr, &atr_le
13e20 6e 29 3b 0a 0a 09 69 66 20 28 73 74 61 74 75 73  n);...if (status
13e30 5f 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 45 5f  _ret == SCARD_E_
13e40 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 29 20  INVALID_HANDLE) 
13e50 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
13e60 5f 50 52 49 4e 54 46 28 22 53 43 61 72 64 53 74  _PRINTF("SCardSt
13e70 61 74 75 73 28 29 20 72 65 74 75 72 6e 65 64 20  atus() returned 
13e80 53 43 41 52 44 5f 45 5f 49 4e 56 41 4c 49 44 5f  SCARD_E_INVALID_
13e90 48 41 4e 44 4c 45 2c 20 6d 61 72 6b 69 6e 67 20  HANDLE, marking 
13ea0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 63  is not already c
13eb0 6f 6e 6e 65 63 74 65 64 20 61 6e 64 20 74 72 79  onnected and try
13ec0 69 6e 67 20 61 67 61 69 6e 22 29 3b 0a 09 09 63  ing again");...c
13ed0 61 63 6b 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f  ackey_mark_slot_
13ee0 72 65 73 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09  reset(slot);....
13ef0 70 63 73 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74  pcsc_connect_ret
13f00 20 3d 20 63 61 63 6b 65 79 5f 63 6f 6e 6e 65 63   = cackey_connec
13f10 74 5f 63 61 72 64 28 73 6c 6f 74 29 3b 0a 09 09  t_card(slot);...
13f20 69 66 20 28 70 63 73 63 5f 63 6f 6e 6e 65 63 74  if (pcsc_connect
13f30 5f 72 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50  _ret != CACKEY_P
13f40 43 53 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 09 43  CSC_S_OK) {....C
13f50 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
13f60 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 63 6f  TF("Unable to co
13f70 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c 20 72  nnect to card, r
13f80 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e 20 61  eturning token a
13f90 62 73 65 6e 74 22 29 3b 0a 0a 09 09 09 72 65 74  bsent");.....ret
13fa0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
13fb0 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
13fc0 09 09 7d 0a 0a 09 09 61 74 72 5f 6c 65 6e 20 3d  ..}....atr_len =
13fd0 20 73 69 7a 65 6f 66 28 61 74 72 29 3b 0a 09 09   sizeof(atr);...
13fe0 73 74 61 74 75 73 5f 72 65 74 20 3d 20 53 43 61  status_ret = SCa
13ff0 72 64 53 74 61 74 75 73 28 73 6c 6f 74 2d 3e 70  rdStatus(slot->p
14000 63 73 63 5f 63 61 72 64 2c 20 4e 55 4c 4c 2c 20  csc_card, NULL, 
14010 26 72 65 61 64 65 72 5f 6c 65 6e 2c 20 26 73 74  &reader_len, &st
14020 61 74 65 2c 20 26 70 72 6f 74 6f 63 6f 6c 2c 20  ate, &protocol, 
14030 61 74 72 2c 20 26 61 74 72 5f 6c 65 6e 29 3b 0a  atr, &atr_len);.
14040 09 7d 0a 0a 09 69 66 20 28 73 74 61 74 75 73 5f  .}...if (status_
14050 72 65 74 20 21 3d 20 53 43 41 52 44 5f 53 5f 53  ret != SCARD_S_S
14060 55 43 43 45 53 53 29 20 7b 0a 09 09 63 61 63 6b  UCCESS) {...cack
14070 65 79 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73  ey_mark_slot_res
14080 65 74 28 73 6c 6f 74 29 3b 0a 0a 09 09 69 66 20  et(slot);....if 
14090 28 73 74 61 74 75 73 5f 72 65 74 20 3d 3d 20 53  (status_ret == S
140a0 43 41 52 44 5f 57 5f 52 45 53 45 54 5f 43 41 52  CARD_W_RESET_CAR
140b0 44 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  D) {....CACKEY_D
140c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 73  EBUG_PRINTF("Res
140d0 65 74 20 72 65 71 75 69 72 65 64 2c 20 70 6c 65  et required, ple
140e0 61 73 65 20 68 6f 6c 64 2e 2e 2e 22 29 3b 0a 0a  ase hold...");..
140f0 09 09 09 73 63 61 72 64 5f 72 65 63 6f 6e 6e 5f  ...scard_reconn_
14100 72 65 74 20 3d 20 63 61 63 6b 65 79 5f 72 65 63  ret = cackey_rec
14110 6f 6e 6e 65 63 74 5f 63 61 72 64 28 73 6c 6f 74  onnect_card(slot
14120 2c 20 53 43 41 52 44 5f 50 52 4f 54 4f 43 4f 4c  , SCARD_PROTOCOL
14130 5f 54 30 20 7c 20 53 43 41 52 44 5f 50 52 4f 54  _T0 | SCARD_PROT
14140 4f 43 4f 4c 5f 54 31 2c 20 26 70 72 6f 74 6f 63  OCOL_T1, &protoc
14150 6f 6c 29 3b 0a 09 09 09 69 66 20 28 73 63 61 72  ol);....if (scar
14160 64 5f 72 65 63 6f 6e 6e 5f 72 65 74 20 3d 3d 20  d_reconn_ret == 
14170 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53 53 29  SCARD_S_SUCCESS)
14180 20 7b 0a 09 09 09 09 2f 2a 20 55 70 64 61 74 65   {...../* Update
14190 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 09 09   protocol */....
141a0 09 73 6c 6f 74 2d 3e 70 72 6f 74 6f 63 6f 6c 20  .slot->protocol 
141b0 3d 20 70 72 6f 74 6f 63 6f 6c 3b 0a 0a 09 09 09  = protocol;.....
141c0 09 2f 2a 20 52 65 2d 65 73 74 61 62 6c 69 73 68  ./* Re-establish
141d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66   transaction, if
141e0 20 69 74 20 77 61 73 20 70 72 65 73 65 6e 74 20   it was present 
141f0 2a 2f 0a 09 09 09 09 69 66 20 28 73 6c 6f 74 2d  */.....if (slot-
14200 3e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70  >transaction_dep
14210 74 68 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 73  th > 0) {......s
14220 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
14230 5f 64 65 70 74 68 2d 2d 3b 0a 09 09 09 09 09 73  _depth--;......s
14240 6c 6f 74 2d 3e 74 72 61 6e 73 61 63 74 69 6f 6e  lot->transaction
14250 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
14260 31 3b 0a 09 09 09 09 09 63 61 63 6b 65 79 5f 62  1;......cackey_b
14270 65 67 69 6e 5f 74 72 61 6e 73 61 63 74 69 6f 6e  egin_transaction
14280 28 73 6c 6f 74 29 3b 0a 09 09 09 09 7d 0a 0a 09  (slot);.....}...
14290 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
142a0 50 52 49 4e 54 46 28 22 52 65 73 65 74 20 73 75  PRINTF("Reset su
142b0 63 63 65 73 73 66 75 6c 2c 20 72 65 71 75 65 72  ccessful, requer
142c0 79 69 6e 67 22 29 3b 0a 09 09 09 09 73 74 61 74  ying");.....stat
142d0 75 73 5f 72 65 74 20 3d 20 53 43 61 72 64 53 74  us_ret = SCardSt
142e0 61 74 75 73 28 73 6c 6f 74 2d 3e 70 63 73 63 5f  atus(slot->pcsc_
142f0 63 61 72 64 2c 20 4e 55 4c 4c 2c 20 26 72 65 61  card, NULL, &rea
14300 64 65 72 5f 6c 65 6e 2c 20 26 73 74 61 74 65 2c  der_len, &state,
14310 20 26 70 72 6f 74 6f 63 6f 6c 2c 20 61 74 72 2c   &protocol, atr,
14320 20 26 61 74 72 5f 6c 65 6e 29 3b 0a 09 09 09 09   &atr_len);.....
14330 69 66 20 28 73 74 61 74 75 73 5f 72 65 74 20 21  if (status_ret !
14340 3d 20 53 43 41 52 44 5f 53 5f 53 55 43 43 45 53  = SCARD_S_SUCCES
14350 53 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  S) {......CACKEY
14360 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53  _DEBUG_PRINTF("S
14370 74 69 6c 6c 20 75 6e 61 62 6c 65 20 74 6f 20 71  till unable to q
14380 75 65 72 79 20 63 61 72 64 20 73 74 61 74 75 73  uery card status
14390 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  , returning toke
143a0 6e 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64  n absent.  SCard
143b0 53 74 61 74 75 73 28 29 20 3d 20 25 73 22 2c 20  Status() = %s", 
143c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e  CACKEY_DEBUG_FUN
143d0 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54  C_SCARDERR_TO_ST
143e0 52 28 73 74 61 74 75 73 5f 72 65 74 29 29 3b 0a  R(status_ret));.
143f0 0a 09 09 09 09 09 72 65 74 75 72 6e 28 43 41 43  ......return(CAC
14400 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e  KEY_PCSC_E_TOKEN
14410 41 42 53 45 4e 54 29 3b 0a 09 09 09 09 7d 0a 09  ABSENT);.....}..
14420 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 43  ..} else {.....C
14430 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14440 54 46 28 22 55 6e 61 62 6c 65 20 74 6f 20 72 65  TF("Unable to re
14450 63 6f 6e 6e 65 63 74 20 74 6f 20 63 61 72 64 2c  connect to card,
14460 20 72 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65 6e   returning token
14470 20 61 62 73 65 6e 74 2e 20 20 53 43 61 72 64 52   absent.  SCardR
14480 65 63 6f 6e 6e 65 63 74 28 29 20 3d 20 25 73 22  econnect() = %s"
14490 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 46  , CACKEY_DEBUG_F
144a0 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f  UNC_SCARDERR_TO_
144b0 53 54 52 28 73 63 61 72 64 5f 72 65 63 6f 6e 6e  STR(scard_reconn
144c0 5f 72 65 74 29 29 3b 0a 0a 09 09 09 09 72 65 74  _ret));......ret
144d0 75 72 6e 28 43 41 43 4b 45 59 5f 50 43 53 43 5f  urn(CACKEY_PCSC_
144e0 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54 29 3b 0a  E_TOKENABSENT);.
144f0 09 09 09 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ...}...} else {.
14500 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14510 50 52 49 4e 54 46 28 22 55 6e 61 62 6c 65 20 74  PRINTF("Unable t
14520 6f 20 71 75 65 72 79 20 63 61 72 64 20 73 74 61  o query card sta
14530 74 75 73 2c 20 72 65 74 75 72 6e 69 6e 67 20 74  tus, returning t
14540 6f 6b 65 6e 20 61 62 73 65 6e 74 2e 20 20 53 43  oken absent.  SC
14550 61 72 64 53 74 61 74 75 73 28 29 20 3d 20 25 73  ardStatus() = %s
14560 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ", CACKEY_DEBUG_
14570 46 55 4e 43 5f 53 43 41 52 44 45 52 52 5f 54 4f  FUNC_SCARDERR_TO
14580 5f 53 54 52 28 73 74 61 74 75 73 5f 72 65 74 29  _STR(status_ret)
14590 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 41  );.....return(CA
145a0 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45  CKEY_PCSC_E_TOKE
145b0 4e 41 42 53 45 4e 54 29 3b 0a 09 09 7d 0a 09 7d  NABSENT);...}..}
145c0 0a 0a 09 69 66 20 28 28 73 74 61 74 65 20 26 20  ...if ((state & 
145d0 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 3d 3d  SCARD_ABSENT) ==
145e0 20 53 43 41 52 44 5f 41 42 53 45 4e 54 29 20 7b   SCARD_ABSENT) {
145f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14600 50 52 49 4e 54 46 28 22 43 61 72 64 20 69 73 20  PRINTF("Card is 
14610 61 62 73 65 6e 74 2c 20 72 65 74 75 72 6e 69 6e  absent, returnin
14620 67 20 74 6f 6b 65 6e 20 61 62 73 65 6e 74 22 29  g token absent")
14630 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 41 43 4b  ;....return(CACK
14640 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b 45 4e 41  EY_PCSC_E_TOKENA
14650 42 53 45 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43  BSENT);..}...CAC
14660 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
14670 28 22 52 65 74 75 72 6e 69 6e 67 20 74 6f 6b 65  ("Returning toke
14680 6e 20 70 72 65 73 65 6e 74 2e 22 29 3b 0a 0a 09  n present.");...
14690 72 65 74 75 72 6e 28 43 41 43 4b 45 59 5f 50 43  return(CACKEY_PC
146a0 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45 4e  SC_S_TOKENPRESEN
146b0 54 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 59 4e  T);.}../*. * SYN
146c0 50 4f 53 49 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  POSIS. *     ...
146d0 0a 20 2a 0a 20 2a 20 41 52 47 55 4d 45 4e 54 53  . *. * ARGUMENTS
146e0 0a 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20  . *     .... *. 
146f0 2a 20 52 45 54 55 52 4e 20 56 41 4c 55 45 0a 20  * RETURN VALUE. 
14700 2a 20 20 20 20 20 2e 2e 2e 0a 20 2a 0a 20 2a 20  *     .... *. * 
14710 4e 4f 54 45 53 0a 20 2a 20 20 20 20 20 2e 2e 2e  NOTES. *     ...
14720 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 73  . *. */.static s
14730 73 69 7a 65 5f 74 20 63 61 63 6b 65 79 5f 70 63  size_t cackey_pc
14740 73 63 5f 69 64 65 6e 74 69 74 79 5f 74 6f 5f 6c  sc_identity_to_l
14750 61 62 65 6c 28 73 74 72 75 63 74 20 63 61 63 6b  abel(struct cack
14760 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74 79  ey_pcsc_identity
14770 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73 69   *identity, unsi
14780 67 6e 65 64 20 63 68 61 72 20 2a 6c 61 62 65 6c  gned char *label
14790 5f 62 75 66 2c 20 75 6e 73 69 67 6e 65 64 20 6c  _buf, unsigned l
147a0 6f 6e 67 20 6c 61 62 65 6c 5f 62 75 66 5f 6c 65  ong label_buf_le
147b0 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  n) {..unsigned l
147c0 6f 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 5f  ong certificate_
147d0 6c 65 6e 3b 0a 09 76 6f 69 64 20 2a 6c 61 62 65  len;..void *labe
147e0 6c 5f 61 73 6e 31 3b 0a 09 76 6f 69 64 20 2a 63  l_asn1;..void *c
147f0 65 72 74 69 66 69 63 61 74 65 3b 0a 09 69 6e 74  ertificate;..int
14800 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b 0a   x509_read_ret;.
14810 0a 09 63 65 72 74 69 66 69 63 61 74 65 20 3d 20  ..certificate = 
14820 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
14830 69 63 61 74 65 3b 0a 09 63 65 72 74 69 66 69 63  icate;..certific
14840 61 74 65 5f 6c 65 6e 20 3d 20 69 64 65 6e 74 69  ate_len = identi
14850 74 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 5f  ty->certificate_
14860 6c 65 6e 3b 0a 0a 09 69 66 20 28 63 65 72 74 69  len;...if (certi
14870 66 69 63 61 74 65 5f 6c 65 6e 20 3c 20 30 29 20  ficate_len < 0) 
14880 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  {...return(-1);.
14890 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61 64 5f 72  .}...x509_read_r
148a0 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75 62  et = x509_to_sub
148b0 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74 65  ject(certificate
148c0 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  , certificate_le
148d0 6e 2c 20 28 76 6f 69 64 20 2a 2a 29 20 26 6c 61  n, (void **) &la
148e0 62 65 6c 5f 61 73 6e 31 29 3b 0a 09 69 66 20 28  bel_asn1);..if (
148f0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
14900 30 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 2d 31  0) {...return(-1
14910 29 3b 0a 09 7d 0a 0a 09 78 35 30 39 5f 72 65 61  );..}...x509_rea
14920 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 64 6e 5f  d_ret = x509_dn_
14930 74 6f 5f 73 74 72 69 6e 67 28 6c 61 62 65 6c 5f  to_string(label_
14940 61 73 6e 31 2c 20 78 35 30 39 5f 72 65 61 64 5f  asn1, x509_read_
14950 72 65 74 2c 20 28 63 68 61 72 20 2a 29 20 6c 61  ret, (char *) la
14960 62 65 6c 5f 62 75 66 2c 20 6c 61 62 65 6c 5f 62  bel_buf, label_b
14970 75 66 5f 6c 65 6e 2c 20 22 43 4e 22 29 3b 0a 09  uf_len, "CN");..
14980 69 66 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65  if (x509_read_re
14990 74 20 3c 3d 20 30 29 20 7b 0a 09 09 78 35 30 39  t <= 0) {...x509
149a0 5f 72 65 61 64 5f 72 65 74 20 3d 20 78 35 30 39  _read_ret = x509
149b0 5f 64 6e 5f 74 6f 5f 73 74 72 69 6e 67 28 6c 61  _dn_to_string(la
149c0 62 65 6c 5f 61 73 6e 31 2c 20 78 35 30 39 5f 72  bel_asn1, x509_r
149d0 65 61 64 5f 72 65 74 2c 20 28 63 68 61 72 20 2a  ead_ret, (char *
149e0 29 20 6c 61 62 65 6c 5f 62 75 66 2c 20 6c 61 62  ) label_buf, lab
149f0 65 6c 5f 62 75 66 5f 6c 65 6e 2c 20 4e 55 4c 4c  el_buf_len, NULL
14a00 29 3b 0a 0a 09 09 69 66 20 28 78 35 30 39 5f 72  );....if (x509_r
14a10 65 61 64 5f 72 65 74 20 3c 3d 20 30 29 20 7b 0a  ead_ret <= 0) {.
14a20 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09  ...return(-1);..
14a30 09 7d 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  .}..}..#ifdef CA
14a40 43 4b 45 59 5f 50 41 52 41 4e 4f 49 44 0a 23 20  CKEY_PARANOID.# 
14a50 20 69 66 64 65 66 20 5f 50 4f 53 49 58 5f 53 53   ifdef _POSIX_SS
14a60 49 5a 45 5f 4d 41 58 0a 09 69 66 20 28 78 35 30  IZE_MAX..if (x50
14a70 39 5f 72 65 61 64 5f 72 65 74 20 3e 20 5f 50 4f  9_read_ret > _PO
14a80 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 29 20 7b  SIX_SSIZE_MAX) {
14a90 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
14aa0 50 52 49 4e 54 46 28 22 78 35 30 39 5f 72 65 61  PRINTF("x509_rea
14ab0 64 5f 72 65 74 20 65 78 63 65 65 64 73 20 6d 61  d_ret exceeds ma
14ac0 78 69 6d 75 6d 20 76 61 6c 75 65 2c 20 72 65 74  ximum value, ret
14ad0 75 72 6e 69 6e 67 20 69 6e 20 66 61 69 6c 75 72  urning in failur
14ae0 65 2e 20 28 6d 61 78 20 3d 20 25 6c 69 2c 20 78  e. (max = %li, x
14af0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 25  509_read_ret = %
14b00 6c 75 29 22 2c 20 28 6c 6f 6e 67 29 20 5f 50 4f  lu)", (long) _PO
14b10 53 49 58 5f 53 53 49 5a 45 5f 4d 41 58 2c 20 28  SIX_SSIZE_MAX, (
14b20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 78  unsigned long) x
14b30 35 30 39 5f 72 65 61 64 5f 72 65 74 29 3b 0a 0a  509_read_ret);..
14b40 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 7d  ..return(-1);..}
14b50 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66  .#  endif.#endif
14b60 0a 0a 09 72 65 74 75 72 6e 28 78 35 30 39 5f 72  ...return(x509_r
14b70 65 61 64 5f 72 65 74 29 3b 0a 7d 0a 0a 2f 2a 20  ead_ret);.}../* 
14b80 52 65 74 75 72 6e 73 20 30 20 6f 6e 20 73 75 63  Returns 0 on suc
14b90 63 65 73 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  cess */.static i
14ba0 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  nt cackey_mutex_
14bb0 63 72 65 61 74 65 28 76 6f 69 64 20 2a 2a 6d 75  create(void **mu
14bc0 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64 5f  tex) {..pthread_
14bd0 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61 64  mutex_t *pthread
14be0 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74 68  _mutex;..int pth
14bf0 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43 4b  read_retval;..CK
14c00 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76 61  _RV custom_retva
14c10 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
14c20 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
14c30 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63 6b  .");...if ((cack
14c40 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26 20  ey_args.flags & 
14c50 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f 4f  CKF_OS_LOCKING_O
14c60 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f 43  K) == CKF_OS_LOC
14c70 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74 68  KING_OK) {...pth
14c80 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 61 6c  read_mutex = mal
14c90 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 74 68 72  loc(sizeof(*pthr
14ca0 65 61 64 5f 6d 75 74 65 78 29 29 3b 0a 09 09 69  ead_mutex));...i
14cb0 66 20 28 21 70 74 68 72 65 61 64 5f 6d 75 74 65  f (!pthread_mute
14cc0 78 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  x) {....CACKEY_D
14cd0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 61 69  EBUG_PRINTF("Fai
14ce0 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  led to allocate 
14cf0 6d 65 6d 6f 72 79 2e 22 29 3b 0a 0a 09 09 09 72  memory.");.....r
14d00 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 7d 0a 0a  eturn(-1);...}..
14d10 09 09 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  ..pthread_retval
14d20 20 3d 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78   = pthread_mutex
14d30 5f 69 6e 69 74 28 70 74 68 72 65 61 64 5f 6d 75  _init(pthread_mu
14d40 74 65 78 2c 20 4e 55 4c 4c 29 3b 0a 09 09 69 66  tex, NULL);...if
14d50 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
14d60 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
14d70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
14d80 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 69  "pthread_mutex_i
14d90 6e 69 74 28 29 20 72 65 74 75 72 6e 65 64 20 65  nit() returned e
14da0 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
14db0 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
14dc0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
14dd0 7d 0a 0a 09 09 2a 6d 75 74 65 78 20 3d 20 70 74  }....*mutex = pt
14de0 68 72 65 61 64 5f 6d 75 74 65 78 3b 0a 09 7d 20  hread_mutex;..} 
14df0 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 63 61 63  else {...if (cac
14e00 6b 65 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d  key_args.CreateM
14e10 75 74 65 78 29 20 7b 0a 09 09 09 63 75 73 74 6f  utex) {....custo
14e20 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  m_retval = cacke
14e30 79 5f 61 72 67 73 2e 43 72 65 61 74 65 4d 75 74  y_args.CreateMut
14e40 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09 69  ex(mutex);.....i
14e50 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c  f (custom_retval
14e60 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09   != CKR_OK) {...
14e70 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
14e80 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61 72  RINTF("cackey_ar
14e90 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 28 29  gs.CreateMutex()
14ea0 20 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20   returned error 
14eb0 28 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20  (%li).", (long) 
14ec0 63 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a  custom_retval);.
14ed0 0a 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b  .....return(-1);
14ee0 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43  ....}...}..}...C
14ef0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
14f00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75  TF("Returning su
14f10 63 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b  cessfully (0)");
14f20 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a  ...return(0);.}.
14f30 0a 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e  ./* Returns 0 on
14f40 20 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74   success */.stat
14f50 69 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75  ic int cackey_mu
14f60 74 65 78 5f 6c 6f 63 6b 28 76 6f 69 64 20 2a 6d  tex_lock(void *m
14f70 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61 64  utex) {..pthread
14f80 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65 61  _mutex_t *pthrea
14f90 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70 74  d_mutex;..int pt
14fa0 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09 43  hread_retval;..C
14fb0 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74 76  K_RV custom_retv
14fc0 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
14fd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
14fe0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61 63  d.");...if ((cac
14ff0 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20 26  key_args.flags &
15000 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47 5f   CKF_OS_LOCKING_
15010 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c 4f  OK) == CKF_OS_LO
15020 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70 74  CKING_OK) {...pt
15030 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d 75  hread_mutex = mu
15040 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64 5f  tex;....pthread_
15050 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61 64  retval = pthread
15060 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 74 68 72  _mutex_lock(pthr
15070 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09 09 69 66  ead_mutex);...if
15080 20 28 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c   (pthread_retval
15090 20 21 3d 20 30 29 20 7b 0a 09 09 09 43 41 43 4b   != 0) {....CACK
150a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
150b0 22 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 6c  "pthread_mutex_l
150c0 6f 63 6b 28 29 20 72 65 74 75 72 6e 65 64 20 65  ock() returned e
150d0 72 72 6f 72 20 28 25 69 29 2e 22 2c 20 70 74 68  rror (%i).", pth
150e0 72 65 61 64 5f 72 65 74 76 61 6c 29 3b 0a 0a 09  read_retval);...
150f0 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09  ..return(-1);...
15100 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66  }..} else {...if
15110 20 28 63 61 63 6b 65 79 5f 61 72 67 73 2e 4c 6f   (cackey_args.Lo
15120 63 6b 4d 75 74 65 78 29 20 7b 0a 09 09 09 63 75  ckMutex) {....cu
15130 73 74 6f 6d 5f 72 65 74 76 61 6c 20 3d 20 63 61  stom_retval = ca
15140 63 6b 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75  ckey_args.LockMu
15150 74 65 78 28 6d 75 74 65 78 29 3b 0a 0a 09 09 09  tex(mutex);.....
15160 69 66 20 28 63 75 73 74 6f 6d 5f 72 65 74 76 61  if (custom_retva
15170 6c 20 21 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09  l != CKR_OK) {..
15180 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15190 50 52 49 4e 54 46 28 22 63 61 63 6b 65 79 5f 61  PRINTF("cackey_a
151a0 72 67 73 2e 4c 6f 63 6b 4d 75 74 65 78 28 29 20  rgs.LockMutex() 
151b0 72 65 74 75 72 6e 65 64 20 65 72 72 6f 72 20 28  returned error (
151c0 25 6c 69 29 2e 22 2c 20 28 6c 6f 6e 67 29 20 63  %li).", (long) c
151d0 75 73 74 6f 6d 5f 72 65 74 76 61 6c 29 3b 0a 0a  ustom_retval);..
151e0 09 09 09 09 72 65 74 75 72 6e 28 2d 31 29 3b 0a  ....return(-1);.
151f0 09 09 09 7d 0a 09 09 7d 0a 09 7d 0a 0a 09 43 41  ...}...}..}...CA
15200 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15210 46 28 22 52 65 74 75 72 6e 69 6e 67 20 73 75 63  F("Returning suc
15220 65 73 73 66 75 6c 6c 79 20 28 30 29 22 29 3b 0a  essfully (0)");.
15230 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a 7d 0a 0a  ..return(0);.}..
15240 2f 2a 20 52 65 74 75 72 6e 73 20 30 20 6f 6e 20  /* Returns 0 on 
15250 73 75 63 63 65 73 73 20 2a 2f 0a 73 74 61 74 69  success */.stati
15260 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 6d 75 74  c int cackey_mut
15270 65 78 5f 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a  ex_unlock(void *
15280 6d 75 74 65 78 29 20 7b 0a 09 70 74 68 72 65 61  mutex) {..pthrea
15290 64 5f 6d 75 74 65 78 5f 74 20 2a 70 74 68 72 65  d_mutex_t *pthre
152a0 61 64 5f 6d 75 74 65 78 3b 0a 09 69 6e 74 20 70  ad_mutex;..int p
152b0 74 68 72 65 61 64 5f 72 65 74 76 61 6c 3b 0a 09  thread_retval;..
152c0 43 4b 5f 52 56 20 63 75 73 74 6f 6d 5f 72 65 74  CK_RV custom_ret
152d0 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
152e0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
152f0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 63 61  ed.");...if ((ca
15300 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
15310 26 20 43 4b 46 5f 4f 53 5f 4c 4f 43 4b 49 4e 47  & CKF_OS_LOCKING
15320 5f 4f 4b 29 20 3d 3d 20 43 4b 46 5f 4f 53 5f 4c  _OK) == CKF_OS_L
15330 4f 43 4b 49 4e 47 5f 4f 4b 29 20 7b 0a 09 09 70  OCKING_OK) {...p
15340 74 68 72 65 61 64 5f 6d 75 74 65 78 20 3d 20 6d  thread_mutex = m
15350 75 74 65 78 3b 0a 0a 09 09 70 74 68 72 65 61 64  utex;....pthread
15360 5f 72 65 74 76 61 6c 20 3d 20 70 74 68 72 65 61  _retval = pthrea
15370 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70  d_mutex_unlock(p
15380 74 68 72 65 61 64 5f 6d 75 74 65 78 29 3b 0a 09  thread_mutex);..
15390 09 69 66 20 28 70 74 68 72 65 61 64 5f 72 65 74  .if (pthread_ret
153a0 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 43  val != 0) {....C
153b0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
153c0 54 46 28 22 70 74 68 72 65 61 64 5f 6d 75 74 65  TF("pthread_mute
153d0 78 5f 75 6e 6c 6f 63 6b 28 29 20 72 65 74 75 72  x_unlock() retur
153e0 6e 65 64 20 65 72 72 6f 72 20 28 25 69 29 2e 22  ned error (%i)."
153f0 2c 20 70 74 68 72 65 61 64 5f 72 65 74 76 61 6c  , pthread_retval
15400 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28 2d 31  );.....return(-1
15410 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b  );...}..} else {
15420 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f 61 72  ...if (cackey_ar
15430 67 73 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 29 20  gs.UnlockMutex) 
15440 7b 0a 09 09 09 63 75 73 74 6f 6d 5f 72 65 74 76  {....custom_retv
15450 61 6c 20 3d 20 63 61 63 6b 65 79 5f 61 72 67 73  al = cackey_args
15460 2e 55 6e 6c 6f 63 6b 4d 75 74 65 78 28 6d 75 74  .UnlockMutex(mut
15470 65 78 29 3b 0a 0a 09 09 09 69 66 20 28 63 75 73  ex);.....if (cus
15480 74 6f 6d 5f 72 65 74 76 61 6c 20 21 3d 20 43 4b  tom_retval != CK
15490 52 5f 4f 4b 29 20 7b 0a 09 09 09 09 43 41 43 4b  R_OK) {.....CACK
154a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
154b0 22 63 61 63 6b 65 79 5f 61 72 67 73 2e 55 6e 6c  "cackey_args.Unl
154c0 6f 63 6b 4d 75 74 65 78 28 29 20 72 65 74 75 72  ockMutex() retur
154d0 6e 65 64 20 65 72 72 6f 72 20 28 25 6c 69 29 2e  ned error (%li).
154e0 22 2c 20 28 6c 6f 6e 67 29 20 63 75 73 74 6f 6d  ", (long) custom
154f0 5f 72 65 74 76 61 6c 29 3b 0a 0a 09 09 09 09 72  _retval);......r
15500 65 74 75 72 6e 28 2d 31 29 3b 0a 09 09 09 7d 0a  eturn(-1);....}.
15510 09 09 7d 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  ..}..}...CACKEY_
15520 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
15530 74 75 72 6e 69 6e 67 20 73 75 63 65 73 73 66 75  turning sucessfu
15540 6c 6c 79 20 28 30 29 22 29 3b 0a 0a 09 72 65 74  lly (0)");...ret
15550 75 72 6e 28 30 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(0);.}..stati
15560 63 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  c CK_ATTRIBUTE_P
15570 54 52 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74  TR cackey_get_at
15580 74 72 69 62 75 74 65 73 28 43 4b 5f 4f 42 4a 45  tributes(CK_OBJE
15590 43 54 5f 43 4c 41 53 53 20 6f 62 6a 65 63 74 63  CT_CLASS objectc
155a0 6c 61 73 73 2c 20 73 74 72 75 63 74 20 63 61 63  lass, struct cac
155b0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
155c0 79 20 2a 69 64 65 6e 74 69 74 79 2c 20 75 6e 73  y *identity, uns
155d0 69 67 6e 65 64 20 6c 6f 6e 67 20 69 64 65 6e 74  igned long ident
155e0 69 74 79 5f 6e 75 6d 2c 20 43 4b 5f 55 4c 4f 4e  ity_num, CK_ULON
155f0 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29 20  G_PTR pulCount) 
15600 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f  {..static CK_BBO
15610 4f 4c 20 63 6b 5f 74 72 75 65 20 3d 20 31 3b 0a  OL ck_true = 1;.
15620 09 73 74 61 74 69 63 20 43 4b 5f 42 42 4f 4f 4c  .static CK_BBOOL
15630 20 63 6b 5f 66 61 6c 73 65 20 3d 20 30 3b 0a 09   ck_false = 0;..
15640 73 74 61 74 69 63 20 43 4b 5f 54 52 55 53 54 20  static CK_TRUST 
15650 63 6b 5f 74 72 75 73 74 65 64 20 3d 20 43 4b 5f  ck_trusted = CK_
15660 54 52 55 53 54 45 44 5f 44 45 4c 45 47 41 54 4f  TRUSTED_DELEGATO
15670 52 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6e 75 6d  R;..CK_ULONG num
15680 61 74 74 72 73 20 3d 20 30 2c 20 72 65 74 76 61  attrs = 0, retva
15690 6c 5f 63 6f 75 6e 74 3b 0a 09 43 4b 5f 41 54 54  l_count;..CK_ATT
156a0 52 49 42 55 54 45 5f 54 59 50 45 20 63 75 72 72  RIBUTE_TYPE curr
156b0 5f 61 74 74 72 5f 74 79 70 65 3b 0a 09 43 4b 5f  _attr_type;..CK_
156c0 41 54 54 52 49 42 55 54 45 20 63 75 72 72 5f 61  ATTRIBUTE curr_a
156d0 74 74 72 2c 20 2a 72 65 74 76 61 6c 3b 0a 09 43  ttr, *retval;..C
156e0 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c 75  K_VOID_PTR pValu
156f0 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c 56  e;..CK_ULONG ulV
15700 61 6c 75 65 4c 65 6e 3b 0a 09 43 4b 5f 4f 42 4a  alueLen;..CK_OBJ
15710 45 43 54 5f 43 4c 41 53 53 20 63 6b 5f 6f 62 6a  ECT_CLASS ck_obj
15720 65 63 74 5f 63 6c 61 73 73 3b 0a 09 43 4b 5f 43  ect_class;..CK_C
15730 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
15740 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74  ck_certificate_t
15750 79 70 65 3b 0a 09 43 4b 5f 4b 45 59 5f 54 59 50  ype;..CK_KEY_TYP
15760 45 20 63 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09  E ck_key_type;..
15770 43 4b 5f 55 54 46 38 43 48 41 52 20 75 63 54 6d  CK_UTF8CHAR ucTm
15780 70 42 75 66 5b 31 30 32 34 5d 3b 0a 09 53 48 41  pBuf[1024];..SHA
15790 31 43 6f 6e 74 65 78 74 20 73 68 61 31 5f 63 74  1Context sha1_ct
157a0 78 3b 0a 09 4d 44 35 5f 43 54 58 20 6d 64 35 5f  x;..MD5_CTX md5_
157b0 63 74 78 3b 0a 09 75 69 6e 74 38 5f 74 20 73 68  ctx;..uint8_t sh
157c0 61 31 5f 68 61 73 68 5b 53 48 41 31 48 61 73 68  a1_hash[SHA1Hash
157d0 53 69 7a 65 5d 3b 0a 09 75 69 6e 74 38 5f 74 20  Size];..uint8_t 
157e0 6d 64 35 5f 68 61 73 68 5b 4d 44 35 48 61 73 68  md5_hash[MD5Hash
157f0 53 69 7a 65 5d 3b 0a 09 75 6e 73 69 67 6e 65 64  Size];..unsigned
15800 20 63 68 61 72 20 2a 63 65 72 74 69 66 69 63 61   char *certifica
15810 74 65 3b 0a 09 73 73 69 7a 65 5f 74 20 63 65 72  te;..ssize_t cer
15820 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20 2d  tificate_len = -
15830 31 2c 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74  1, x509_read_ret
15840 3b 0a 09 69 6e 74 20 70 56 61 6c 75 65 5f 66 72  ;..int pValue_fr
15850 65 65 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ee;...CACKEY_DEB
15860 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
15870 64 20 28 6f 62 6a 65 63 74 43 6c 61 73 73 20 3d  d (objectClass =
15880 20 25 6c 75 2c 20 69 64 65 6e 74 69 74 79 5f 6e   %lu, identity_n
15890 75 6d 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75 6e  um = %lu).", (un
158a0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 6f 62 6a  signed long) obj
158b0 65 63 74 63 6c 61 73 73 2c 20 69 64 65 6e 74 69  ectclass, identi
158c0 74 79 5f 6e 75 6d 29 3b 0a 0a 09 2a 70 75 6c 43  ty_num);...*pulC
158d0 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 69 66 20 28  ount = 0;...if (
158e0 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20 43  objectclass != C
158f0 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 26  KO_CERTIFICATE &
15900 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d  & objectclass !=
15910 20 43 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 20   CKO_PUBLIC_KEY 
15920 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
15930 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45  = CKO_PRIVATE_KE
15940 59 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  Y && objectclass
15950 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
15960 5f 54 52 55 53 54 29 20 7b 0a 09 09 43 41 43 4b  _TRUST) {...CACK
15970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15980 22 52 65 74 75 72 6e 69 6e 67 20 30 20 6f 62 6a  "Returning 0 obj
15990 65 63 74 73 20 28 4e 55 4c 4c 29 2c 20 69 6e 76  ects (NULL), inv
159a0 61 6c 69 64 20 6f 62 6a 65 63 74 20 63 6c 61 73  alid object clas
159b0 73 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e  s");....return(N
159c0 55 4c 4c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 47 65  ULL);..}.../* Ge
159d0 74 20 43 65 72 74 20 2a 2f 0a 09 69 66 20 28 69  t Cert */..if (i
159e0 64 65 6e 74 69 74 79 20 3d 3d 20 4e 55 4c 4c 29  dentity == NULL)
159f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15a00 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15a10 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
15a20 55 4c 4c 29 2c 20 69 6e 76 61 6c 69 64 20 69 64  ULL), invalid id
15a30 65 6e 74 69 79 20 70 72 6f 76 69 64 65 64 22 29  entiy provided")
15a40 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
15a50 29 3b 0a 09 7d 0a 0a 09 63 65 72 74 69 66 69 63  );..}...certific
15a60 61 74 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  ate = identity->
15a70 63 65 72 74 69 66 69 63 61 74 65 3b 0a 09 63 65  certificate;..ce
15a80 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 20 3d 20  rtificate_len = 
15a90 69 64 65 6e 74 69 74 79 2d 3e 63 65 72 74 69 66  identity->certif
15aa0 69 63 61 74 65 5f 6c 65 6e 3b 0a 0a 09 69 66 20  icate_len;...if 
15ab0 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e  (certificate_len
15ac0 20 3d 3d 20 2d 31 20 7c 7c 20 63 65 72 74 69 66   == -1 || certif
15ad0 69 63 61 74 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  icate == NULL) {
15ae0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
15af0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
15b00 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e 55 4c  g 0 objects (NUL
15b10 4c 29 2c 20 74 68 69 73 20 69 64 65 6e 74 69 74  L), this identit
15b20 79 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  y does not have 
15b30 61 6e 20 58 2e 35 30 39 20 63 65 72 74 69 66 69  an X.509 certifi
15b40 63 61 74 65 20 61 73 73 6f 63 69 61 74 65 64 20  cate associated 
15b50 77 69 74 68 20 69 74 20 61 6e 64 20 77 69 6c 6c  with it and will
15b60 20 6e 6f 74 20 77 6f 72 6b 22 29 3b 0a 0a 09 09   not work");....
15b70 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d  return(NULL);..}
15b80 0a 0a 09 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .../* Verify tha
15b90 74 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  t certificate is
15ba0 20 41 53 4e 2e 31 20 65 6e 63 6f 64 65 64 20 58   ASN.1 encoded X
15bb0 2e 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  .509 certificate
15bc0 20 2a 2f 0a 09 69 66 20 28 78 35 30 39 5f 74 6f   */..if (x509_to
15bd0 5f 73 65 72 69 61 6c 28 63 65 72 74 69 66 69 63  _serial(certific
15be0 61 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65  ate, certificate
15bf0 5f 6c 65 6e 2c 20 4e 55 4c 4c 29 20 3c 20 30 29  _len, NULL) < 0)
15c00 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
15c10 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
15c20 69 6e 67 20 30 20 6f 62 6a 65 63 74 73 20 28 4e  ing 0 objects (N
15c30 55 4c 4c 29 2c 20 74 68 65 20 58 2e 35 30 39 20  ULL), the X.509 
15c40 63 65 72 74 69 66 69 63 61 74 65 20 61 73 73 6f  certificate asso
15c50 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
15c60 20 69 64 65 6e 74 69 74 79 20 69 73 20 6e 6f 74   identity is not
15c70 20 76 61 6c 69 64 22 29 3b 0a 0a 09 09 72 65 74   valid");....ret
15c80 75 72 6e 28 4e 55 4c 4c 29 3b 0a 09 7d 0a 0a 09  urn(NULL);..}...
15c90 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 36  retval_count = 6
15ca0 34 3b 0a 09 72 65 74 76 61 6c 20 3d 20 6d 61 6c  4;..retval = mal
15cb0 6c 6f 63 28 72 65 74 76 61 6c 5f 63 6f 75 6e 74  loc(retval_count
15cc0 20 2a 20 73 69 7a 65 6f 66 28 2a 72 65 74 76 61   * sizeof(*retva
15cd0 6c 29 29 3b 0a 0a 09 66 6f 72 20 28 63 75 72 72  l));...for (curr
15ce0 5f 61 74 74 72 5f 74 79 70 65 20 3d 20 30 3b 20  _attr_type = 0; 
15cf0 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 20 3c  curr_attr_type <
15d00 20 30 78 63 65 35 33 36 33 62 66 3b 20 63 75 72   0xce5363bf; cur
15d10 72 5f 61 74 74 72 5f 74 79 70 65 2b 2b 29 20 7b  r_attr_type++) {
15d20 0a 09 09 69 66 20 28 63 75 72 72 5f 61 74 74 72  ...if (curr_attr
15d30 5f 74 79 70 65 20 3d 3d 20 30 78 38 30 30 29 20  _type == 0x800) 
15d40 7b 0a 09 09 09 63 75 72 72 5f 61 74 74 72 5f 74  {....curr_attr_t
15d50 79 70 65 20 3d 20 30 78 63 65 35 33 36 33 30 30  ype = 0xce536300
15d60 3b 0a 09 09 7d 0a 0a 09 09 70 56 61 6c 75 65 5f  ;...}....pValue_
15d70 66 72 65 65 20 3d 20 30 3b 0a 09 09 70 56 61 6c  free = 0;...pVal
15d80 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56  ue = NULL;...ulV
15d90 61 6c 75 65 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f  alueLen = (CK_LO
15da0 4e 47 29 20 2d 31 3b 0a 0a 09 09 73 77 69 74 63  NG) -1;....switc
15db0 68 20 28 63 75 72 72 5f 61 74 74 72 5f 74 79 70  h (curr_attr_typ
15dc0 65 29 20 7b 0a 09 09 09 63 61 73 65 20 43 4b 41  e) {....case CKA
15dd0 5f 43 4c 41 53 53 3a 0a 09 09 09 09 43 41 43 4b  _CLASS:.....CACK
15de0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
15df0 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
15e00 69 62 75 74 65 20 43 4b 41 5f 43 4c 41 53 53 20  ibute CKA_CLASS 
15e10 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20  (0x%08lx) ...", 
15e20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
15e30 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b  curr_attr_type);
15e40 0a 0a 09 09 09 09 63 6b 5f 6f 62 6a 65 63 74 5f  ......ck_object_
15e50 63 6c 61 73 73 20 3d 20 6f 62 6a 65 63 74 63 6c  class = objectcl
15e60 61 73 73 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65  ass;......pValue
15e70 20 3d 20 26 63 6b 5f 6f 62 6a 65 63 74 5f 63 6c   = &ck_object_cl
15e80 61 73 73 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65  ass;.....ulValue
15e90 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
15ea0 6f 62 6a 65 63 74 5f 63 6c 61 73 73 29 3b 0a 0a  object_class);..
15eb0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
15ec0 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
15ed0 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
15ee0 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
15ef0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 4f 42 4a   long) *((CK_OBJ
15f00 45 43 54 5f 43 4c 41 53 53 20 2a 29 20 70 56 61  ECT_CLASS *) pVa
15f10 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
15f20 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
15f30 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
15f40 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
15f50 4b 41 5f 54 4f 4b 45 4e 3a 0a 09 09 09 09 43 41  KA_TOKEN:.....CA
15f60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
15f70 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
15f80 74 72 69 62 75 74 65 20 43 4b 41 5f 54 4f 4b 45  tribute CKA_TOKE
15f90 4e 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  N (0x%08lx) ..."
15fa0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
15fb0 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
15fc0 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  );......pValue =
15fd0 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09 75   &ck_true;.....u
15fe0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65  lValueLen = size
15ff0 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 0a 09 09  of(ck_true);....
16000 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
16010 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
16020 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c  rning %lu (%p/%l
16030 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  u)", (unsigned l
16040 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c  ong) *((CK_BBOOL
16050 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61   *) pValue), pVa
16060 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  lue, (unsigned l
16070 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29  ong) ulValueLen)
16080 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  ;......break;...
16090 09 63 61 73 65 20 43 4b 41 5f 50 52 49 56 41 54  .case CKA_PRIVAT
160a0 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
160b0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
160c0 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
160d0 20 43 4b 41 5f 50 52 49 56 41 54 45 20 28 30 78   CKA_PRIVATE (0x
160e0 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e  %08lx) ...", (un
160f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72  signed long) cur
16100 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09  r_attr_type);...
16110 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61  ...if (objectcla
16120 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41  ss != CKO_NETSCA
16130 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09  PE_TRUST) {.....
16140 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
16150 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e  INTF(" ... but n
16160 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65  ot getting it be
16170 63 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74  cause we are not
16180 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
16190 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
161a0 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
161b0 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63 6b  ....pValue = &ck
161c0 5f 66 61 6c 73 65 3b 0a 09 09 09 09 75 6c 56 61  _false;.....ulVa
161d0 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28  lueLen = sizeof(
161e0 63 6b 5f 66 61 6c 73 65 29 3b 0a 0a 09 09 09 09  ck_false);......
161f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16200 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
16210 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
16220 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
16230 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
16240 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
16250 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
16260 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16270 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
16280 61 73 65 20 43 4b 41 5f 54 52 55 53 54 45 44 3a  ase CKA_TRUSTED:
16290 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
162a0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
162b0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
162c0 4b 41 5f 54 52 55 53 54 45 44 20 28 30 78 25 30  KA_TRUSTED (0x%0
162d0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
162e0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
162f0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
16300 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
16310 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
16320 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
16330 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16340 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
16350 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
16360 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
16370 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
16380 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
16390 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 70 56  k;.....}......pV
163a0 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
163b0 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
163c0 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72 75 65  = sizeof(ck_true
163d0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
163e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e  EBUG_PRINTF(" ..
163f0 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20  . returning %lu 
16400 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69  (%p/%lu)", (unsi
16410 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b  gned long) *((CK
16420 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65  _BBOOL *) pValue
16430 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ), pValue, (unsi
16440 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
16450 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
16460 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
16470 4d 4f 44 49 46 49 41 42 4c 45 3a 0a 09 09 09 09  MODIFIABLE:.....
16480 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16490 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e 67 20  NTF("Requesting 
164a0 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f 4d 4f  attribute CKA_MO
164b0 44 49 46 49 41 42 4c 45 20 28 30 78 25 30 38 6c  DIFIABLE (0x%08l
164c0 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
164d0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
164e0 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 70  tr_type);......p
164f0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61 6c 73  Value = &ck_fals
16500 65 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  e;.....ulValueLe
16510 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61  n = sizeof(ck_fa
16520 6c 73 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45  lse);......CACKE
16530 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16540 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25   ... returning %
16550 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75  lu (%p/%lu)", (u
16560 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28  nsigned long) *(
16570 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61  (CK_BBOOL *) pVa
16580 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75  lue), pValue, (u
16590 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
165a0 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
165b0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
165c0 4b 41 5f 4c 41 42 45 4c 3a 0a 09 09 09 09 43 41  KA_LABEL:.....CA
165d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
165e0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
165f0 74 72 69 62 75 74 65 20 43 4b 41 5f 4c 41 42 45  tribute CKA_LABE
16600 4c 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  L (0x%08lx) ..."
16610 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16620 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
16630 29 3b 0a 0a 09 09 09 09 2f 2a 20 58 58 58 3a 20  );....../* XXX: 
16640 44 65 74 65 72 6d 69 6e 65 20 6e 61 6d 65 20 2a  Determine name *
16650 2f 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  /.....ulValueLen
16660 20 3d 20 73 6e 70 72 69 6e 74 66 28 28 63 68 61   = snprintf((cha
16670 72 20 2a 29 20 75 63 54 6d 70 42 75 66 2c 20 73  r *) ucTmpBuf, s
16680 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 2c  izeof(ucTmpBuf),
16690 20 22 49 64 65 6e 74 69 74 79 20 23 25 6c 75 22   "Identity #%lu"
166a0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
166b0 29 20 69 64 65 6e 74 69 74 79 5f 6e 75 6d 29 3b  ) identity_num);
166c0 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 75 63  .....pValue = uc
166d0 54 6d 70 42 75 66 3b 0a 0a 09 09 09 09 69 66 20  TmpBuf;......if 
166e0 28 75 6c 56 61 6c 75 65 4c 65 6e 20 3e 3d 20 73  (ulValueLen >= s
166f0 69 7a 65 6f 66 28 75 63 54 6d 70 42 75 66 29 29  izeof(ucTmpBuf))
16700 20 7b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c   {......ulValueL
16710 65 6e 20 3d 20 30 3b 0a 09 09 09 09 09 70 56 61  en = 0;......pVa
16720 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
16730 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  }......CACKEY_DE
16740 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
16750 20 72 65 74 75 72 6e 69 6e 67 20 28 25 70 2f 25   returning (%p/%
16760 6c 75 29 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  lu)", pValue, (u
16770 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
16780 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
16790 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
167a0 4b 41 5f 56 41 4c 55 45 3a 0a 09 09 09 09 43 41  KA_VALUE:.....CA
167b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
167c0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
167d0 74 72 69 62 75 74 65 20 43 4b 41 5f 56 41 4c 55  tribute CKA_VALU
167e0 45 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  E (0x%08lx) ..."
167f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
16800 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
16810 29 3b 0a 0a 09 09 09 09 73 77 69 74 63 68 20 28  );......switch (
16820 6f 62 6a 65 63 74 63 6c 61 73 73 29 20 7b 0a 09  objectclass) {..
16830 09 09 09 09 63 61 73 65 20 43 4b 4f 5f 50 52 49  ....case CKO_PRI
16840 56 41 54 45 5f 4b 45 59 3a 0a 09 09 09 09 09 09  VATE_KEY:.......
16850 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
16860 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
16870 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
16880 61 75 73 65 20 77 65 20 61 72 65 20 61 20 70 72  ause we are a pr
16890 69 76 61 74 65 20 6b 65 79 2e 22 29 3b 0a 0a 09  ivate key.");...
168a0 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
168b0 09 63 61 73 65 20 43 4b 4f 5f 4e 45 54 53 43 41  .case CKO_NETSCA
168c0 50 45 5f 54 52 55 53 54 3a 0a 09 09 09 09 09 09  PE_TRUST:.......
168d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
168e0 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
168f0 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
16900 61 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65  ause we are a Ne
16910 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
16920 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 09 62 72  ect");........br
16930 65 61 6b 3b 0a 09 09 09 09 09 63 61 73 65 20 43  eak;......case C
16940 4b 4f 5f 50 55 42 4c 49 43 5f 4b 45 59 3a 0a 09  KO_PUBLIC_KEY:..
16950 09 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
16960 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
16970 0a 09 09 09 09 09 09 09 78 35 30 39 5f 72 65 61  ........x509_rea
16980 64 5f 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f  d_ret = x509_to_
16990 70 75 62 6b 65 79 28 63 65 72 74 69 66 69 63 61  pubkey(certifica
169a0 74 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f  te, certificate_
169b0 6c 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09  len, &pValue);..
169c0 09 09 09 09 09 09 69 66 20 28 78 35 30 39 5f 72  ......if (x509_r
169d0 65 61 64 5f 72 65 74 20 3c 20 30 29 20 7b 20 0a  ead_ret < 0) { .
169e0 09 09 09 09 09 09 09 09 70 56 61 6c 75 65 20 3d  ........pValue =
169f0 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 09 09 7d 20   NULL;........} 
16a00 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 09 09 75  else {.........u
16a10 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
16a20 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
16a30 09 09 7d 0a 09 09 09 09 09 09 7d 0a 0a 09 09 09  ..}.......}.....
16a40 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 63  ...break;......c
16a50 61 73 65 20 43 4b 4f 5f 43 45 52 54 49 46 49 43  ase CKO_CERTIFIC
16a60 41 54 45 3a 0a 09 09 09 09 09 09 70 56 61 6c 75  ATE:.......pValu
16a70 65 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 3b  e = certificate;
16a80 0a 09 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  .......ulValueLe
16a90 6e 20 3d 20 63 65 72 74 69 66 69 63 61 74 65 5f  n = certificate_
16aa0 6c 65 6e 3b 0a 0a 09 09 09 09 09 09 62 72 65 61  len;........brea
16ab0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  k;.....}......CA
16ac0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16ad0 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16ae0 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
16af0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
16b00 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16b10 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
16b20 61 73 65 20 43 4b 41 5f 49 53 53 55 45 52 3a 0a  ase CKA_ISSUER:.
16b30 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
16b40 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
16b50 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
16b60 41 5f 49 53 53 55 45 52 20 28 30 78 25 30 38 6c  A_ISSUER (0x%08l
16b70 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
16b80 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
16b90 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
16ba0 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
16bb0 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54  = CKO_CERTIFICAT
16bc0 45 20 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73  E && objectclass
16bd0 20 21 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   != CKO_NETSCAPE
16be0 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
16bf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
16c00 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
16c10 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
16c20 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61  use we are not a
16c30 20 63 65 72 74 69 66 69 63 61 74 65 20 6f 72 20   certificate or 
16c40 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f  Netscape trust o
16c50 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62  bject");.......b
16c60 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09  reak;.....}.....
16c70 09 69 66 20 28 63 65 72 74 69 66 69 63 61 74 65  .if (certificate
16c80 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09  _len >= 0) {....
16c90 09 09 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20  ..x509_read_ret 
16ca0 3d 20 78 35 30 39 5f 74 6f 5f 69 73 73 75 65 72  = x509_to_issuer
16cb0 28 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65  (certificate, ce
16cc0 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26  rtificate_len, &
16cd0 70 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66  pValue);......if
16ce0 20 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20   (x509_read_ret 
16cf0 3c 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61  < 0) {.......pVa
16d00 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  lue = NULL;.....
16d10 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09  .} else {.......
16d20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30  ulValueLen = x50
16d30 39 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09  9_read_ret;.....
16d40 09 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41  .}.....}......CA
16d50 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
16d60 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e  F(" ... returnin
16d70 67 20 25 70 2f 25 6c 75 22 2c 20 70 56 61 6c 75  g %p/%lu", pValu
16d80 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
16d90 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
16da0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
16db0 61 73 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f 4e  ase CKA_SERIAL_N
16dc0 55 4d 42 45 52 3a 0a 09 09 09 09 43 41 43 4b 45  UMBER:.....CACKE
16dd0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
16de0 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72 69  Requesting attri
16df0 62 75 74 65 20 43 4b 41 5f 53 45 52 49 41 4c 5f  bute CKA_SERIAL_
16e00 4e 55 4d 42 45 52 20 28 30 78 25 30 38 6c 78 29  NUMBER (0x%08lx)
16e10 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
16e20 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
16e30 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
16e40 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d 20  (objectclass != 
16e50 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20  CKO_CERTIFICATE 
16e60 26 26 20 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  && objectclass !
16e70 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
16e80 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
16e90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
16ea0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
16eb0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
16ec0 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63  e we are not a c
16ed0 65 72 74 69 66 69 63 61 74 65 20 6f 72 20 4e 65  ertificate or Ne
16ee0 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a  tscape trust obj
16ef0 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65  ect");.......bre
16f00 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69  ak;.....}......i
16f10 66 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c  f (certificate_l
16f20 65 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09  en >= 0) {......
16f30 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20  x509_read_ret = 
16f40 78 35 30 39 5f 74 6f 5f 73 65 72 69 61 6c 28 63  x509_to_serial(c
16f50 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
16f60 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
16f70 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
16f80 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
16f90 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
16fa0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
16fb0 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
16fc0 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
16fd0 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
16fe0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
16ff0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17000 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
17010 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
17020 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
17030 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
17040 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
17050 61 73 65 20 43 4b 41 5f 53 55 42 4a 45 43 54 3a  ase CKA_SUBJECT:
17060 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17070 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
17080 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
17090 4b 41 5f 53 55 42 4a 45 43 54 20 28 30 78 25 30  KA_SUBJECT (0x%0
170a0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
170b0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
170c0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
170d0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
170e0 20 21 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43   != CKO_CERTIFIC
170f0 41 54 45 29 20 7b 0a 09 09 09 09 09 43 41 43 4b  ATE) {......CACK
17100 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17110 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65  " ... but not ge
17120 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65  tting it because
17130 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 63 65   we are not a ce
17140 72 74 69 66 69 63 61 74 65 22 29 3b 0a 0a 09 09  rtificate");....
17150 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
17160 0a 09 09 09 09 69 66 20 28 63 65 72 74 69 66 69  .....if (certifi
17170 63 61 74 65 5f 6c 65 6e 20 3e 3d 20 30 29 20 7b  cate_len >= 0) {
17180 0a 09 09 09 09 09 78 35 30 39 5f 72 65 61 64 5f  ......x509_read_
17190 72 65 74 20 3d 20 78 35 30 39 5f 74 6f 5f 73 75  ret = x509_to_su
171a0 62 6a 65 63 74 28 63 65 72 74 69 66 69 63 61 74  bject(certificat
171b0 65 2c 20 63 65 72 74 69 66 69 63 61 74 65 5f 6c  e, certificate_l
171c0 65 6e 2c 20 26 70 56 61 6c 75 65 29 3b 0a 09 09  en, &pValue);...
171d0 09 09 09 69 66 20 28 78 35 30 39 5f 72 65 61 64  ...if (x509_read
171e0 5f 72 65 74 20 3c 20 30 29 20 7b 0a 09 09 09 09  _ret < 0) {.....
171f0 09 09 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b  ..pValue = NULL;
17200 0a 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ......} else {..
17210 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20  .....ulValueLen 
17220 3d 20 78 35 30 39 5f 72 65 61 64 5f 72 65 74 3b  = x509_read_ret;
17230 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a 0a 09  ......}.....}...
17240 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17250 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74  PRINTF(" ... ret
17260 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20  urning %p/%lu", 
17270 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65  pValue, (unsigne
17280 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c  d long) ulValueL
17290 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b  en);......break;
172a0 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 49 44 3a  ....case CKA_ID:
172b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
172c0 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
172d0 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
172e0 4b 41 5f 49 44 20 28 30 78 25 30 38 6c 78 29 20  KA_ID (0x%08lx) 
172f0 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64 20  ...", (unsigned 
17300 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72 5f  long) curr_attr_
17310 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20 28  type);......if (
17320 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43  objectclass == C
17330 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55 53  KO_NETSCAPE_TRUS
17340 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59  T) {......CACKEY
17350 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17360 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74  ... but not gett
17370 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77  ing it because w
17380 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70 65  e are a Netscape
17390 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29 3b   trust object");
173a0 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09  .......break;...
173b0 09 09 7d 0a 0a 09 09 09 09 75 63 54 6d 70 42 75  ..}......ucTmpBu
173c0 66 5b 30 5d 20 3d 20 28 28 69 64 65 6e 74 69 74  f[0] = ((identit
173d0 79 5f 6e 75 6d 20 2b 20 31 29 20 3e 3e 20 38 29  y_num + 1) >> 8)
173e0 20 26 20 30 78 66 66 3b 0a 09 09 09 09 75 63 54   & 0xff;.....ucT
173f0 6d 70 42 75 66 5b 31 5d 20 3d 20 20 28 69 64 65  mpBuf[1] =  (ide
17400 6e 74 69 74 79 5f 6e 75 6d 20 2b 20 31 29 20 26  ntity_num + 1) &
17410 20 30 78 66 66 3b 0a 0a 09 09 09 09 70 56 61 6c   0xff;......pVal
17420 75 65 20 3d 20 26 75 63 54 6d 70 42 75 66 3b 0a  ue = &ucTmpBuf;.
17430 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  ....ulValueLen =
17440 20 32 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f   2;......CACKEY_
17450 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17460 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 70 2f  .. returning %p/
17470 25 6c 75 22 2c 20 70 56 61 6c 75 65 2c 20 28 75  %lu", pValue, (u
17480 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c  nsigned long) ul
17490 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09  ValueLen);......
174a0 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43  break;....case C
174b0 4b 41 5f 43 45 52 54 49 46 49 43 41 54 45 5f 54  KA_CERTIFICATE_T
174c0 59 50 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f  YPE:.....CACKEY_
174d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
174e0 71 75 65 73 74 69 6e 67 20 61 74 74 72 69 62 75  questing attribu
174f0 74 65 20 43 4b 41 5f 43 45 52 54 49 46 49 43 41  te CKA_CERTIFICA
17500 54 45 5f 54 59 50 45 20 28 30 78 25 30 38 6c 78  TE_TYPE (0x%08lx
17510 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65  ) ...", (unsigne
17520 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74  d long) curr_att
17530 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66  r_type);......if
17540 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21 3d   (objectclass !=
17550 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45   CKO_CERTIFICATE
17560 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  ) {......CACKEY_
17570 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e  DEBUG_PRINTF(" .
17580 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74 74 69  .. but not getti
17590 6e 67 20 69 74 20 62 65 63 61 75 73 65 20 77 65  ng it because we
175a0 20 61 72 65 20 6e 6f 74 20 61 20 63 65 72 74 69   are not a certi
175b0 66 69 63 61 74 65 2e 22 29 3b 0a 0a 09 09 09 09  ficate.");......
175c0 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09  .break;.....}...
175d0 09 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75  .../* We only su
175e0 70 70 6f 72 74 20 6f 6e 65 20 63 65 72 74 69 66  pport one certif
175f0 69 63 61 74 65 20 74 79 70 65 20 2a 2f 0a 09 09  icate type */...
17600 09 09 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65  ..ck_certificate
17610 5f 74 79 70 65 20 3d 20 43 4b 43 5f 58 5f 35 30  _type = CKC_X_50
17620 39 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d  9;......pValue =
17630 20 26 63 6b 5f 63 65 72 74 69 66 69 63 61 74 65   &ck_certificate
17640 5f 74 79 70 65 3b 0a 09 09 09 09 75 6c 56 61 6c  _type;.....ulVal
17650 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63  ueLen = sizeof(c
17660 6b 5f 63 65 72 74 69 66 69 63 61 74 65 5f 74 79  k_certificate_ty
17670 70 65 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59  pe);......CACKEY
17680 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17690 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 43 4b  ... returning CK
176a0 43 5f 58 5f 35 30 39 20 28 25 6c 75 29 20 28 25  C_X_509 (%lu) (%
176b0 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e  p/%lu)", (unsign
176c0 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 43  ed long) *((CK_C
176d0 45 52 54 49 46 49 43 41 54 45 5f 54 59 50 45 20  ERTIFICATE_TYPE 
176e0 2a 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c  *) pValue), pVal
176f0 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
17700 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
17710 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
17720 63 61 73 65 20 43 4b 41 5f 4b 45 59 5f 54 59 50  case CKA_KEY_TYP
17730 45 3a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  E:.....CACKEY_DE
17740 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75  BUG_PRINTF("Requ
17750 65 73 74 69 6e 67 20 61 74 74 72 69 62 75 74 65  esting attribute
17760 20 43 4b 41 5f 4b 45 59 5f 54 59 50 45 20 28 30   CKA_KEY_TYPE (0
17770 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75  x%08lx) ...", (u
17780 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75  nsigned long) cu
17790 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a  rr_attr_type);..
177a0 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
177b0 61 73 73 20 21 3d 20 43 4b 4f 5f 50 52 49 56 41  ass != CKO_PRIVA
177c0 54 45 5f 4b 45 59 20 26 26 20 6f 62 6a 65 63 74  TE_KEY && object
177d0 63 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 50 55 42  class != CKO_PUB
177e0 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09  LIC_KEY) {......
177f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
17800 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f  NTF(" ... but no
17810 74 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63  t getting it bec
17820 61 75 73 65 20 77 65 20 61 72 65 20 6e 6f 74 20  ause we are not 
17830 61 20 6b 65 79 2e 22 29 3b 0a 0a 09 09 09 09 09  a key.");.......
17840 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
17850 09 09 2f 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70  ../* We only sup
17860 70 6f 72 74 20 6f 6e 65 20 6b 65 79 20 74 79 70  port one key typ
17870 65 20 2a 2f 0a 09 09 09 09 63 6b 5f 6b 65 79 5f  e */.....ck_key_
17880 74 79 70 65 20 3d 20 43 4b 4b 5f 52 53 41 3b 0a  type = CKK_RSA;.
17890 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
178a0 6b 5f 6b 65 79 5f 74 79 70 65 3b 0a 09 09 09 09  k_key_type;.....
178b0 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
178c0 65 6f 66 28 63 6b 5f 6b 65 79 5f 74 79 70 65 29  eof(ck_key_type)
178d0 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
178e0 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
178f0 20 72 65 74 75 72 6e 69 6e 67 20 43 4b 4b 5f 52   returning CKK_R
17900 53 41 20 28 25 6c 75 29 20 28 25 70 2f 25 6c 75  SA (%lu) (%p/%lu
17910 29 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  )", (unsigned lo
17920 6e 67 29 20 2a 28 28 43 4b 5f 43 45 52 54 49 46  ng) *((CK_CERTIF
17930 49 43 41 54 45 5f 54 59 50 45 20 2a 29 20 70 56  ICATE_TYPE *) pV
17940 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
17950 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
17960 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
17970 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
17980 43 4b 41 5f 53 49 47 4e 3a 0a 09 09 09 09 43 41  CKA_SIGN:.....CA
17990 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
179a0 46 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74  F("Requesting at
179b0 74 72 69 62 75 74 65 20 43 4b 41 5f 53 49 47 4e  tribute CKA_SIGN
179c0 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c   (0x%08lx) ...",
179d0 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
179e0 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29   curr_attr_type)
179f0 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63  ;......if (objec
17a00 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45  tclass == CKO_NE
17a10 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a  TSCAPE_TRUST) {.
17a20 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
17a30 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62  G_PRINTF(" ... b
17a40 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69  ut not getting i
17a50 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72 65  t because we are
17a60 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75 73   a Netscape trus
17a70 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09  t object");.....
17a80 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a  ..break;.....}..
17a90 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63 6c  ....if (objectcl
17aa0 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56 41  ass == CKO_PRIVA
17ab0 54 45 5f 4b 45 59 29 20 7b 0a 09 09 09 09 09 70  TE_KEY) {......p
17ac0 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65  Value = &ck_true
17ad0 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65  ;......ulValueLe
17ae0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 74 72  n = sizeof(ck_tr
17af0 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20  ue);.....} else 
17b00 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20  {......pValue = 
17b10 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09  &ck_false;......
17b20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a  ulValueLen = siz
17b30 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b 0a 09  eof(ck_false);..
17b40 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b 45 59  ...}......CACKEY
17b50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20  _DEBUG_PRINTF(" 
17b60 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20 25 6c  ... returning %l
17b70 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e  u (%p/%lu)", (un
17b80 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28  signed long) *((
17b90 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c  CK_BBOOL *) pVal
17ba0 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e  ue), pValue, (un
17bb0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56  signed long) ulV
17bc0 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62  alueLen);......b
17bd0 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b  reak;....case CK
17be0 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 3a 0a  A_SIGN_RECOVER:.
17bf0 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
17c00 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74  _PRINTF("Request
17c10 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b  ing attribute CK
17c20 41 5f 53 49 47 4e 5f 52 45 43 4f 56 45 52 20 28  A_SIGN_RECOVER (
17c30 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
17c40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
17c50 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
17c60 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
17c70 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53  lass == CKO_NETS
17c80 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
17c90 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
17ca0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
17cb0 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
17cc0 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 61  because we are a
17cd0 20 4e 65 74 73 63 61 70 65 20 74 72 75 73 74 20   Netscape trust 
17ce0 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09  object");.......
17cf0 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09  break;.....}....
17d00 09 09 2f 2a 20 57 65 20 63 75 72 72 65 6e 74 6c  ../* We currentl
17d10 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 22  y only support "
17d20 53 69 67 6e 20 77 69 74 68 20 41 70 70 65 6e 64  Sign with Append
17d30 69 78 22 20 2a 2f 0a 09 09 09 09 70 56 61 6c 75  ix" */.....pValu
17d40 65 20 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09  e = &ck_false;..
17d50 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
17d60 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29  sizeof(ck_false)
17d70 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45  ;......CACKEY_DE
17d80 42 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e  BUG_PRINTF(" ...
17d90 20 72 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 28   returning %lu (
17da0 25 70 2f 25 6c 75 29 22 2c 20 28 75 6e 73 69 67  %p/%lu)", (unsig
17db0 6e 65 64 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f  ned long) *((CK_
17dc0 42 42 4f 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29  BBOOL *) pValue)
17dd0 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69 67  , pValue, (unsig
17de0 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75  ned long) ulValu
17df0 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61  eLen);......brea
17e00 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 44  k;....case CKA_D
17e10 45 43 52 59 50 54 3a 0a 09 09 09 09 43 41 43 4b  ECRYPT:.....CACK
17e20 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
17e30 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
17e40 69 62 75 74 65 20 43 4b 41 5f 44 45 43 52 59 50  ibute CKA_DECRYP
17e50 54 20 28 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22  T (0x%08lx) ..."
17e60 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
17e70 29 20 63 75 72 72 5f 61 74 74 72 5f 74 79 70 65  ) curr_attr_type
17e80 29 3b 0a 0a 09 09 09 09 69 66 20 28 6f 62 6a 65  );......if (obje
17e90 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 4e  ctclass == CKO_N
17ea0 45 54 53 43 41 50 45 5f 54 52 55 53 54 29 20 7b  ETSCAPE_TRUST) {
17eb0 0a 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
17ec0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
17ed0 62 75 74 20 6e 6f 74 20 67 65 74 74 69 6e 67 20  but not getting 
17ee0 69 74 20 62 65 63 61 75 73 65 20 77 65 20 61 72  it because we ar
17ef0 65 20 61 20 4e 65 74 73 63 61 70 65 20 74 72 75  e a Netscape tru
17f00 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09 09  st object");....
17f10 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d 0a  ...break;.....}.
17f20 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
17f30 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 52 49 56  lass == CKO_PRIV
17f40 41 54 45 5f 4b 45 59 20 7c 7c 20 6f 62 6a 65 63  ATE_KEY || objec
17f50 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f 5f 50 55  tclass == CKO_PU
17f60 42 4c 49 43 5f 4b 45 59 29 20 7b 0a 09 09 09 09  BLIC_KEY) {.....
17f70 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72  .pValue = &ck_tr
17f80 75 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75 65  ue;......ulValue
17f90 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f  Len = sizeof(ck_
17fa0 74 72 75 65 29 3b 0a 09 09 09 09 7d 20 65 6c 73  true);.....} els
17fb0 65 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  e {......pValue 
17fc0 3d 20 26 63 6b 5f 66 61 6c 73 65 3b 0a 09 09 09  = &ck_false;....
17fd0 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73  ..ulValueLen = s
17fe0 69 7a 65 6f 66 28 63 6b 5f 66 61 6c 73 65 29 3b  izeof(ck_false);
17ff0 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
18000 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18010 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
18020 25 6c 75 20 28 25 70 2f 25 6c 75 29 22 2c 20 28  %lu (%p/%lu)", (
18030 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a  unsigned long) *
18040 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a 29 20 70 56  ((CK_BBOOL *) pV
18050 61 6c 75 65 29 2c 20 70 56 61 6c 75 65 2c 20 28  alue), pValue, (
18060 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 75  unsigned long) u
18070 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
18080 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20  .break;....case 
18090 43 4b 41 5f 53 45 4e 53 49 54 49 56 45 3a 0a 09  CKA_SENSITIVE:..
180a0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
180b0 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
180c0 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
180d0 5f 53 45 4e 53 49 54 49 56 45 20 28 30 78 25 30  _SENSITIVE (0x%0
180e0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
180f0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18100 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18110 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18120 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
18130 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
18140 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18150 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
18160 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
18170 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
18180 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
18190 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
181a0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
181b0 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d   (objectclass ==
181c0 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f 4b 45 59   CKO_PRIVATE_KEY
181d0 29 20 7b 0a 09 09 09 09 09 70 56 61 6c 75 65 20  ) {......pValue 
181e0 3d 20 26 63 6b 5f 74 72 75 65 3b 0a 09 09 09 09  = &ck_true;.....
181f0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
18200 7a 65 6f 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09  zeof(ck_true);..
18210 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
18220 09 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 66 61  .pValue = &ck_fa
18230 6c 73 65 3b 0a 09 09 09 09 09 75 6c 56 61 6c 75  lse;......ulValu
18240 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18250 5f 66 61 6c 73 65 29 3b 0a 09 09 09 09 7d 0a 0a  _false);.....}..
18260 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
18270 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65  _PRINTF(" ... re
18280 74 75 72 6e 69 6e 67 20 25 6c 75 20 28 25 70 2f  turning %lu (%p/
18290 25 6c 75 29 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu)", (unsigned
182a0 20 6c 6f 6e 67 29 20 2a 28 28 43 4b 5f 42 42 4f   long) *((CK_BBO
182b0 4f 4c 20 2a 29 20 70 56 61 6c 75 65 29 2c 20 70  OL *) pValue), p
182c0 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
182d0 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
182e0 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
182f0 09 09 09 63 61 73 65 20 43 4b 41 5f 45 58 54 52  ...case CKA_EXTR
18300 41 43 54 41 42 4c 45 3a 0a 09 09 09 09 43 41 43  ACTABLE:.....CAC
18310 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18320 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
18330 72 69 62 75 74 65 20 43 4b 41 5f 45 58 54 52 41  ribute CKA_EXTRA
18340 43 54 41 42 4c 45 20 28 30 78 25 30 38 6c 78 29  CTABLE (0x%08lx)
18350 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64   ...", (unsigned
18360 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74 74 72   long) curr_attr
18370 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69 66 20  _type);......if 
18380 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20  (objectclass == 
18390 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54 52 55  CKO_NETSCAPE_TRU
183a0 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43 4b 45  ST) {......CACKE
183b0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
183c0 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67 65 74   ... but not get
183d0 74 69 6e 67 20 69 74 20 62 65 63 61 75 73 65 20  ting it because 
183e0 77 65 20 61 72 65 20 61 20 4e 65 74 73 63 61 70  we are a Netscap
183f0 65 20 74 72 75 73 74 20 6f 62 6a 65 63 74 22 29  e trust object")
18400 3b 0a 0a 09 09 09 09 09 62 72 65 61 6b 3b 0a 09  ;.......break;..
18410 09 09 09 7d 0a 0a 09 09 09 09 69 66 20 28 6f 62  ...}......if (ob
18420 6a 65 63 74 63 6c 61 73 73 20 3d 3d 20 43 4b 4f  jectclass == CKO
18430 5f 50 52 49 56 41 54 45 5f 4b 45 59 29 20 7b 0a  _PRIVATE_KEY) {.
18440 09 09 09 09 09 70 56 61 6c 75 65 20 3d 20 26 63  .....pValue = &c
18450 6b 5f 66 61 6c 73 65 3b 0a 09 09 09 09 09 75 6c  k_false;......ul
18460 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
18470 66 28 63 6b 5f 74 72 75 65 29 3b 0a 09 09 09 09  f(ck_true);.....
18480 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 70 56  } else {......pV
18490 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75 65 3b  alue = &ck_true;
184a0 0a 09 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ......ulValueLen
184b0 20 3d 20 73 69 7a 65 6f 66 28 63 6b 5f 66 61 6c   = sizeof(ck_fal
184c0 73 65 29 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  se);.....}......
184d0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
184e0 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
184f0 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
18500 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18510 67 29 20 2a 28 28 43 4b 5f 42 42 4f 4f 4c 20 2a  g) *((CK_BBOOL *
18520 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18530 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18540 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18550 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18560 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53 3a  ase CKA_MODULUS:
18570 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
18580 47 5f 50 52 49 4e 54 46 28 22 52 65 71 75 65 73  G_PRINTF("Reques
18590 74 69 6e 67 20 61 74 74 72 69 62 75 74 65 20 43  ting attribute C
185a0 4b 41 5f 4d 4f 44 55 4c 55 53 20 28 30 78 25 30  KA_MODULUS (0x%0
185b0 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
185c0 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
185d0 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
185e0 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
185f0 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
18600 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
18610 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18620 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
18630 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
18640 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
18650 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
18660 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
18670 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
18680 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
18690 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
186a0 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
186b0 35 30 39 5f 74 6f 5f 6d 6f 64 75 6c 75 73 28 63  509_to_modulus(c
186c0 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
186d0 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70 56  ificate_len, &pV
186e0 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20 28  alue);......if (
186f0 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c 20  x509_read_ret < 
18700 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c 75  0) {.......pValu
18710 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09 7d  e = NULL;......}
18720 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75 6c   else {.......ul
18730 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39 5f  ValueLen = x509_
18740 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09 7d  read_ret;......}
18750 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43 4b  .....}......CACK
18760 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18770 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67 20  " ... returning 
18780 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c 75  (%p/%lu)", pValu
18790 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
187a0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
187b0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
187c0 61 73 65 20 43 4b 41 5f 50 55 42 4c 49 43 5f 45  ase CKA_PUBLIC_E
187d0 58 50 4f 4e 45 4e 54 3a 0a 09 09 09 09 43 41 43  XPONENT:.....CAC
187e0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
187f0 28 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74  ("Requesting att
18800 72 69 62 75 74 65 20 43 4b 41 5f 50 55 42 4c 49  ribute CKA_PUBLI
18810 43 5f 45 58 50 4f 4e 45 4e 54 20 28 30 78 25 30  C_EXPONENT (0x%0
18820 38 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69  8lx) ...", (unsi
18830 67 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f  gned long) curr_
18840 61 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09  attr_type);.....
18850 09 69 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73  .if (objectclass
18860 20 3d 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45   == CKO_NETSCAPE
18870 5f 54 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43  _TRUST) {......C
18880 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
18890 54 46 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74  TF(" ... but not
188a0 20 67 65 74 74 69 6e 67 20 69 74 20 62 65 63 61   getting it beca
188b0 75 73 65 20 77 65 20 61 72 65 20 61 20 4e 65 74  use we are a Net
188c0 73 63 61 70 65 20 74 72 75 73 74 20 6f 62 6a 65  scape trust obje
188d0 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72 65 61  ct");.......brea
188e0 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09 69 66  k;.....}......if
188f0 20 28 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65   (certificate_le
18900 6e 20 3e 3d 20 30 29 20 7b 0a 09 09 09 09 09 78  n >= 0) {......x
18910 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3d 20 78  509_read_ret = x
18920 35 30 39 5f 74 6f 5f 65 78 70 6f 6e 65 6e 74 28  509_to_exponent(
18930 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72  certificate, cer
18940 74 69 66 69 63 61 74 65 5f 6c 65 6e 2c 20 26 70  tificate_len, &p
18950 56 61 6c 75 65 29 3b 0a 09 09 09 09 09 69 66 20  Value);......if 
18960 28 78 35 30 39 5f 72 65 61 64 5f 72 65 74 20 3c  (x509_read_ret <
18970 20 30 29 20 7b 0a 09 09 09 09 09 09 70 56 61 6c   0) {.......pVal
18980 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09 09  ue = NULL;......
18990 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09 09 75  } else {.......u
189a0 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 78 35 30 39  lValueLen = x509
189b0 5f 72 65 61 64 5f 72 65 74 3b 0a 09 09 09 09 09  _read_ret;......
189c0 7d 0a 09 09 09 09 7d 0a 0a 09 09 09 09 43 41 43  }.....}......CAC
189d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
189e0 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e 69 6e 67  (" ... returning
189f0 20 28 25 70 2f 25 6c 75 29 22 2c 20 70 56 61 6c   (%p/%lu)", pVal
18a00 75 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  ue, (unsigned lo
18a10 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ng) ulValueLen);
18a20 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09  ......break;....
18a30 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 44  case CKA_TRUST_D
18a40 49 47 49 54 41 4c 5f 53 49 47 4e 41 54 55 52 45  IGITAL_SIGNATURE
18a50 3a 0a 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52  :....case CKA_TR
18a60 55 53 54 5f 4e 4f 4e 5f 52 45 50 55 44 49 41 54  UST_NON_REPUDIAT
18a70 49 4f 4e 3a 0a 09 09 09 63 61 73 65 20 43 4b 41  ION:....case CKA
18a80 5f 54 52 55 53 54 5f 4b 45 59 5f 45 4e 43 49 50  _TRUST_KEY_ENCIP
18a90 48 45 52 4d 45 4e 54 3a 0a 09 09 09 63 61 73 65  HERMENT:....case
18aa0 20 43 4b 41 5f 54 52 55 53 54 5f 44 41 54 41 5f   CKA_TRUST_DATA_
18ab0 45 4e 43 49 50 48 45 52 4d 45 4e 54 3a 0a 09 09  ENCIPHERMENT:...
18ac0 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f  .case CKA_TRUST_
18ad0 4b 45 59 5f 41 47 52 45 45 4d 45 4e 54 3a 0a 09  KEY_AGREEMENT:..
18ae0 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53 54  ..case CKA_TRUST
18af0 5f 4b 45 59 5f 43 45 52 54 5f 53 49 47 4e 3a 0a  _KEY_CERT_SIGN:.
18b00 09 09 09 63 61 73 65 20 43 4b 41 5f 54 52 55 53  ...case CKA_TRUS
18b10 54 5f 43 52 4c 5f 53 49 47 4e 3a 0a 09 09 09 63  T_CRL_SIGN:....c
18b20 61 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 53 45  ase CKA_TRUST_SE
18b30 52 56 45 52 5f 41 55 54 48 3a 0a 09 09 09 63 61  RVER_AUTH:....ca
18b40 73 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4c 49  se CKA_TRUST_CLI
18b50 45 4e 54 5f 41 55 54 48 3a 0a 09 09 09 63 61 73  ENT_AUTH:....cas
18b60 65 20 43 4b 41 5f 54 52 55 53 54 5f 43 4f 44 45  e CKA_TRUST_CODE
18b70 5f 53 49 47 4e 49 4e 47 3a 0a 09 09 09 63 61 73  _SIGNING:....cas
18b80 65 20 43 4b 41 5f 54 52 55 53 54 5f 45 4d 41 49  e CKA_TRUST_EMAI
18b90 4c 5f 50 52 4f 54 45 43 54 49 4f 4e 3a 0a 09 09  L_PROTECTION:...
18ba0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
18bb0 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69 6e  RINTF("Requestin
18bc0 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41 5f  g attribute CKA_
18bd0 54 52 55 53 54 5f 2e 2e 2e 20 28 30 78 25 30 38  TRUST_... (0x%08
18be0 6c 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67  lx) ...", (unsig
18bf0 6e 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61  ned long) curr_a
18c00 74 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09  ttr_type);......
18c10 70 56 61 6c 75 65 20 3d 20 26 63 6b 5f 74 72 75  pValue = &ck_tru
18c20 73 74 65 64 3b 0a 09 09 09 09 75 6c 56 61 6c 75  sted;.....ulValu
18c30 65 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 6b  eLen = sizeof(ck
18c40 5f 74 72 75 73 74 65 64 29 3b 0a 0a 09 09 09 09  _trusted);......
18c50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
18c60 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75 72 6e  NTF(" ... return
18c70 69 6e 67 20 25 6c 75 20 28 25 70 2f 25 6c 75 29  ing %lu (%p/%lu)
18c80 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
18c90 67 29 20 2a 28 28 43 4b 5f 54 52 55 53 54 20 2a  g) *((CK_TRUST *
18ca0 29 20 70 56 61 6c 75 65 29 2c 20 70 56 61 6c 75  ) pValue), pValu
18cb0 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  e, (unsigned lon
18cc0 67 29 20 75 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a  g) ulValueLen);.
18cd0 0a 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 63  .....break;....c
18ce0 61 73 65 20 43 4b 41 5f 43 45 52 54 5f 53 48 41  ase CKA_CERT_SHA
18cf0 31 5f 48 41 53 48 3a 0a 09 09 09 09 43 41 43 4b  1_HASH:.....CACK
18d00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
18d10 22 52 65 71 75 65 73 74 69 6e 67 20 61 74 74 72  "Requesting attr
18d20 69 62 75 74 65 20 43 4b 41 5f 43 45 52 54 5f 53  ibute CKA_CERT_S
18d30 48 41 31 5f 48 41 53 48 20 28 30 78 25 30 38 6c  HA1_HASH (0x%08l
18d40 78 29 20 2e 2e 2e 22 2c 20 28 75 6e 73 69 67 6e  x) ...", (unsign
18d50 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
18d60 74 72 5f 74 79 70 65 29 3b 0a 0a 09 09 09 09 69  tr_type);......i
18d70 66 20 28 6f 62 6a 65 63 74 63 6c 61 73 73 20 21  f (objectclass !
18d80 3d 20 43 4b 4f 5f 4e 45 54 53 43 41 50 45 5f 54  = CKO_NETSCAPE_T
18d90 52 55 53 54 29 20 7b 0a 09 09 09 09 09 43 41 43  RUST) {......CAC
18da0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
18db0 28 22 20 2e 2e 2e 20 62 75 74 20 6e 6f 74 20 67  (" ... but not g
18dc0 65 74 74 69 6e 67 20 69 74 20 62 65 63 61 75 73  etting it becaus
18dd0 65 20 77 65 20 61 72 65 20 6e 6f 74 20 61 20 4e  e we are not a N
18de0 65 74 73 63 61 70 65 20 74 72 75 73 74 20 6f 62  etscape trust ob
18df0 6a 65 63 74 22 29 3b 0a 0a 09 09 09 09 09 62 72  ject");.......br
18e00 65 61 6b 3b 0a 09 09 09 09 7d 0a 0a 09 09 09 09  eak;.....}......
18e10 53 48 41 31 52 65 73 65 74 28 26 73 68 61 31 5f  SHA1Reset(&sha1_
18e20 63 74 78 29 3b 0a 09 09 09 09 53 48 41 31 49 6e  ctx);.....SHA1In
18e30 70 75 74 28 26 73 68 61 31 5f 63 74 78 2c 20 63  put(&sha1_ctx, c
18e40 65 72 74 69 66 69 63 61 74 65 2c 20 63 65 72 74  ertificate, cert
18e50 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a 09 09  ificate_len);...
18e60 09 09 53 48 41 31 52 65 73 75 6c 74 28 26 73 68  ..SHA1Result(&sh
18e70 61 31 5f 63 74 78 2c 20 73 68 61 31 5f 68 61 73  a1_ctx, sha1_has
18e80 68 29 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20  h);......pValue 
18e90 3d 20 73 68 61 31 5f 68 61 73 68 3b 0a 09 09 09  = sha1_hash;....
18ea0 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69  .ulValueLen = si
18eb0 7a 65 6f 66 28 73 68 61 31 5f 68 61 73 68 29 3b  zeof(sha1_hash);
18ec0 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
18ed0 55 47 5f 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20  UG_PRINTF(" ... 
18ee0 72 65 74 75 72 6e 69 6e 67 20 25 70 2f 25 6c 75  returning %p/%lu
18ef0 22 2c 20 70 56 61 6c 75 65 2c 20 28 75 6e 73 69  ", pValue, (unsi
18f00 67 6e 65 64 20 6c 6f 6e 67 29 20 75 6c 56 61 6c  gned long) ulVal
18f10 75 65 4c 65 6e 29 3b 0a 0a 09 09 09 09 62 72 65  ueLen);......bre
18f20 61 6b 3b 0a 09 09 09 63 61 73 65 20 43 4b 41 5f  ak;....case CKA_
18f30 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 3a 0a 09  CERT_MD5_HASH:..
18f40 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18f50 50 52 49 4e 54 46 28 22 52 65 71 75 65 73 74 69  PRINTF("Requesti
18f60 6e 67 20 61 74 74 72 69 62 75 74 65 20 43 4b 41  ng attribute CKA
18f70 5f 43 45 52 54 5f 4d 44 35 5f 48 41 53 48 20 28  _CERT_MD5_HASH (
18f80 30 78 25 30 38 6c 78 29 20 2e 2e 2e 22 2c 20 28  0x%08lx) ...", (
18f90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
18fa0 75 72 72 5f 61 74 74 72 5f 74 79 70 65 29 3b 0a  urr_attr_type);.
18fb0 0a 09 09 09 09 69 66 20 28 6f 62 6a 65 63 74 63  .....if (objectc
18fc0 6c 61 73 73 20 21 3d 20 43 4b 4f 5f 4e 45 54 53  lass != CKO_NETS
18fd0 43 41 50 45 5f 54 52 55 53 54 29 20 7b 0a 09 09  CAPE_TRUST) {...
18fe0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
18ff0 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 62 75 74  PRINTF(" ... but
19000 20 6e 6f 74 20 67 65 74 74 69 6e 67 20 69 74 20   not getting it 
19010 62 65 63 61 75 73 65 20 77 65 20 61 72 65 20 6e  because we are n
19020 6f 74 20 61 20 4e 65 74 73 63 61 70 65 20 74 72  ot a Netscape tr
19030 75 73 74 20 6f 62 6a 65 63 74 22 29 3b 0a 0a 09  ust object");...
19040 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09 7d  ....break;.....}
19050 0a 0a 09 09 09 09 4d 44 35 49 6e 69 74 28 26 6d  ......MD5Init(&m
19060 64 35 5f 63 74 78 29 3b 0a 09 09 09 09 4d 44 35  d5_ctx);.....MD5
19070 55 70 64 61 74 65 28 26 6d 64 35 5f 63 74 78 2c  Update(&md5_ctx,
19080 20 63 65 72 74 69 66 69 63 61 74 65 2c 20 63 65   certificate, ce
19090 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b 0a  rtificate_len);.
190a0 09 09 09 09 4d 44 35 46 69 6e 61 6c 28 6d 64 35  ....MD5Final(md5
190b0 5f 68 61 73 68 2c 20 26 6d 64 35 5f 63 74 78 29  _hash, &md5_ctx)
190c0 3b 0a 0a 09 09 09 09 70 56 61 6c 75 65 20 3d 20  ;......pValue = 
190d0 6d 64 35 5f 68 61 73 68 3b 0a 09 09 09 09 75 6c  md5_hash;.....ul
190e0 56 61 6c 75 65 4c 65 6e 20 3d 20 73 69 7a 65 6f  ValueLen = sizeo
190f0 66 28 6d 64 35 5f 68 61 73 68 29 3b 0a 0a 09 09  f(md5_hash);....
19100 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
19110 52 49 4e 54 46 28 22 20 2e 2e 2e 20 72 65 74 75  RINTF(" ... retu
19120 72 6e 69 6e 67 20 25 70 2f 25 6c 75 22 2c 20 70  rning %p/%lu", p
19130 56 61 6c 75 65 2c 20 28 75 6e 73 69 67 6e 65 64  Value, (unsigned
19140 20 6c 6f 6e 67 29 20 75 6c 56 61 6c 75 65 4c 65   long) ulValueLe
19150 6e 29 3b 0a 0a 09 09 09 09 62 72 65 61 6b 3b 0a  n);......break;.
19160 09 09 09 64 65 66 61 75 6c 74 3a 0a 09 09 09 09  ...default:.....
19170 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 09  pValue = NULL;..
19180 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
19190 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 09 09  (CK_LONG) -1;...
191a0 09 09 62 72 65 61 6b 3b 0a 09 09 7d 0a 0a 09 09  ..break;...}....
191b0 69 66 20 28 28 28 43 4b 5f 4c 4f 4e 47 29 20 75  if (((CK_LONG) u
191c0 6c 56 61 6c 75 65 4c 65 6e 29 20 21 3d 20 28 28  lValueLen) != ((
191d0 43 4b 5f 4c 4f 4e 47 29 20 2d 31 29 29 20 7b 0a  CK_LONG) -1)) {.
191e0 09 09 09 2f 2a 20 50 75 73 68 20 63 75 72 72 5f  .../* Push curr_
191f0 61 74 74 72 20 6f 6e 74 6f 20 74 68 65 20 73 74  attr onto the st
19200 61 63 6b 20 2a 2f 0a 09 09 09 63 75 72 72 5f 61  ack */....curr_a
19210 74 74 72 2e 74 79 70 65 20 3d 20 63 75 72 72 5f  ttr.type = curr_
19220 61 74 74 72 5f 74 79 70 65 3b 0a 09 09 09 63 75  attr_type;....cu
19230 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65 4c  rr_attr.ulValueL
19240 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 3b  en = ulValueLen;
19250 0a 0a 09 09 09 63 75 72 72 5f 61 74 74 72 2e 70  .....curr_attr.p
19260 56 61 6c 75 65 20 3d 20 6d 61 6c 6c 6f 63 28 63  Value = malloc(c
19270 75 72 72 5f 61 74 74 72 2e 75 6c 56 61 6c 75 65  urr_attr.ulValue
19280 4c 65 6e 29 3b 0a 09 09 09 6d 65 6d 63 70 79 28  Len);....memcpy(
19290 63 75 72 72 5f 61 74 74 72 2e 70 56 61 6c 75 65  curr_attr.pValue
192a0 2c 20 70 56 61 6c 75 65 2c 20 63 75 72 72 5f 61  , pValue, curr_a
192b0 74 74 72 2e 75 6c 56 61 6c 75 65 4c 65 6e 29 3b  ttr.ulValueLen);
192c0 0a 0a 09 09 09 69 66 20 28 70 56 61 6c 75 65 5f  .....if (pValue_
192d0 66 72 65 65 20 26 26 20 70 56 61 6c 75 65 29 20  free && pValue) 
192e0 7b 0a 09 09 09 09 66 72 65 65 28 70 56 61 6c 75  {.....free(pValu
192f0 65 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20  e);....}.....if 
19300 28 6e 75 6d 61 74 74 72 73 20 3e 3d 20 72 65 74  (numattrs >= ret
19310 76 61 6c 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 09  val_count) {....
19320 09 72 65 74 76 61 6c 20 3d 20 72 65 61 6c 6c 6f  .retval = reallo
19330 63 28 72 65 74 76 61 6c 2c 20 72 65 74 76 61 6c  c(retval, retval
19340 5f 63 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28  _count * sizeof(
19350 2a 72 65 74 76 61 6c 29 29 3b 0a 09 09 09 7d 0a  *retval));....}.
19360 0a 09 09 09 6d 65 6d 63 70 79 28 26 72 65 74 76  ....memcpy(&retv
19370 61 6c 5b 6e 75 6d 61 74 74 72 73 5d 2c 20 26 63  al[numattrs], &c
19380 75 72 72 5f 61 74 74 72 2c 20 73 69 7a 65 6f 66  urr_attr, sizeof
19390 28 63 75 72 72 5f 61 74 74 72 29 29 3b 0a 09 09  (curr_attr));...
193a0 09 6e 75 6d 61 74 74 72 73 2b 2b 3b 0a 09 09 7d  .numattrs++;...}
193b0 0a 09 7d 0a 0a 09 69 66 20 28 6e 75 6d 61 74 74  ..}...if (numatt
193c0 72 73 20 21 3d 20 30 29 20 7b 0a 09 09 72 65 74  rs != 0) {...ret
193d0 76 61 6c 5f 63 6f 75 6e 74 20 3d 20 6e 75 6d 61  val_count = numa
193e0 74 74 72 73 3b 0a 09 09 72 65 74 76 61 6c 20 3d  ttrs;...retval =
193f0 20 72 65 61 6c 6c 6f 63 28 72 65 74 76 61 6c 2c   realloc(retval,
19400 20 72 65 74 76 61 6c 5f 63 6f 75 6e 74 20 2a 20   retval_count * 
19410 73 69 7a 65 6f 66 28 2a 72 65 74 76 61 6c 29 29  sizeof(*retval))
19420 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 66 72  ;..} else {...fr
19430 65 65 28 72 65 74 76 61 6c 29 3b 0a 0a 09 09 72  ee(retval);....r
19440 65 74 76 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 09 7d  etval = NULL;..}
19450 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 6e  ...*pulCount = n
19460 75 6d 61 74 74 72 73 3b 0a 0a 09 43 41 43 4b 45  umattrs;...CACKE
19470 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
19480 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 20 6f 62  Returning %lu ob
19490 6a 65 63 74 73 20 28 25 70 29 2e 22 2c 20 6e 75  jects (%p).", nu
194a0 6d 61 74 74 72 73 2c 20 28 76 6f 69 64 20 2a 29  mattrs, (void *)
194b0 20 72 65 74 76 61 6c 29 3b 0a 0a 09 72 65 74 75   retval);...retu
194c0 72 6e 28 72 65 74 76 61 6c 29 3b 0a 7d 0a 0a 73  rn(retval);.}..s
194d0 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 6b 65  tatic void cacke
194e0 79 5f 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65  y_free_identitie
194f0 73 28 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  s(struct cackey_
19500 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74 69  identity *identi
19510 74 69 65 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c  ties, unsigned l
19520 6f 6e 67 20 69 64 65 6e 74 69 74 69 65 73 5f 63  ong identities_c
19530 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52  ount) {..CK_ATTR
19540 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
19550 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
19560 20 69 64 5f 69 64 78 2c 20 61 74 74 72 5f 69 64   id_idx, attr_id
19570 78 3b 0a 0a 09 69 66 20 28 69 64 65 6e 74 69 74  x;...if (identit
19580 69 65 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 69  ies == NULL || i
19590 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74 20  dentities_count 
195a0 3d 3d 20 30 29 20 7b 0a 09 09 72 65 74 75 72 6e  == 0) {...return
195b0 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 5f 69  ;..}...for (id_i
195c0 64 78 20 3d 20 30 3b 20 69 64 5f 69 64 78 20 3c  dx = 0; id_idx <
195d0 20 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e   identities_coun
195e0 74 3b 20 69 64 5f 69 64 78 2b 2b 29 20 7b 0a 09  t; id_idx++) {..
195f0 09 69 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b  .if (identities[
19600 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74  id_idx].attribut
19610 65 73 29 20 7b 0a 09 09 09 66 6f 72 20 28 61 74  es) {....for (at
19620 74 72 5f 69 64 78 20 3d 20 30 3b 20 61 74 74 72  tr_idx = 0; attr
19630 5f 69 64 78 20 3c 20 69 64 65 6e 74 69 74 69 65  _idx < identitie
19640 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62  s[id_idx].attrib
19650 75 74 65 73 5f 63 6f 75 6e 74 3b 20 61 74 74 72  utes_count; attr
19660 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 09 63 75  _idx++) {.....cu
19670 72 72 5f 61 74 74 72 20 3d 20 26 69 64 65 6e 74  rr_attr = &ident
19680 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
19690 74 72 69 62 75 74 65 73 5b 61 74 74 72 5f 69 64  tributes[attr_id
196a0 78 5d 3b 0a 0a 09 09 09 09 69 66 20 28 63 75 72  x];......if (cur
196b0 72 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 20  r_attr->pValue) 
196c0 7b 0a 09 09 09 09 09 66 72 65 65 28 63 75 72 72  {......free(curr
196d0 5f 61 74 74 72 2d 3e 70 56 61 6c 75 65 29 3b 0a  _attr->pValue);.
196e0 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 09 69  ....}....}.....i
196f0 66 20 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f (identities[id
19700 5f 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73  _idx].attributes
19710 29 20 7b 0a 09 09 09 09 66 72 65 65 28 69 64 65  ) {.....free(ide
19720 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
19730 61 74 74 72 69 62 75 74 65 73 29 3b 0a 09 09 09  attributes);....
19740 7d 0a 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65  }.....cackey_fre
19750 65 5f 63 65 72 74 73 28 69 64 65 6e 74 69 74 69  e_certs(identiti
19760 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
19770 69 64 65 6e 74 69 74 79 2c 20 31 2c 20 31 29 3b  identity, 1, 1);
19780 0a 09 09 7d 0a 09 7d 0a 0a 09 66 72 65 65 28 69  ...}..}...free(i
19790 64 65 6e 74 69 74 69 65 73 29 3b 0a 7d 0a 0a 73  dentities);.}..s
197a0 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 6c  tatic unsigned l
197b0 6f 6e 67 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  ong cackey_read_
197c0 64 6f 64 5f 69 64 65 6e 74 69 74 69 65 73 28 73  dod_identities(s
197d0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65  truct cackey_ide
197e0 6e 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65  ntity *identitie
197f0 73 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  s, unsigned long
19800 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73 29 20   num_dod_certs) 
19810 7b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  {..unsigned long
19820 20 63 65 72 74 5f 69 64 78 2c 20 69 64 5f 69 64   cert_idx, id_id
19830 78 20 3d 20 30 3b 0a 0a 09 69 66 20 28 69 64 65  x = 0;...if (ide
19840 6e 74 69 74 69 65 73 20 3d 3d 20 4e 55 4c 4c 29  ntities == NULL)
19850 20 7b 0a 09 09 72 65 74 75 72 6e 28 6e 75 6d 5f   {...return(num_
19860 64 6f 64 5f 63 65 72 74 73 20 2a 20 33 29 3b 0a  dod_certs * 3);.
19870 09 7d 0a 0a 09 66 6f 72 20 28 63 65 72 74 5f 69  .}...for (cert_i
19880 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
19890 20 3c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74 73   < num_dod_certs
198a0 3b 20 63 65 72 74 5f 69 64 78 2b 2b 29 20 7b 0a  ; cert_idx++) {.
198b0 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
198c0 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
198d0 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09 69 64 65  ty = NULL;...ide
198e0 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e  ntities[id_idx].
198f0 61 74 74 72 69 62 75 74 65 73 20 3d 20 63 61 63  attributes = cac
19900 6b 65 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74  key_get_attribut
19910 65 73 28 43 4b 4f 5f 43 45 52 54 49 46 49 43 41  es(CKO_CERTIFICA
19920 54 45 2c 20 26 65 78 74 72 61 5f 63 65 72 74 73  TE, &extra_certs
19930 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78 66 30  [cert_idx], 0xf0
19940 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c 20 26  00 | cert_idx, &
19950 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
19960 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f 63 6f  x].attributes_co
19970 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78 2b 2b  unt);...id_idx++
19980 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 5b  ;....identities[
19990 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65  id_idx].pcsc_ide
199a0 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a 09 09  ntity = NULL;...
199b0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64  identities[id_id
199c0 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20 3d 20  x].attributes = 
199d0 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74 72 69  cackey_get_attri
199e0 62 75 74 65 73 28 43 4b 4f 5f 50 55 42 4c 49 43  butes(CKO_PUBLIC
199f0 5f 4b 45 59 2c 20 26 65 78 74 72 61 5f 63 65 72  _KEY, &extra_cer
19a00 74 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20 30 78  ts[cert_idx], 0x
19a10 66 30 30 30 20 7c 20 63 65 72 74 5f 69 64 78 2c  f000 | cert_idx,
19a20 20 26 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f   &identities[id_
19a30 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 5f  idx].attributes_
19a40 63 6f 75 6e 74 29 3b 0a 09 09 69 64 5f 69 64 78  count);...id_idx
19a50 2b 2b 3b 0a 0a 09 09 69 64 65 6e 74 69 74 69 65  ++;....identitie
19a60 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f 69  s[id_idx].pcsc_i
19a70 64 65 6e 74 69 74 79 20 3d 20 4e 55 4c 4c 3b 0a  dentity = NULL;.
19a80 09 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  ..identities[id_
19a90 69 64 78 5d 2e 61 74 74 72 69 62 75 74 65 73 20  idx].attributes 
19aa0 3d 20 63 61 63 6b 65 79 5f 67 65 74 5f 61 74 74  = cackey_get_att
19ab0 72 69 62 75 74 65 73 28 43 4b 4f 5f 4e 45 54 53  ributes(CKO_NETS
19ac0 43 41 50 45 5f 54 52 55 53 54 2c 20 26 65 78 74  CAPE_TRUST, &ext
19ad0 72 61 5f 63 65 72 74 73 5b 63 65 72 74 5f 69 64  ra_certs[cert_id
19ae0 78 5d 2c 20 30 78 66 30 30 30 20 7c 20 63 65 72  x], 0xf000 | cer
19af0 74 5f 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69  t_idx, &identiti
19b00 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69  es[id_idx].attri
19b10 62 75 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 09  butes_count);...
19b20 69 64 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 72  id_idx++;..}...r
19b30 65 74 75 72 6e 28 69 64 5f 69 64 78 29 3b 0a 7d  eturn(id_idx);.}
19b40 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
19b50 63 61 63 6b 65 79 5f 69 64 65 6e 74 69 74 79 20  cackey_identity 
19b60 2a 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64 65  *cackey_read_ide
19b70 6e 74 69 74 69 65 73 28 73 74 72 75 63 74 20 63  ntities(struct c
19b80 61 63 6b 65 79 5f 73 6c 6f 74 20 2a 73 6c 6f 74  ackey_slot *slot
19b90 2c 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  , unsigned long 
19ba0 2a 69 64 73 5f 66 6f 75 6e 64 29 20 7b 0a 09 73  *ids_found) {..s
19bb0 74 72 75 63 74 20 63 61 63 6b 65 79 5f 70 63 73  truct cackey_pcs
19bc0 63 5f 69 64 65 6e 74 69 74 79 20 2a 70 63 73 63  c_identity *pcsc
19bd0 5f 69 64 65 6e 74 69 74 69 65 73 3b 0a 09 73 74  _identities;..st
19be0 72 75 63 74 20 63 61 63 6b 65 79 5f 69 64 65 6e  ruct cackey_iden
19bf0 74 69 74 79 20 2a 69 64 65 6e 74 69 74 69 65 73  tity *identities
19c00 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ;..unsigned long
19c10 20 6e 75 6d 5f 69 64 73 2c 20 69 64 5f 69 64 78   num_ids, id_idx
19c20 2c 20 63 75 72 72 5f 69 64 5f 74 79 70 65 3b 0a  , curr_id_type;.
19c30 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6e  .unsigned long n
19c40 75 6d 5f 63 65 72 74 73 2c 20 6e 75 6d 5f 64 6f  um_certs, num_do
19c50 64 5f 63 65 72 74 73 2c 20 63 65 72 74 5f 69 64  d_certs, cert_id
19c60 78 3b 0a 09 69 6e 74 20 69 6e 63 6c 75 64 65 5f  x;..int include_
19c70 65 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b  extra_certs = 0;
19c80 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
19c90 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
19ca0 29 3b 0a 0a 09 69 66 20 28 69 64 73 5f 66 6f 75  );...if (ids_fou
19cb0 6e 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  nd == NULL) {...
19cc0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
19cd0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 69 64 73  NTF("Error.  ids
19ce0 5f 66 6f 75 6e 64 20 69 73 20 4e 55 4c 4c 22 29  _found is NULL")
19cf0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ;....return(NULL
19d00 29 3b 0a 09 7d 0a 0a 23 69 66 64 65 66 20 43 41  );..}..#ifdef CA
19d10 43 4b 45 59 5f 43 41 52 44 5f 53 4c 4f 54 5f 49  CKEY_CARD_SLOT_I
19d20 4e 43 4c 55 44 45 5f 45 58 54 52 41 5f 43 45 52  NCLUDE_EXTRA_CER
19d30 54 53 0a 09 69 6e 63 6c 75 64 65 5f 65 78 74 72  TS..include_extr
19d40 61 5f 63 65 72 74 73 20 3d 20 31 3b 0a 23 65 6e  a_certs = 1;.#en
19d50 64 69 66 0a 0a 09 69 66 20 28 67 65 74 65 6e 76  dif...if (getenv
19d60 28 22 43 41 43 4b 45 59 5f 44 4f 44 5f 43 45 52  ("CACKEY_DOD_CER
19d70 54 53 5f 4f 4e 5f 48 57 5f 53 4c 4f 54 53 22 29  TS_ON_HW_SLOTS")
19d80 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
19d90 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65 72 74  clude_extra_cert
19da0 73 20 3d 20 31 3b 0a 09 7d 0a 0a 09 69 66 20 28  s = 1;..}...if (
19db0 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f 4e  getenv("CACKEY_N
19dc0 4f 5f 44 4f 44 5f 43 45 52 54 53 5f 4f 4e 5f 48  O_DOD_CERTS_ON_H
19dd0 57 5f 53 4c 4f 54 53 22 29 20 21 3d 20 4e 55 4c  W_SLOTS") != NUL
19de0 4c 29 20 7b 0a 09 09 69 6e 63 6c 75 64 65 5f 65  L) {...include_e
19df0 78 74 72 61 5f 63 65 72 74 73 20 3d 20 30 3b 0a  xtra_certs = 0;.
19e00 09 7d 0a 0a 09 69 66 20 28 67 65 74 65 6e 76 28  .}...if (getenv(
19e10 22 43 41 43 4b 45 59 5f 4e 4f 5f 45 58 54 52 41  "CACKEY_NO_EXTRA
19e20 5f 43 45 52 54 53 22 29 20 21 3d 20 4e 55 4c 4c  _CERTS") != NULL
19e30 29 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65  ) {...num_dod_ce
19e40 72 74 73 20 3d 20 30 3b 0a 09 7d 20 65 6c 73 65  rts = 0;..} else
19e50 20 7b 0a 09 09 6e 75 6d 5f 64 6f 64 5f 63 65 72   {...num_dod_cer
19e60 74 73 20 3d 20 73 69 7a 65 6f 66 28 65 78 74 72  ts = sizeof(extr
19e70 61 5f 63 65 72 74 73 29 20 2f 20 73 69 7a 65 6f  a_certs) / sizeo
19e80 66 28 65 78 74 72 61 5f 63 65 72 74 73 5b 30 5d  f(extra_certs[0]
19e90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73 6c 6f 74  );..}...if (slot
19ea0 2d 3e 69 6e 74 65 72 6e 61 6c 29 20 7b 0a 09 09  ->internal) {...
19eb0 6e 75 6d 5f 69 64 73 20 3d 20 63 61 63 6b 65 79  num_ids = cackey
19ec0 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e 74 69  _read_dod_identi
19ed0 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75 6d 5f 64  ties(NULL, num_d
19ee0 6f 64 5f 63 65 72 74 73 29 3b 0a 0a 09 09 69 66  od_certs);....if
19ef0 20 28 6e 75 6d 5f 69 64 73 20 21 3d 20 30 29 20   (num_ids != 0) 
19f00 7b 0a 09 09 09 69 64 65 6e 74 69 74 69 65 73 20  {....identities 
19f10 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
19f20 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
19f30 69 74 69 65 73 29 29 3b 0a 0a 09 09 09 63 61 63  ities));.....cac
19f40 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
19f50 6e 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69  ntities(identiti
19f60 65 73 2c 20 6e 75 6d 5f 64 6f 64 5f 63 65 72 74  es, num_dod_cert
19f70 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  s);...} else {..
19f80 09 09 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e  ..identities = N
19f90 55 4c 4c 3b 0a 09 09 7d 0a 0a 09 09 2a 69 64 73  ULL;...}....*ids
19fa0 5f 66 6f 75 6e 64 20 3d 20 6e 75 6d 5f 69 64 73  _found = num_ids
19fb0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 69 64 65 6e  ;....return(iden
19fc0 74 69 74 69 65 73 29 3b 0a 09 7d 0a 0a 09 70 63  tities);..}...pc
19fd0 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20 3d 20  sc_identities = 
19fe0 63 61 63 6b 65 79 5f 72 65 61 64 5f 63 65 72 74  cackey_read_cert
19ff0 73 28 73 6c 6f 74 2c 20 4e 55 4c 4c 2c 20 26 6e  s(slot, NULL, &n
1a000 75 6d 5f 63 65 72 74 73 29 3b 0a 09 69 66 20 28  um_certs);..if (
1a010 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 20  pcsc_identities 
1a020 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 2f 2a 20  != NULL) {.../* 
1a030 43 6f 6e 76 65 72 74 20 6e 75 6d 62 65 72 20 6f  Convert number o
1a040 66 20 43 65 72 74 73 20 74 6f 20 6e 75 6d 62 65  f Certs to numbe
1a050 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  r of objects */.
1a060 09 09 6e 75 6d 5f 69 64 73 20 3d 20 28 43 4b 4f  ..num_ids = (CKO
1a070 5f 50 52 49 56 41 54 45 5f 4b 45 59 20 2d 20 43  _PRIVATE_KEY - C
1a080 4b 4f 5f 43 45 52 54 49 46 49 43 41 54 45 20 2b  KO_CERTIFICATE +
1a090 20 31 29 20 2a 20 6e 75 6d 5f 63 65 72 74 73 3b   1) * num_certs;
1a0a0 0a 0a 09 09 69 66 20 28 69 6e 63 6c 75 64 65 5f  ....if (include_
1a0b0 65 78 74 72 61 5f 63 65 72 74 73 29 20 7b 0a 09  extra_certs) {..
1a0c0 09 09 6e 75 6d 5f 69 64 73 20 2b 3d 20 63 61 63  ..num_ids += cac
1a0d0 6b 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65  key_read_dod_ide
1a0e0 6e 74 69 74 69 65 73 28 4e 55 4c 4c 2c 20 6e 75  ntities(NULL, nu
1a0f0 6d 5f 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09  m_dod_certs);...
1a100 7d 0a 0a 09 09 69 64 65 6e 74 69 74 69 65 73 20  }....identities 
1a110 3d 20 6d 61 6c 6c 6f 63 28 6e 75 6d 5f 69 64 73  = malloc(num_ids
1a120 20 2a 20 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74   * sizeof(*ident
1a130 69 74 69 65 73 29 29 3b 0a 0a 09 09 2f 2a 20 41  ities));..../* A
1a140 64 64 20 63 65 72 74 69 66 69 63 61 74 65 73 2c  dd certificates,
1a150 20 70 75 62 6c 69 63 20 6b 65 79 73 2c 20 61 6e   public keys, an
1a160 64 20 70 72 69 76 61 74 65 20 6b 65 79 73 20 66  d private keys f
1a170 72 6f 6d 20 74 68 65 20 73 6d 61 72 74 63 61 72  rom the smartcar
1a180 64 20 2a 2f 0a 09 09 69 64 5f 69 64 78 20 3d 20  d */...id_idx = 
1a190 30 3b 0a 09 09 66 6f 72 20 28 63 65 72 74 5f 69  0;...for (cert_i
1a1a0 64 78 20 3d 20 30 3b 20 63 65 72 74 5f 69 64 78  dx = 0; cert_idx
1a1b0 20 3c 20 6e 75 6d 5f 63 65 72 74 73 3b 20 63 65   < num_certs; ce
1a1c0 72 74 5f 69 64 78 2b 2b 29 20 7b 0a 09 09 09 66  rt_idx++) {....f
1a1d0 6f 72 20 28 63 75 72 72 5f 69 64 5f 74 79 70 65  or (curr_id_type
1a1e0 20 3d 20 43 4b 4f 5f 43 45 52 54 49 46 49 43 41   = CKO_CERTIFICA
1a1f0 54 45 3b 20 63 75 72 72 5f 69 64 5f 74 79 70 65  TE; curr_id_type
1a200 20 3c 3d 20 43 4b 4f 5f 50 52 49 56 41 54 45 5f   <= CKO_PRIVATE_
1a210 4b 45 59 3b 20 63 75 72 72 5f 69 64 5f 74 79 70  KEY; curr_id_typ
1a220 65 2b 2b 29 20 7b 0a 09 09 09 09 69 64 65 6e 74  e++) {.....ident
1a230 69 74 69 65 73 5b 69 64 5f 69 64 78 5d 2e 61 74  ities[id_idx].at
1a240 74 72 69 62 75 74 65 73 20 3d 20 63 61 63 6b 65  tributes = cacke
1a250 79 5f 67 65 74 5f 61 74 74 72 69 62 75 74 65 73  y_get_attributes
1a260 28 63 75 72 72 5f 69 64 5f 74 79 70 65 2c 20 26  (curr_id_type, &
1a270 70 63 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b  pcsc_identities[
1a280 63 65 72 74 5f 69 64 78 5d 2c 20 63 65 72 74 5f  cert_idx], cert_
1a290 69 64 78 2c 20 26 69 64 65 6e 74 69 74 69 65 73  idx, &identities
1a2a0 5b 69 64 5f 69 64 78 5d 2e 61 74 74 72 69 62 75  [id_idx].attribu
1a2b0 74 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 09  tes_count);.....
1a2c0 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1a2d0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1a2e0 79 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  y = malloc(sizeo
1a2f0 66 28 2a 69 64 65 6e 74 69 74 69 65 73 5b 69 64  f(*identities[id
1a300 5f 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74  _idx].pcsc_ident
1a310 69 74 79 29 29 3b 0a 09 09 09 09 6d 65 6d 63 70  ity));.....memcp
1a320 79 28 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f  y(identities[id_
1a330 69 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69  idx].pcsc_identi
1a340 74 79 2c 20 26 70 63 73 63 5f 69 64 65 6e 74 69  ty, &pcsc_identi
1a350 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2c 20  ties[cert_idx], 
1a360 73 69 7a 65 6f 66 28 2a 69 64 65 6e 74 69 74 69  sizeof(*identiti
1a370 65 73 5b 69 64 5f 69 64 78 5d 2e 70 63 73 63 5f  es[id_idx].pcsc_
1a380 69 64 65 6e 74 69 74 79 29 29 3b 0a 0a 09 09 09  identity));.....
1a390 09 69 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69  .identities[id_i
1a3a0 64 78 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74  dx].pcsc_identit
1a3b0 79 2d 3e 63 65 72 74 69 66 69 63 61 74 65 20 3d  y->certificate =
1a3c0 20 6d 61 6c 6c 6f 63 28 70 63 73 63 5f 69 64 65   malloc(pcsc_ide
1a3d0 6e 74 69 74 69 65 73 5b 63 65 72 74 5f 69 64 78  ntities[cert_idx
1a3e0 5d 2e 63 65 72 74 69 66 69 63 61 74 65 5f 6c 65  ].certificate_le
1a3f0 6e 29 3b 0a 09 09 09 09 6d 65 6d 63 70 79 28 69  n);.....memcpy(i
1a400 64 65 6e 74 69 74 69 65 73 5b 69 64 5f 69 64 78  dentities[id_idx
1a410 5d 2e 70 63 73 63 5f 69 64 65 6e 74 69 74 79 2d  ].pcsc_identity-
1a420 3e 63 65 72 74 69 66 69 63 61 74 65 2c 20 70 63  >certificate, pc
1a430 73 63 5f 69 64 65 6e 74 69 74 69 65 73 5b 63 65  sc_identities[ce
1a440 72 74 5f 69 64 78 5d 2e 63 65 72 74 69 66 69 63  rt_idx].certific
1a450 61 74 65 2c 20 70 63 73 63 5f 69 64 65 6e 74 69  ate, pcsc_identi
1a460 74 69 65 73 5b 63 65 72 74 5f 69 64 78 5d 2e 63  ties[cert_idx].c
1a470 65 72 74 69 66 69 63 61 74 65 5f 6c 65 6e 29 3b  ertificate_len);
1a480 0a 0a 09 09 09 09 69 64 5f 69 64 78 2b 2b 3b 0a  ......id_idx++;.
1a490 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ...}...}....if (
1a4a0 69 6e 63 6c 75 64 65 5f 65 78 74 72 61 5f 63 65  include_extra_ce
1a4b0 72 74 73 29 20 7b 0a 09 09 09 43 41 43 4b 45 59  rts) {....CACKEY
1a4c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 49  _DEBUG_PRINTF("I
1a4d0 6e 63 6c 75 64 69 6e 67 20 55 53 20 47 6f 76 65  ncluding US Gove
1a4e0 72 6e 6d 65 6e 74 20 43 65 72 74 69 66 69 63 61  rnment Certifica
1a4f0 74 65 73 20 6f 6e 20 68 61 72 64 77 61 72 65 20  tes on hardware 
1a500 73 6c 6f 74 22 29 3b 0a 0a 09 09 09 63 61 63 6b  slot");.....cack
1a510 65 79 5f 72 65 61 64 5f 64 6f 64 5f 69 64 65 6e  ey_read_dod_iden
1a520 74 69 74 69 65 73 28 69 64 65 6e 74 69 74 69 65  tities(identitie
1a530 73 20 2b 20 69 64 5f 69 64 78 2c 20 6e 75 6d 5f  s + id_idx, num_
1a540 64 6f 64 5f 63 65 72 74 73 29 3b 0a 09 09 7d 0a  dod_certs);...}.
1a550 0a 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63  ...cackey_free_c
1a560 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74 69  erts(pcsc_identi
1a570 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73 2c  ties, num_certs,
1a580 20 31 29 3b 0a 0a 09 09 2a 69 64 73 5f 66 6f 75   1);....*ids_fou
1a590 6e 64 20 3d 20 6e 75 6d 5f 69 64 73 3b 0a 0a 09  nd = num_ids;...
1a5a0 09 72 65 74 75 72 6e 28 69 64 65 6e 74 69 74 69  .return(identiti
1a5b0 65 73 29 3b 0a 09 7d 0a 0a 0a 09 2a 69 64 73 5f  es);..}....*ids_
1a5c0 66 6f 75 6e 64 20 3d 20 30 3b 0a 09 72 65 74 75  found = 0;..retu
1a5d0 72 6e 28 4e 55 4c 4c 29 3b 0a 7d 0a 0a 43 4b 5f  rn(NULL);.}..CK_
1a5e0 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
1a5f0 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 69 61 6c  CK_RV, C_Initial
1a600 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54 52  ize)(CK_VOID_PTR
1a610 20 70 49 6e 69 74 41 72 67 73 29 20 7b 0a 09 43   pInitArgs) {..C
1a620 4b 5f 43 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 41  K_C_INITIALIZE_A
1a630 52 47 53 20 43 4b 5f 50 54 52 20 61 72 67 73 3b  RGS CK_PTR args;
1a640 0a 09 75 69 6e 74 33 32 5f 74 20 69 64 78 2c 20  ..uint32_t idx, 
1a650 68 69 67 68 65 73 74 5f 73 6c 6f 74 3b 0a 09 69  highest_slot;..i
1a660 6e 74 20 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65  nt mutex_init_re
1a670 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  t;...CACKEY_DEBU
1a680 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1a690 2e 22 29 3b 0a 0a 09 69 66 20 28 63 61 63 6b 65  .");...if (cacke
1a6a0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1a6b0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1a6c0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1a6d0 41 6c 72 65 61 64 79 20 69 6e 69 74 69 61 6c 69  Already initiali
1a6e0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
1a6f0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 41  n(CKR_CRYPTOKI_A
1a700 4c 52 45 41 44 59 5f 49 4e 49 54 49 41 4c 49 5a  LREADY_INITIALIZ
1a710 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 49  ED);..}...if (pI
1a720 6e 69 74 41 72 67 73 20 21 3d 20 4e 55 4c 4c 29  nitArgs != NULL)
1a730 20 7b 0a 09 09 61 72 67 73 20 3d 20 70 49 6e 69   {...args = pIni
1a740 74 41 72 67 73 3b 0a 09 09 6d 65 6d 63 70 79 28  tArgs;...memcpy(
1a750 26 63 61 63 6b 65 79 5f 61 72 67 73 2c 20 61 72  &cackey_args, ar
1a760 67 73 2c 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  gs, sizeof(cacke
1a770 79 5f 61 72 67 73 29 29 3b 0a 0a 09 09 69 66 20  y_args));....if 
1a780 28 61 72 67 73 2d 3e 43 72 65 61 74 65 4d 75 74  (args->CreateMut
1a790 65 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  ex == NULL || ar
1a7a0 67 73 2d 3e 44 65 73 74 72 6f 79 4d 75 74 65 78  gs->DestroyMutex
1a7b0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 73   == NULL || args
1a7c0 2d 3e 4c 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e  ->LockMutex == N
1a7d0 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 55 6e 6c  ULL || args->Unl
1a7e0 6f 63 6b 4d 75 74 65 78 20 3d 3d 20 4e 55 4c 4c  ockMutex == NULL
1a7f0 29 20 7b 0a 09 09 09 69 66 20 28 61 72 67 73 2d  ) {....if (args-
1a800 3e 43 72 65 61 74 65 4d 75 74 65 78 20 21 3d 20  >CreateMutex != 
1a810 4e 55 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 44 65  NULL || args->De
1a820 73 74 72 6f 79 4d 75 74 65 78 20 21 3d 20 4e 55  stroyMutex != NU
1a830 4c 4c 20 7c 7c 20 61 72 67 73 2d 3e 4c 6f 63 6b  LL || args->Lock
1a840 4d 75 74 65 78 20 21 3d 20 4e 55 4c 4c 20 7c 7c  Mutex != NULL ||
1a850 20 61 72 67 73 2d 3e 55 6e 6c 6f 63 6b 4d 75 74   args->UnlockMut
1a860 65 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ex != NULL) {...
1a870 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
1a880 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 53 6f  RINTF("Error. So
1a890 6d 65 2c 20 62 75 74 20 6e 6f 74 20 41 6c 6c 20  me, but not All 
1a8a0 74 68 72 65 61 64 69 6e 67 20 70 72 69 6d 69 74  threading primit
1a8b0 69 76 65 73 20 70 72 6f 76 69 64 65 64 2e 22 29  ives provided.")
1a8c0 3b 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
1a8d0 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29  R_ARGUMENTS_BAD)
1a8e0 3b 0a 09 09 09 7d 0a 09 09 7d 0a 09 7d 20 65 6c  ;....}...}..} el
1a8f0 73 65 20 7b 0a 09 09 63 61 63 6b 65 79 5f 61 72  se {...cackey_ar
1a900 67 73 2e 43 72 65 61 74 65 4d 75 74 65 78 20 3d  gs.CreateMutex =
1a910 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f   NULL;...cackey_
1a920 61 72 67 73 2e 44 65 73 74 72 6f 79 4d 75 74 65  args.DestroyMute
1a930 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
1a940 65 79 5f 61 72 67 73 2e 4c 6f 63 6b 4d 75 74 65  ey_args.LockMute
1a950 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b  x = NULL;...cack
1a960 65 79 5f 61 72 67 73 2e 55 6e 6c 6f 63 6b 4d 75  ey_args.UnlockMu
1a970 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 61  tex = NULL;...ca
1a980 63 6b 65 79 5f 61 72 67 73 2e 66 6c 61 67 73 20  ckey_args.flags 
1a990 3d 20 30 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69  = 0;..}...for (i
1a9a0 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73  dx = 0; idx < (s
1a9b0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1a9c0 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28  sions) / sizeof(
1a9d0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
1a9e0 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  0])); idx++) {..
1a9f0 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  .cackey_sessions
1aa00 5b 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 30  [idx].active = 0
1aa10 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20  ;..}...for (idx 
1aa20 3d 20 30 3b 20 69 64 78 20 3c 20 28 73 69 7a 65  = 0; idx < (size
1aa30 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
1aa40 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
1aa50 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 69 64 78  _slots[0])); idx
1aa60 2b 2b 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 73  ++) {...cackey_s
1aa70 6c 6f 74 73 5b 69 64 78 5d 2e 61 63 74 69 76 65  lots[idx].active
1aa80 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73   = 0;...cackey_s
1aa90 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f 72  lots[idx].pcsc_r
1aaa0 65 61 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09  eader = NULL;...
1aab0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78  cackey_slots[idx
1aac0 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65  ].transaction_de
1aad0 70 74 68 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65  pth = 0;...cacke
1aae0 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 74 72 61  y_slots[idx].tra
1aaf0 6e 73 61 63 74 69 6f 6e 5f 6e 65 65 64 5f 68 77  nsaction_need_hw
1ab00 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 09 09 63 61 63  _lock = 0;...cac
1ab10 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 73  key_slots[idx].s
1ab20 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a 09  lot_reset = 0;..
1ab30 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69 64  .cackey_slots[id
1ab40 78 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d  x].token_flags =
1ab50 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c 6f   0;...cackey_slo
1ab60 74 73 5b 69 64 78 5d 2e 6c 61 62 65 6c 20 3d 20  ts[idx].label = 
1ab70 4e 55 4c 4c 3b 0a 09 09 63 61 63 6b 65 79 5f 73  NULL;...cackey_s
1ab80 6c 6f 74 73 5b 69 64 78 5d 2e 69 6e 74 65 72 6e  lots[idx].intern
1ab90 61 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  al = 0;..}...if 
1aba0 28 67 65 74 65 6e 76 28 22 43 41 43 4b 45 59 5f  (getenv("CACKEY_
1abb0 4e 4f 5f 45 58 54 52 41 5f 43 45 52 54 53 22 29  NO_EXTRA_CERTS")
1abc0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   != NULL) {...CA
1abd0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1abe0 46 28 22 41 73 6b 65 64 20 6e 6f 74 20 74 6f 20  F("Asked not to 
1abf0 69 6e 63 6c 75 64 65 20 44 6f 44 20 63 65 72 74  include DoD cert
1ac00 69 66 69 63 61 74 65 73 22 29 3b 0a 09 7d 20 65  ificates");..} e
1ac10 6c 73 65 20 7b 0a 09 09 68 69 67 68 65 73 74 5f  lse {...highest_
1ac20 73 6c 6f 74 20 3d 20 28 73 69 7a 65 6f 66 28 63  slot = (sizeof(c
1ac30 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1ac40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1ac50 74 73 5b 30 5d 29 29 20 2d 20 31 3b 0a 0a 09 09  ts[0])) - 1;....
1ac60 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1ac70 4e 54 46 28 22 49 6e 63 6c 75 64 69 6e 67 20 44  NTF("Including D
1ac80 6f 44 20 63 65 72 74 73 20 69 6e 20 73 6c 6f 74  oD certs in slot
1ac90 20 25 6c 75 22 2c 20 28 75 6e 73 69 67 6e 65 64   %lu", (unsigned
1aca0 20 6c 6f 6e 67 29 20 68 69 67 68 65 73 74 5f 73   long) highest_s
1acb0 6c 6f 74 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  lot);....cackey_
1acc0 73 6c 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c  slots[highest_sl
1acd0 6f 74 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a  ot].active = 1;.
1ace0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
1acf0 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 69 6e 74  ighest_slot].int
1ad00 65 72 6e 61 6c 20 3d 20 31 3b 0a 09 09 63 61 63  ernal = 1;...cac
1ad10 6b 65 79 5f 73 6c 6f 74 73 5b 68 69 67 68 65 73  key_slots[highes
1ad20 74 5f 73 6c 6f 74 5d 2e 6c 61 62 65 6c 20 3d 20  t_slot].label = 
1ad30 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
1ad40 29 20 22 55 53 20 47 6f 76 65 72 6e 6d 65 6e 74  ) "US Government
1ad50 20 43 65 72 74 69 66 69 63 61 74 65 73 22 3b 0a   Certificates";.
1ad60 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 68  ..cackey_slots[h
1ad70 69 67 68 65 73 74 5f 73 6c 6f 74 5d 2e 70 63 73  ighest_slot].pcs
1ad80 63 5f 72 65 61 64 65 72 20 3d 20 22 43 41 43 4b  c_reader = "CACK
1ad90 65 79 22 3b 0a 09 09 63 61 63 6b 65 79 5f 73 6c  ey";...cackey_sl
1ada0 6f 74 73 5b 68 69 67 68 65 73 74 5f 73 6c 6f 74  ots[highest_slot
1adb0 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20  ].token_flags = 
1adc0 30 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 69  0;..}...cackey_i
1add0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
1ade0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 62 69  ..if (!cackey_bi
1adf0 67 6c 6f 63 6b 5f 69 6e 69 74 29 20 7b 0a 09 09  glock_init) {...
1ae00 6d 75 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 3d  mutex_init_ret =
1ae10 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 63 72   cackey_mutex_cr
1ae20 65 61 74 65 28 26 63 61 63 6b 65 79 5f 62 69 67  eate(&cackey_big
1ae30 6c 6f 63 6b 29 3b 0a 0a 09 09 69 66 20 28 6d 75  lock);....if (mu
1ae40 74 65 78 5f 69 6e 69 74 5f 72 65 74 20 21 3d 20  tex_init_ret != 
1ae50 30 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  0) {....CACKEY_D
1ae60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ae70 6f 72 2e 20 20 4d 75 74 65 78 20 69 6e 69 74 69  or.  Mutex initi
1ae80 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69 6c 65 64  alization failed
1ae90 2e 22 29 3b 0a 0a 09 09 09 72 65 74 75 72 6e 28  .");.....return(
1aea0 43 4b 52 5f 43 41 4e 54 5f 4c 4f 43 4b 29 3b 0a  CKR_CANT_LOCK);.
1aeb0 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 62 69  ..}....cackey_bi
1aec0 67 6c 6f 63 6b 5f 69 6e 69 74 20 3d 20 31 3b 0a  glock_init = 1;.
1aed0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1aee0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1aef0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1af00 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1af10 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1af20 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
1af30 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46 69 6e 61  ON(CK_RV, C_Fina
1af40 6c 69 7a 65 29 28 43 4b 5f 56 4f 49 44 5f 50 54  lize)(CK_VOID_PT
1af50 52 20 70 52 65 73 65 72 76 65 64 29 20 7b 0a 09  R pReserved) {..
1af60 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 0a 09  uint32_t idx;...
1af70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1af80 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1af90 0a 09 69 66 20 28 70 52 65 73 65 72 76 65 64 20  ..if (pReserved 
1afa0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  != NULL) {...CAC
1afb0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1afc0 28 22 45 72 72 6f 72 2e 20 70 52 65 73 65 72 76  ("Error. pReserv
1afd0 65 64 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  ed is not NULL."
1afe0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1aff0 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1b000 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1b010 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1b020 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1b030 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1b040 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1b050 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1b060 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1b070 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1b080 0a 09 66 6f 72 20 28 69 64 78 20 3d 20 30 3b 20  ..for (idx = 0; 
1b090 69 64 78 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  idx < (sizeof(ca
1b0a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
1b0b0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1b0c0 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b 20 69 64  essions[0])); id
1b0d0 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28 63 61 63  x++) {...if (cac
1b0e0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
1b0f0 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 09 43  ].active) {....C
1b100 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 28 69 64  _CloseSession(id
1b110 78 29 3b 0a 09 09 7d 0a 09 7d 0a 0a 09 63 61 63  x);...}..}...cac
1b120 6b 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e  key_slots_discon
1b130 6e 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 66 6f  nect_all();...fo
1b140 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78 20  r (idx = 0; idx 
1b150 3c 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  < (sizeof(cackey
1b160 5f 73 6c 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66  _slots) / sizeof
1b170 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d  (cackey_slots[0]
1b180 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69  )); idx++) {...i
1b190 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1b1a0 69 64 78 5d 2e 69 6e 74 65 72 6e 61 6c 29 20 7b  idx].internal) {
1b1b0 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 09  ....continue;...
1b1c0 7d 0a 0a 09 09 69 66 20 28 63 61 63 6b 65 79 5f  }....if (cackey_
1b1d0 73 6c 6f 74 73 5b 69 64 78 5d 2e 70 63 73 63 5f  slots[idx].pcsc_
1b1e0 72 65 61 64 65 72 29 20 7b 0a 09 09 09 66 72 65  reader) {....fre
1b1f0 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  e(cackey_slots[i
1b200 64 78 5d 2e 70 63 73 63 5f 72 65 61 64 65 72 29  dx].pcsc_reader)
1b210 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 63 61 63  ;...}....if (cac
1b220 6b 65 79 5f 73 6c 6f 74 73 5b 69 64 78 5d 2e 63  key_slots[idx].c
1b230 61 63 68 65 64 5f 63 65 72 74 73 29 20 7b 0a 09  ached_certs) {..
1b240 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f 63 65  ..cackey_free_ce
1b250 72 74 73 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  rts(cackey_slots
1b260 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72  [idx].cached_cer
1b270 74 73 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ts, cackey_slots
1b280 5b 69 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72  [idx].cached_cer
1b290 74 73 5f 63 6f 75 6e 74 2c 20 31 29 3b 0a 0a 09  ts_count, 1);...
1b2a0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 69  ..cackey_slots[i
1b2b0 64 78 5d 2e 63 61 63 68 65 64 5f 63 65 72 74 73  dx].cached_certs
1b2c0 20 3d 20 4e 55 4c 4c 3b 0a 09 09 7d 0a 09 7d 0a   = NULL;...}..}.
1b2d0 0a 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  ..cackey_pcsc_di
1b2e0 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 0a 09 63 61  sconnect();...ca
1b2f0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1b300 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 0;...CACKEY_D
1b310 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
1b320 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
1b330 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
1b340 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
1b350 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1b360 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
1b370 65 74 49 6e 66 6f 29 28 43 4b 5f 49 4e 46 4f 5f  etInfo)(CK_INFO_
1b380 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 73 74  PTR pInfo) {..st
1b390 61 74 69 63 20 43 4b 5f 55 54 46 38 43 48 41 52  atic CK_UTF8CHAR
1b3a0 20 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 5b   manufacturerID[
1b3b0 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76 65 72 6e  ] = "U.S. Govern
1b3c0 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69 63 20 43  ment";..static C
1b3d0 4b 5f 55 54 46 38 43 48 41 52 20 6c 69 62 72 61  K_UTF8CHAR libra
1b3e0 72 79 44 65 73 63 72 69 70 74 69 6f 6e 5b 5d 20  ryDescription[] 
1b3f0 3d 20 22 43 41 43 4b 65 79 22 3b 0a 0a 09 43 41  = "CACKey";...CA
1b400 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1b410 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
1b420 69 66 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c  if (pInfo == NUL
1b430 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  L) {...CACKEY_DE
1b440 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1b450 72 2e 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c  r. pInfo is NULL
1b460 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1b470 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
1b480 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
1b490 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
1b4a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1b4b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1b4c0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
1b4d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
1b4e0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
1b4f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
1b500 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74  }...pInfo->crypt
1b510 6f 6b 69 56 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72  okiVersion.major
1b520 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50   = ((CACKEY_CRYP
1b530 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44  TOKI_VERSION_COD
1b540 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66  E) >> 16) & 0xff
1b550 3b 0a 09 70 49 6e 66 6f 2d 3e 63 72 79 70 74 6f  ;..pInfo->crypto
1b560 6b 69 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20  kiVersion.minor 
1b570 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59 50 54  = ((CACKEY_CRYPT
1b580 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f 44 45  OKI_VERSION_CODE
1b590 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a  ) >> 8) & 0xff;.
1b5a0 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e  ..memset(pInfo->
1b5b0 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c 20  manufacturerID, 
1b5c0 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e 66  ' ', sizeof(pInf
1b5d0 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49  o->manufacturerI
1b5e0 44 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  D));..memcpy(pIn
1b5f0 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1b600 49 44 2c 20 6d 61 6e 75 66 61 63 74 75 72 65 72  ID, manufacturer
1b610 49 44 2c 20 73 69 7a 65 6f 66 28 6d 61 6e 75 66  ID, sizeof(manuf
1b620 61 63 74 75 72 65 72 49 44 29 20 2d 20 31 29 3b  acturerID) - 1);
1b630 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ...pInfo->flags 
1b640 3d 20 30 78 30 30 3b 0a 0a 09 6d 65 6d 73 65 74  = 0x00;...memset
1b650 28 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 44  (pInfo->libraryD
1b660 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c  escription, ' ',
1b670 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c   sizeof(pInfo->l
1b680 69 62 72 61 72 79 44 65 73 63 72 69 70 74 69 6f  ibraryDescriptio
1b690 6e 29 29 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e  n));..memcpy(pIn
1b6a0 66 6f 2d 3e 6c 69 62 72 61 72 79 44 65 73 63 72  fo->libraryDescr
1b6b0 69 70 74 69 6f 6e 2c 20 6c 69 62 72 61 72 79 44  iption, libraryD
1b6c0 65 73 63 72 69 70 74 69 6f 6e 2c 20 73 69 7a 65  escription, size
1b6d0 6f 66 28 6c 69 62 72 61 72 79 44 65 73 63 72 69  of(libraryDescri
1b6e0 70 74 69 6f 6e 29 20 2d 20 31 29 3b 0a 0a 09 70  ption) - 1);...p
1b6f0 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79 56 65 72  Info->libraryVer
1b700 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 28 63 61  sion.major = (ca
1b710 63 6b 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28  ckey_getversion(
1b720 29 20 3e 3e 20 31 36 29 20 26 20 30 78 66 66 3b  ) >> 16) & 0xff;
1b730 0a 09 70 49 6e 66 6f 2d 3e 6c 69 62 72 61 72 79  ..pInfo->library
1b740 56 65 72 73 69 6f 6e 2e 6d 69 6e 6f 72 20 3d 20  Version.minor = 
1b750 28 63 61 63 6b 65 79 5f 67 65 74 76 65 72 73 69  (cackey_getversi
1b760 6f 6e 28 29 20 3e 3e 20 38 29 20 26 20 30 78 66  on() >> 8) & 0xf
1b770 66 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  f;...CACKEY_DEBU
1b780 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1b790 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
1b7a0 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
1b7b0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
1b7c0 2f 2a 0a 20 2a 20 50 72 6f 63 65 73 73 20 6c 69  /*. * Process li
1b7d0 73 74 20 6f 66 20 72 65 61 64 65 72 73 2c 20 61  st of readers, a
1b7e0 6e 64 20 63 72 65 61 74 65 20 6d 61 70 70 69 6e  nd create mappin
1b7f0 67 20 62 65 74 77 65 65 6e 20 72 65 61 64 65 72  g between reader
1b800 20 6e 61 6d 65 20 61 6e 64 20 73 6c 6f 74 20 49   name and slot I
1b810 44 0a 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  D. */.CK_DEFINE_
1b820 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1b830 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 29 28 43  C_GetSlotList)(C
1b840 4b 5f 42 42 4f 4f 4c 20 74 6f 6b 65 6e 50 72 65  K_BBOOL tokenPre
1b850 73 65 6e 74 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44  sent, CK_SLOT_ID
1b860 5f 50 54 52 20 70 53 6c 6f 74 4c 69 73 74 2c 20  _PTR pSlotList, 
1b870 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
1b880 43 6f 75 6e 74 29 20 7b 0a 09 73 74 61 74 69 63  Count) {..static
1b890 20 69 6e 74 20 66 69 72 73 74 5f 63 61 6c 6c 20   int first_call 
1b8a0 3d 20 31 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  = 1;..int mutex_
1b8b0 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20 70 63 73  retval;..int pcs
1b8c0 63 5f 63 6f 6e 6e 65 63 74 5f 72 65 74 3b 0a 09  c_connect_ret;..
1b8d0 43 4b 5f 55 4c 4f 4e 47 20 63 6f 75 6e 74 2c 20  CK_ULONG count, 
1b8e0 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30 2c 20  slot_count = 0, 
1b8f0 63 75 72 72 73 6c 6f 74 2c 20 73 6c 6f 74 5f 69  currslot, slot_i
1b900 64 78 3b 0a 09 63 68 61 72 20 2a 70 63 73 63 5f  dx;..char *pcsc_
1b910 72 65 61 64 65 72 73 2c 20 2a 70 63 73 63 5f 72  readers, *pcsc_r
1b920 65 61 64 65 72 73 5f 73 2c 20 2a 70 63 73 63 5f  eaders_s, *pcsc_
1b930 72 65 61 64 65 72 73 5f 65 3b 0a 09 44 57 4f 52  readers_e;..DWOR
1b940 44 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  D pcsc_readers_l
1b950 65 6e 3b 0a 09 4c 4f 4e 47 20 73 63 61 72 64 5f  en;..LONG scard_
1b960 6c 69 73 74 72 65 61 64 65 72 73 5f 72 65 74 3b  listreaders_ret;
1b970 0a 09 73 69 7a 65 5f 74 20 63 75 72 72 5f 72 65  ..size_t curr_re
1b980 61 64 65 72 5f 6c 65 6e 3b 0a 09 69 6e 74 20 73  ader_len;..int s
1b990 6c 6f 74 5f 72 65 73 65 74 3b 0a 0a 09 43 41 43  lot_reset;...CAC
1b9a0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1b9b0 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1b9c0 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d 3d 20 4e  f (pulCount == N
1b9d0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
1b9e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1b9f0 72 6f 72 2e 20 70 75 6c 43 6f 75 6e 74 20 69 73  ror. pulCount is
1ba00 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74   NULL.");....ret
1ba10 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54  urn(CKR_ARGUMENT
1ba20 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20  S_BAD);..}...if 
1ba30 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
1ba40 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
1ba50 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
1ba60 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
1ba70 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
1ba80 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
1ba90 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
1baa0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
1bab0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
1bac0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
1bad0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
1bae0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
1baf0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
1bb00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
1bb10 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
1bb20 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1bb30 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
1bb40 4f 52 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 6c 65  OR);..}.../* Cle
1bb50 61 72 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  ar list of slots
1bb60 20 2a 2f 0a 09 73 6c 6f 74 5f 72 65 73 65 74 20   */..slot_reset 
1bb70 3d 20 30 3b 0a 09 69 66 20 28 70 53 6c 6f 74 4c  = 0;..if (pSlotL
1bb80 69 73 74 29 20 7b 0a 09 09 69 66 20 28 66 69 72  ist) {...if (fir
1bb90 73 74 5f 63 61 6c 6c 29 20 7b 0a 09 09 09 66 69  st_call) {....fi
1bba0 72 73 74 5f 63 61 6c 6c 20 3d 20 30 3b 0a 0a 09  rst_call = 0;...
1bbb0 09 09 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 31  ..slot_reset = 1
1bbc0 3b 0a 09 09 7d 0a 0a 09 09 2f 2a 20 49 66 20 61  ;...}..../* If a
1bbd0 6e 79 20 6f 66 20 74 68 65 20 73 6c 6f 74 73 20  ny of the slots 
1bbe0 68 61 76 65 20 62 65 65 6e 20 72 65 73 65 74 20  have been reset 
1bbf0 74 68 65 6e 20 70 75 72 67 65 20 61 6c 6c 20 69  then purge all i
1bc00 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
1bc10 68 65 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 09 09  heck again */...
1bc20 66 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20  for (currslot = 
1bc30 30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73  0; currslot < (s
1bc40 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1bc50 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1bc60 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20  key_slots[0])); 
1bc70 63 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09  currslot++) {...
1bc80 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1bc90 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
1bca0 72 6e 61 6c 29 20 7b 0a 09 09 09 09 63 6f 6e 74  rnal) {.....cont
1bcb0 69 6e 75 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  inue;....}.....i
1bcc0 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
1bcd0 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
1bce0 65 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  e) {.....continu
1bcf0 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  e;....}.....if (
1bd00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1bd10 72 73 6c 6f 74 5d 2e 73 6c 6f 74 5f 72 65 73 65  rslot].slot_rese
1bd20 74 29 20 7b 0a 09 09 09 09 73 6c 6f 74 5f 72 65  t) {.....slot_re
1bd30 73 65 74 20 3d 20 31 3b 0a 0a 09 09 09 09 62 72  set = 1;......br
1bd40 65 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09  eak;....}...}...
1bd50 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29  .if (slot_reset)
1bd60 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42   {....CACKEY_DEB
1bd70 55 47 5f 50 52 49 4e 54 46 28 22 50 75 72 67 69  UG_PRINTF("Purgi
1bd80 6e 67 20 61 6c 6c 20 73 6c 6f 74 20 69 6e 66 6f  ng all slot info
1bd90 72 6d 61 74 69 6f 6e 2e 22 29 3b 0a 0a 09 09 09  rmation.");.....
1bda0 2f 2a 20 4f 6e 6c 79 20 75 70 64 61 74 65 20 74  /* Only update t
1bdb0 68 65 20 6c 69 73 74 20 6f 66 20 73 6c 6f 74 73  he list of slots
1bdc0 20 69 66 20 77 65 20 61 72 65 20 61 63 74 75 61   if we are actua
1bdd0 6c 6c 79 20 62 65 69 6e 67 20 73 75 70 70 6c 79  lly being supply
1bde0 20 74 68 65 20 73 6c 6f 74 20 69 6e 66 6f 72 6d   the slot inform
1bdf0 61 74 69 6f 6e 20 2a 2f 0a 09 09 09 63 61 63 6b  ation */....cack
1be00 65 79 5f 73 6c 6f 74 73 5f 64 69 73 63 6f 6e 6e  ey_slots_disconn
1be10 65 63 74 5f 61 6c 6c 28 29 3b 0a 0a 09 09 09 66  ect_all();.....f
1be20 6f 72 20 28 63 75 72 72 73 6c 6f 74 20 3d 20 30  or (currslot = 0
1be30 3b 20 63 75 72 72 73 6c 6f 74 20 3c 20 28 73 69  ; currslot < (si
1be40 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1be50 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
1be60 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 3b 20 63  ey_slots[0])); c
1be70 75 72 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09  urrslot++) {....
1be80 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74  .if (cackey_slot
1be90 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65  s[currslot].inte
1bea0 72 6e 61 6c 29 20 7b 0a 09 09 09 09 09 63 6f 6e  rnal) {......con
1beb0 74 69 6e 75 65 3b 0a 09 09 09 09 7d 0a 0a 09 09  tinue;.....}....
1bec0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f  ..if (cackey_slo
1bed0 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
1bee0 63 5f 72 65 61 64 65 72 29 20 7b 0a 09 09 09 09  c_reader) {.....
1bef0 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f  .free(cackey_slo
1bf00 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 70 63 73  ts[currslot].pcs
1bf10 63 5f 72 65 61 64 65 72 29 3b 0a 0a 09 09 09 09  c_reader);......
1bf20 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75  .cackey_slots[cu
1bf30 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61  rrslot].pcsc_rea
1bf40 64 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09 09  der = NULL;.....
1bf50 7d 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65  }......if (cacke
1bf60 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74  y_slots[currslot
1bf70 5d 2e 6c 61 62 65 6c 29 20 7b 0a 09 09 09 09 09  ].label) {......
1bf80 66 72 65 65 28 63 61 63 6b 65 79 5f 73 6c 6f 74  free(cackey_slot
1bf90 73 5b 63 75 72 72 73 6c 6f 74 5d 2e 6c 61 62 65  s[currslot].labe
1bfa0 6c 29 3b 0a 0a 09 09 09 09 09 63 61 63 6b 65 79  l);.......cackey
1bfb0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1bfc0 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 09  .label = NULL;..
1bfd0 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
1bfe0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1bff0 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09 09 09  .active = 0;....
1c000 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  }...} else {....
1c010 0a 09 09 7d 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  ...}..}.../* Det
1c020 65 72 6d 69 6e 65 20 6c 69 73 74 20 6f 66 20 72  ermine list of r
1c030 65 61 64 65 72 73 20 2a 2f 0a 09 70 63 73 63 5f  eaders */..pcsc_
1c040 63 6f 6e 6e 65 63 74 5f 72 65 74 20 3d 20 63 61  connect_ret = ca
1c050 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65 63  ckey_pcsc_connec
1c060 74 28 29 3b 0a 09 69 66 20 28 70 63 73 63 5f 63  t();..if (pcsc_c
1c070 6f 6e 6e 65 63 74 5f 72 65 74 20 21 3d 20 43 41  onnect_ret != CA
1c080 43 4b 45 59 5f 50 43 53 43 5f 53 5f 4f 4b 29 20  CKEY_PCSC_S_OK) 
1c090 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1c0a0 5f 50 52 49 4e 54 46 28 22 43 6f 6e 6e 65 63 74  _PRINTF("Connect
1c0b0 69 6f 6e 20 74 6f 20 50 43 2f 53 43 20 66 61 69  ion to PC/SC fai
1c0c0 6c 65 64 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  led, assuming no
1c0d0 20 73 6c 6f 74 73 22 29 3b 0a 0a 09 09 73 6c 6f   slots");....slo
1c0e0 74 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 20  t_count = 0;..} 
1c0f0 65 6c 73 65 20 7b 0a 09 09 70 63 73 63 5f 72 65  else {...pcsc_re
1c100 61 64 65 72 73 5f 6c 65 6e 20 3d 20 30 3b 0a 0a  aders_len = 0;..
1c110 09 09 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64  ..scard_listread
1c120 65 72 73 5f 72 65 74 20 3d 20 53 43 61 72 64 4c  ers_ret = SCardL
1c130 69 73 74 52 65 61 64 65 72 73 28 2a 63 61 63 6b  istReaders(*cack
1c140 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c 65 2c 20  ey_pcsc_handle, 
1c150 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26 70 63 73  NULL, NULL, &pcs
1c160 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a  c_readers_len);.
1c170 0a 09 09 69 66 20 28 73 63 61 72 64 5f 6c 69 73  ...if (scard_lis
1c180 74 72 65 61 64 65 72 73 5f 72 65 74 20 3d 3d 20  treaders_ret == 
1c190 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52 52  SCARD_F_COMM_ERR
1c1a0 4f 52 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  OR) {....CACKEY_
1c1b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1c1c0 72 6f 72 2e 20 53 43 61 72 64 4c 69 73 74 52 65  ror. SCardListRe
1c1d0 61 64 65 72 73 28 29 20 72 65 74 75 72 6e 65 64  aders() returned
1c1e0 20 53 43 41 52 44 5f 46 5f 43 4f 4d 4d 5f 45 52   SCARD_F_COMM_ER
1c1f0 52 4f 52 2c 20 61 73 73 75 6d 69 6e 67 20 43 6f  ROR, assuming Co
1c200 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 50 43 2f 53  nnection to PC/S
1c210 43 20 77 65 6e 74 20 61 77 61 79 2e 20 52 65 63  C went away. Rec
1c220 6f 6e 6e 65 63 74 69 6e 67 2e 22 29 3b 0a 0a 09  onnecting.");...
1c230 09 09 63 61 63 6b 65 79 5f 70 63 73 63 5f 64 69  ..cackey_pcsc_di
1c240 73 63 6f 6e 6e 65 63 74 28 29 3b 0a 09 09 09 63  sconnect();....c
1c250 61 63 6b 65 79 5f 70 63 73 63 5f 63 6f 6e 6e 65  ackey_pcsc_conne
1c260 63 74 28 29 3b 0a 0a 09 09 09 43 41 43 4b 45 59  ct();.....CACKEY
1c270 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 54  _DEBUG_PRINTF("T
1c280 72 79 69 6e 67 20 53 43 61 72 64 4c 69 73 74 52  rying SCardListR
1c290 65 61 64 65 72 73 28 29 20 61 67 61 69 6e 22 29  eaders() again")
1c2a0 3b 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72  ;....scard_listr
1c2b0 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61  eaders_ret = SCa
1c2c0 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63  rdListReaders(*c
1c2d0 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
1c2e0 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 26  e, NULL, NULL, &
1c2f0 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c 65 6e  pcsc_readers_len
1c300 29 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 73 63  );...}....if (sc
1c310 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1c320 72 65 74 20 3d 3d 20 53 43 41 52 44 5f 53 5f 53  ret == SCARD_S_S
1c330 55 43 43 45 53 53 20 26 26 20 70 63 73 63 5f 72  UCCESS && pcsc_r
1c340 65 61 64 65 72 73 5f 6c 65 6e 20 21 3d 20 30 29  eaders_len != 0)
1c350 20 7b 0a 09 09 09 70 63 73 63 5f 72 65 61 64 65   {....pcsc_reade
1c360 72 73 20 3d 20 6d 61 6c 6c 6f 63 28 70 63 73 63  rs = malloc(pcsc
1c370 5f 72 65 61 64 65 72 73 5f 6c 65 6e 29 3b 0a 09  _readers_len);..
1c380 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 73  ..pcsc_readers_s
1c390 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 3b   = pcsc_readers;
1c3a0 0a 0a 09 09 09 73 63 61 72 64 5f 6c 69 73 74 72  .....scard_listr
1c3b0 65 61 64 65 72 73 5f 72 65 74 20 3d 20 53 43 61  eaders_ret = SCa
1c3c0 72 64 4c 69 73 74 52 65 61 64 65 72 73 28 2a 63  rdListReaders(*c
1c3d0 61 63 6b 65 79 5f 70 63 73 63 5f 68 61 6e 64 6c  ackey_pcsc_handl
1c3e0 65 2c 20 4e 55 4c 4c 2c 20 70 63 73 63 5f 72 65  e, NULL, pcsc_re
1c3f0 61 64 65 72 73 2c 20 26 70 63 73 63 5f 72 65 61  aders, &pcsc_rea
1c400 64 65 72 73 5f 6c 65 6e 29 3b 0a 09 09 09 69 66  ders_len);....if
1c410 20 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64   (scard_listread
1c420 65 72 73 5f 72 65 74 20 3d 3d 20 53 43 41 52 44  ers_ret == SCARD
1c430 5f 53 5f 53 55 43 43 45 53 53 29 20 7b 0a 09 09  _S_SUCCESS) {...
1c440 09 09 70 63 73 63 5f 72 65 61 64 65 72 73 5f 65  ..pcsc_readers_e
1c450 20 3d 20 70 63 73 63 5f 72 65 61 64 65 72 73 20   = pcsc_readers 
1c460 2b 20 70 63 73 63 5f 72 65 61 64 65 72 73 5f 6c  + pcsc_readers_l
1c470 65 6e 3b 0a 0a 09 09 09 09 2f 2a 20 53 74 61 72  en;....../* Star
1c480 74 20 77 69 74 68 20 53 6c 6f 74 20 49 44 20 31  t with Slot ID 1
1c490 2c 20 74 6f 20 61 76 6f 69 64 20 61 20 62 75 67  , to avoid a bug
1c4a0 20 69 6e 20 47 44 4d 20 6f 6e 20 52 48 45 4c 20   in GDM on RHEL 
1c4b0 2a 2f 0a 09 09 09 09 2f 2a 20 42 75 67 20 35 39  */...../* Bug 59
1c4c0 34 39 31 31 3a 20 68 74 74 70 73 3a 2f 2f 62 75  4911: https://bu
1c4d0 67 7a 69 6c 6c 61 2e 72 65 64 68 61 74 2e 63 6f  gzilla.redhat.co
1c4e0 6d 2f 73 68 6f 77 5f 62 75 67 2e 63 67 69 3f 69  m/show_bug.cgi?i
1c4f0 64 3d 35 39 34 39 31 31 20 2a 2f 0a 09 09 09 09  d=594911 */.....
1c500 63 75 72 72 73 6c 6f 74 20 3d 20 31 3b 0a 09 09  currslot = 1;...
1c510 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 20 3d 20 30  ..slot_count = 0
1c520 3b 0a 09 09 09 09 77 68 69 6c 65 20 28 70 63 73  ;.....while (pcs
1c530 63 5f 72 65 61 64 65 72 73 20 3c 20 70 63 73 63  c_readers < pcsc
1c540 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09 09  _readers_e) {...
1c550 09 09 09 2f 2a 20 46 69 6e 64 20 6e 65 78 74 20  .../* Find next 
1c560 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 20 2a  available slot *
1c570 2f 0a 09 09 09 09 09 66 6f 72 20 28 3b 20 63 75  /......for (; cu
1c580 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66  rrslot < (sizeof
1c590 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f  (cackey_slots) /
1c5a0 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
1c5b0 6c 6f 74 73 5b 30 5d 29 29 3b 20 63 75 72 72 73  lots[0])); currs
1c5c0 6c 6f 74 2b 2b 29 20 7b 0a 09 09 09 09 09 09 69  lot++) {.......i
1c5d0 66 20 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73  f (!cackey_slots
1c5e0 5b 63 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76  [currslot].activ
1c5f0 65 29 20 7b 0a 09 09 09 09 09 09 09 62 72 65 61  e) {........brea
1c600 6b 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09  k;.......}......
1c610 7d 0a 0a 09 09 09 09 09 63 75 72 72 5f 72 65 61  }.......curr_rea
1c620 64 65 72 5f 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  der_len = strlen
1c630 28 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a  (pcsc_readers);.
1c640 0a 09 09 09 09 09 69 66 20 28 28 70 63 73 63 5f  ......if ((pcsc_
1c650 72 65 61 64 65 72 73 20 2b 20 63 75 72 72 5f 72  readers + curr_r
1c660 65 61 64 65 72 5f 6c 65 6e 29 20 3e 20 70 63 73  eader_len) > pcs
1c670 63 5f 72 65 61 64 65 72 73 5f 65 29 20 7b 0a 09  c_readers_e) {..
1c680 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1c690 09 7d 0a 0a 09 09 09 09 09 69 66 20 28 63 75 72  .}.......if (cur
1c6a0 72 5f 72 65 61 64 65 72 5f 6c 65 6e 20 3d 3d 20  r_reader_len == 
1c6b0 30 29 20 7b 0a 09 09 09 09 09 09 62 72 65 61 6b  0) {.......break
1c6c0 3b 0a 09 09 09 09 09 7d 0a 0a 09 09 09 09 09 69  ;......}.......i
1c6d0 66 20 28 63 75 72 72 73 6c 6f 74 20 3e 3d 20 28  f (currslot >= (
1c6e0 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1c6f0 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1c700 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1c710 20 7b 0a 09 09 09 09 09 09 43 41 43 4b 45 59 5f   {.......CACKEY_
1c720 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
1c730 75 6e 64 20 6d 6f 72 65 20 72 65 61 64 65 72 73  und more readers
1c740 20 74 68 61 6e 20 73 6c 6f 74 73 20 61 72 65 20   than slots are 
1c750 61 76 61 69 6c 61 62 6c 65 21 22 29 3b 0a 0a 09  available!");...
1c760 09 09 09 09 09 62 72 65 61 6b 3b 0a 09 09 09 09  .....break;.....
1c770 09 7d 0a 0a 09 09 09 09 09 43 41 43 4b 45 59 5f  .}.......CACKEY_
1c780 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 46 6f  DEBUG_PRINTF("Fo
1c790 75 6e 64 20 72 65 61 64 65 72 3a 20 25 73 22 2c  und reader: %s",
1c7a0 20 70 63 73 63 5f 72 65 61 64 65 72 73 29 3b 0a   pcsc_readers);.
1c7b0 0a 09 09 09 09 09 2f 2a 20 4f 6e 6c 79 20 75 70  ....../* Only up
1c7c0 64 61 74 65 20 74 68 65 20 6c 69 73 74 20 6f 66  date the list of
1c7d0 20 73 6c 6f 74 73 20 69 66 20 77 65 20 61 72 65   slots if we are
1c7e0 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
1c7f0 61 73 6b 65 64 20 73 75 70 70 6c 79 20 74 68 65  asked supply the
1c800 20 73 6c 6f 74 20 69 6e 66 6f 72 6d 61 74 69 6f   slot informatio
1c810 6e 20 2a 2f 0a 09 09 09 09 09 69 66 20 28 70 53  n */......if (pS
1c820 6c 6f 74 4c 69 73 74 29 20 7b 0a 09 09 09 09 09  lotList) {......
1c830 09 69 66 20 28 73 6c 6f 74 5f 72 65 73 65 74 29  .if (slot_reset)
1c840 20 7b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79   {........cackey
1c850 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c860 2e 61 63 74 69 76 65 20 3d 20 31 3b 0a 09 09 09  .active = 1;....
1c870 09 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ....cackey_slots
1c880 5b 63 75 72 72 73 6c 6f 74 5d 2e 69 6e 74 65 72  [currslot].inter
1c890 6e 61 6c 20 3d 20 30 3b 0a 09 09 09 09 09 09 09  nal = 0;........
1c8a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72  cackey_slots[cur
1c8b0 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 72 65 61 64  rslot].pcsc_read
1c8c0 65 72 20 3d 20 73 74 72 64 75 70 28 70 63 73 63  er = strdup(pcsc
1c8d0 5f 72 65 61 64 65 72 73 29 3b 0a 09 09 09 09 09  _readers);......
1c8e0 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  ..cackey_slots[c
1c8f0 75 72 72 73 6c 6f 74 5d 2e 70 63 73 63 5f 63 61  urrslot].pcsc_ca
1c900 72 64 5f 63 6f 6e 6e 65 63 74 65 64 20 3d 20 30  rd_connected = 0
1c910 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f  ;........cackey_
1c920 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d 2e  slots[currslot].
1c930 74 72 61 6e 73 61 63 74 69 6f 6e 5f 64 65 70 74  transaction_dept
1c940 68 20 3d 20 30 3b 0a 09 09 09 09 09 09 09 63 61  h = 0;........ca
1c950 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72 73  ckey_slots[currs
1c960 6c 6f 74 5d 2e 74 72 61 6e 73 61 63 74 69 6f 6e  lot].transaction
1c970 5f 6e 65 65 64 5f 68 77 5f 6c 6f 63 6b 20 3d 20  _need_hw_lock = 
1c980 30 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  0;........cackey
1c990 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c9a0 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73 20 3d 20 43  .token_flags = C
1c9b0 4b 46 5f 4c 4f 47 49 4e 5f 52 45 51 55 49 52 45  KF_LOGIN_REQUIRE
1c9c0 44 3b 0a 09 09 09 09 09 09 09 63 61 63 6b 65 79  D;........cackey
1c9d0 5f 73 6c 6f 74 73 5b 63 75 72 72 73 6c 6f 74 5d  _slots[currslot]
1c9e0 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a  .label = NULL;..
1c9f0 09 09 09 09 09 09 09 63 61 63 6b 65 79 5f 6d 61  .......cackey_ma
1ca00 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74 28 26 63  rk_slot_reset(&c
1ca10 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1ca20 73 6c 6f 74 5d 29 3b 0a 09 09 09 09 09 09 7d 0a  slot]);.......}.
1ca30 09 09 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  .....} else {...
1ca40 09 09 09 09 2f 2a 20 41 72 74 69 66 69 63 69 61  ..../* Artificia
1ca50 6c 6c 79 20 69 6e 63 72 65 61 73 65 20 74 68 65  lly increase the
1ca60 20 6e 75 6d 62 65 72 20 6f 66 20 61 63 74 69 76   number of activ
1ca70 65 20 73 6c 6f 74 73 20 62 79 20 77 68 61 74 20  e slots by what 
1ca80 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 63 74 69  will become acti
1ca90 76 65 20 2a 2f 0a 09 09 09 09 09 09 73 6c 6f 74  ve */.......slot
1caa0 5f 63 6f 75 6e 74 2b 2b 3b 0a 09 09 09 09 09 7d  _count++;......}
1cab0 0a 09 09 09 09 09 63 75 72 72 73 6c 6f 74 2b 2b  ......currslot++
1cac0 3b 0a 0a 09 09 09 09 09 70 63 73 63 5f 72 65 61  ;.......pcsc_rea
1cad0 64 65 72 73 20 2b 3d 20 63 75 72 72 5f 72 65 61  ders += curr_rea
1cae0 64 65 72 5f 6c 65 6e 20 2b 20 31 3b 0a 09 09 09  der_len + 1;....
1caf0 09 7d 0a 0a 09 09 09 09 66 6f 72 20 28 63 75 72  .}......for (cur
1cb00 72 73 6c 6f 74 20 3d 20 30 3b 20 63 75 72 72 73  rslot = 0; currs
1cb10 6c 6f 74 20 3c 20 28 73 69 7a 65 6f 66 28 63 61  lot < (sizeof(ca
1cb20 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73 69  ckey_slots) / si
1cb30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
1cb40 73 5b 30 5d 29 29 3b 20 63 75 72 72 73 6c 6f 74  s[0])); currslot
1cb50 2b 2b 29 20 7b 0a 09 09 09 09 09 69 66 20 28 63  ++) {......if (c
1cb60 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63 75 72 72  ackey_slots[curr
1cb70 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29 20 7b 0a  slot].active) {.
1cb80 09 09 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42  ......CACKEY_DEB
1cb90 55 47 5f 50 52 49 4e 54 46 28 22 46 6f 75 6e 64  UG_PRINTF("Found
1cba0 20 61 63 74 69 76 65 20 73 6c 6f 74 20 25 6c 75   active slot %lu
1cbb0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
1cbc0 67 29 20 63 75 72 72 73 6c 6f 74 29 3b 0a 0a 09  g) currslot);...
1cbd0 09 09 09 09 09 73 6c 6f 74 5f 63 6f 75 6e 74 2b  .....slot_count+
1cbe0 2b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 7d 0a  +;......}.....}.
1cbf0 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09  ...} else {.....
1cc00 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1cc10 4e 54 46 28 22 53 65 63 6f 6e 64 20 63 61 6c 6c  NTF("Second call
1cc20 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52 65 61   to SCardListRea
1cc30 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72 65 74  ders failed, ret
1cc40 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43 41 43  urn %s/%li", CAC
1cc50 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43 5f 53  KEY_DEBUG_FUNC_S
1cc60 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52 28 73  CARDERR_TO_STR(s
1cc70 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73  card_listreaders
1cc80 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20 73 63  _ret), (long) sc
1cc90 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72 73 5f  ard_listreaders_
1cca0 72 65 74 29 3b 0a 09 09 09 7d 0a 0a 09 09 09 66  ret);....}.....f
1ccb0 72 65 65 28 70 63 73 63 5f 72 65 61 64 65 72 73  ree(pcsc_readers
1ccc0 5f 73 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  _s);...} else {.
1ccd0 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cce0 50 52 49 4e 54 46 28 22 46 69 72 73 74 20 63 61  PRINTF("First ca
1ccf0 6c 6c 20 74 6f 20 53 43 61 72 64 4c 69 73 74 52  ll to SCardListR
1cd00 65 61 64 65 72 73 20 66 61 69 6c 65 64 2c 20 72  eaders failed, r
1cd10 65 74 75 72 6e 20 25 73 2f 25 6c 69 22 2c 20 43  eturn %s/%li", C
1cd20 41 43 4b 45 59 5f 44 45 42 55 47 5f 46 55 4e 43  ACKEY_DEBUG_FUNC
1cd30 5f 53 43 41 52 44 45 52 52 5f 54 4f 5f 53 54 52  _SCARDERR_TO_STR
1cd40 28 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65  (scard_listreade
1cd50 72 73 5f 72 65 74 29 2c 20 28 6c 6f 6e 67 29 20  rs_ret), (long) 
1cd60 73 63 61 72 64 5f 6c 69 73 74 72 65 61 64 65 72  scard_listreader
1cd70 73 5f 72 65 74 29 3b 0a 09 09 7d 0a 09 7d 0a 0a  s_ret);...}..}..
1cd80 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
1cd90 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
1cda0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
1cdb0 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
1cdc0 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
1cdd0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1cde0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e  INTF("Error.  Un
1cdf0 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  locking failed."
1ce00 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1ce10 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1ce20 0a 09 7d 0a 0a 09 69 66 20 28 70 53 6c 6f 74 4c  ..}...if (pSlotL
1ce30 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
1ce40 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 73 6c 6f  .*pulCount = slo
1ce50 74 5f 63 6f 75 6e 74 3b 0a 0a 09 09 43 41 43 4b  t_count;....CACK
1ce60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ce70 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
1ce80 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64 20 25  K (%i).  Found %
1ce90 6c 75 20 72 65 61 64 65 72 73 2c 20 62 75 74 20  lu readers, but 
1cea0 6e 6f 74 20 73 74 6f 72 69 6e 67 20 49 44 73 20  not storing IDs 
1ceb0 28 70 53 6c 6f 74 4c 69 73 74 20 3d 3d 20 4e 55  (pSlotList == NU
1cec0 4c 4c 29 22 2c 20 43 4b 52 5f 4f 4b 2c 20 28 75  LL)", CKR_OK, (u
1ced0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 6c  nsigned long) sl
1cee0 6f 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 72 65  ot_count);....re
1cef0 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d  turn(CKR_OK);..}
1cf00 0a 0a 09 63 6f 75 6e 74 20 3d 20 2a 70 75 6c 43  ...count = *pulC
1cf10 6f 75 6e 74 3b 0a 09 69 66 20 28 63 6f 75 6e 74  ount;..if (count
1cf20 20 3c 20 73 6c 6f 74 5f 63 6f 75 6e 74 29 20 7b   < slot_count) {
1cf30 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1cf40 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55  PRINTF("Error. U
1cf50 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c  ser allocated %l
1cf60 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77  u entries, but w
1cf70 65 20 68 61 76 65 20 25 6c 75 20 65 6e 74 72 69  e have %lu entri
1cf80 65 73 2e 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f  es.", count, slo
1cf90 74 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09 43 41 43  t_count);....CAC
1cfa0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1cfb0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1cfc0 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
1cfd0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1cfe0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
1cff0 4c 4c 29 3b 09 0a 09 7d 0a 0a 09 6d 75 74 65 78  LL);...}...mutex
1d000 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1d010 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b  _mutex_lock(cack
1d020 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66  ey_biglock);..if
1d030 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21   (mutex_retval !
1d040 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1d050 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d060 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61  ror.  Locking fa
1d070 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
1d080 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
1d090 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 73 6c 6f 74  RROR);..}...slot
1d0a0 5f 69 64 78 20 3d 20 30 3b 0a 09 66 6f 72 20 28  _idx = 0;..for (
1d0b0 63 75 72 72 73 6c 6f 74 20 3d 20 30 3b 20 28 63  currslot = 0; (c
1d0c0 75 72 72 73 6c 6f 74 20 3c 20 28 73 69 7a 65 6f  urrslot < (sizeo
1d0d0 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20  f(cackey_slots) 
1d0e0 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f  / sizeof(cackey_
1d0f0 73 6c 6f 74 73 5b 30 5d 29 29 29 3b 20 63 75 72  slots[0]))); cur
1d100 72 73 6c 6f 74 2b 2b 29 20 7b 0a 09 09 69 66 20  rslot++) {...if 
1d110 28 21 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 63  (!cackey_slots[c
1d120 75 72 72 73 6c 6f 74 5d 2e 61 63 74 69 76 65 29  urrslot].active)
1d130 20 7b 0a 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a   {....continue;.
1d140 09 09 7d 0a 0a 09 09 69 66 20 28 73 6c 6f 74 5f  ..}....if (slot_
1d150 69 64 78 20 3e 3d 20 63 6f 75 6e 74 29 20 7b 0a  idx >= count) {.
1d160 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1d170 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 55  PRINTF("Error. U
1d180 73 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 25 6c  ser allocated %l
1d190 75 20 65 6e 74 72 69 65 73 2c 20 62 75 74 20 77  u entries, but w
1d1a0 65 20 6a 75 73 74 20 74 72 69 65 64 20 74 6f 20  e just tried to 
1d1b0 77 72 69 74 65 20 74 6f 20 74 68 65 20 25 6c 75  write to the %lu
1d1c0 20 69 6e 64 65 78 20 2d 2d 20 69 67 6e 6f 72 69   index -- ignori
1d1d0 6e 67 22 2c 20 63 6f 75 6e 74 2c 20 73 6c 6f 74  ng", count, slot
1d1e0 5f 69 64 78 29 3b 0a 0a 09 09 09 63 6f 6e 74 69  _idx);.....conti
1d1f0 6e 75 65 3b 0a 09 09 7d 0a 0a 09 09 70 53 6c 6f  nue;...}....pSlo
1d200 74 4c 69 73 74 5b 73 6c 6f 74 5f 69 64 78 5d 20  tList[slot_idx] 
1d210 3d 20 63 75 72 72 73 6c 6f 74 3b 0a 09 09 73 6c  = currslot;...sl
1d220 6f 74 5f 69 64 78 2b 2b 3b 0a 09 7d 0a 0a 09 6d  ot_idx++;..}...m
1d230 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
1d240 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
1d250 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
1d260 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
1d270 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
1d280 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1d290 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
1d2a0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
1d2b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
1d2c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
1d2d0 7d 0a 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20  }...*pulCount = 
1d2e0 73 6c 6f 74 5f 63 6f 75 6e 74 3b 0a 0a 09 43 41  slot_count;...CA
1d2f0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d300 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1d310 5f 4f 4b 20 28 25 69 29 2e 20 20 46 6f 75 6e 64  _OK (%i).  Found
1d320 20 25 6c 75 20 72 65 61 64 65 72 73 2e 22 2c 20   %lu readers.", 
1d330 43 4b 52 5f 4f 4b 2c 20 28 75 6e 73 69 67 6e 65  CKR_OK, (unsigne
1d340 64 20 6c 6f 6e 67 29 20 73 6c 6f 74 5f 63 6f 75  d long) slot_cou
1d350 6e 74 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  nt);...return(CK
1d360 52 5f 4f 4b 29 3b 0a 0a 09 74 6f 6b 65 6e 50 72  R_OK);...tokenPr
1d370 65 73 65 6e 74 20 3d 20 74 6f 6b 65 6e 50 72 65  esent = tokenPre
1d380 73 65 6e 74 3b 20 2f 2a 20 53 75 70 72 65 73 73  sent; /* Supress
1d390 20 75 6e 75 73 65 64 20 76 61 72 69 61 62 6c 65   unused variable
1d3a0 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a 0a 43   warning */.}..C
1d3b0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1d3c0 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 53 6c  N(CK_RV, C_GetSl
1d3d0 6f 74 49 6e 66 6f 29 28 43 4b 5f 53 4c 4f 54 5f  otInfo)(CK_SLOT_
1d3e0 49 44 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 53 4c  ID slotID, CK_SL
1d3f0 4f 54 5f 49 4e 46 4f 5f 50 54 52 20 70 49 6e 66  OT_INFO_PTR pInf
1d400 6f 29 20 7b 0a 09 73 74 61 74 69 63 20 43 4b 5f  o) {..static CK_
1d410 55 54 46 38 43 48 41 52 20 73 6c 6f 74 44 65 73  UTF8CHAR slotDes
1d420 63 72 69 70 74 69 6f 6e 5b 5d 20 3d 20 22 43 41  cription[] = "CA
1d430 43 4b 65 79 20 53 6c 6f 74 22 3b 0a 09 69 6e 74  CKey Slot";..int
1d440 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09   mutex_retval;..
1d450 69 6e 74 20 62 79 74 65 73 5f 74 6f 5f 63 6f 70  int bytes_to_cop
1d460 79 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  y;...CACKEY_DEBU
1d470 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1d480 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
1d490 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1d4a0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1d4b0 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
1d4c0 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1d4d0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1d4e0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1d4f0 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1d500 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1d510 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d520 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1d530 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1d540 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1d550 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1d560 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
1d570 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
1d580 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
1d590 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1d5a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1d5b0 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
1d5c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1d5d0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1d5e0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1d5f0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
1d600 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
1d610 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
1d620 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1d630 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1d640 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1d650 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1d660 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d670 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1d680 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1d690 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1d6a0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1d6b0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1d6c0 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1d6d0 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1d6e0 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1d6f0 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
1d700 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1d710 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1d720 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1d730 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1d740 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
1d750 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
1d760 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
1d770 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1d780 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1d790 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1d7a0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1d7b0 09 7d 0a 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67  .}...pInfo->flag
1d7c0 73 20 3d 20 43 4b 46 5f 48 57 5f 53 4c 4f 54 3b  s = CKF_HW_SLOT;
1d7d0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
1d7e0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 69 6e 74  lots[slotID].int
1d7f0 65 72 6e 61 6c 29 20 7b 0a 09 09 70 49 6e 66 6f  ernal) {...pInfo
1d800 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 52  ->flags |= CKF_R
1d810 45 4d 4f 56 41 42 4c 45 5f 44 45 56 49 43 45 3b  EMOVABLE_DEVICE;
1d820 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1d830 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
1d840 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1d850 74 49 44 5d 29 20 3d 3d 20 43 41 43 4b 45 59 5f  tID]) == CACKEY_
1d860 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
1d870 45 4e 54 29 20 7b 0a 09 09 70 49 6e 66 6f 2d 3e  ENT) {...pInfo->
1d880 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 54 4f 4b  flags |= CKF_TOK
1d890 45 4e 5f 50 52 45 53 45 4e 54 3b 0a 09 7d 0a 0a  EN_PRESENT;..}..
1d8a0 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 20 3d  .bytes_to_copy =
1d8b0 20 73 74 72 6c 65 6e 28 63 61 63 6b 65 79 5f 73   strlen(cackey_s
1d8c0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 70 63 73  lots[slotID].pcs
1d8d0 63 5f 72 65 61 64 65 72 29 3b 0a 09 69 66 20 28  c_reader);..if (
1d8e0 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61  sizeof(pInfo->ma
1d8f0 6e 75 66 61 63 74 75 72 65 72 49 44 29 20 3c 20  nufacturerID) < 
1d900 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79 29 20 7b  bytes_to_copy) {
1d910 0a 09 09 62 79 74 65 73 5f 74 6f 5f 63 6f 70 79  ...bytes_to_copy
1d920 20 3d 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d   = sizeof(pInfo-
1d930 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 29  >manufacturerID)
1d940 3b 0a 09 7d 0a 09 6d 65 6d 63 70 79 28 70 49 6e  ;..}..memcpy(pIn
1d950 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1d960 49 44 2c 20 63 61 63 6b 65 79 5f 73 6c 6f 74 73  ID, cackey_slots
1d970 5b 73 6c 6f 74 49 44 5d 2e 70 63 73 63 5f 72 65  [slotID].pcsc_re
1d980 61 64 65 72 2c 20 62 79 74 65 73 5f 74 6f 5f 63  ader, bytes_to_c
1d990 6f 70 79 29 3b 0a 0a 09 6d 75 74 65 78 5f 72 65  opy);...mutex_re
1d9a0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
1d9b0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
1d9c0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
1d9d0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
1d9e0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
1d9f0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1da00 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
1da10 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
1da20 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
1da30 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 6d 65 6d  ERROR);..}...mem
1da40 73 65 74 28 70 49 6e 66 6f 2d 3e 73 6c 6f 74 44  set(pInfo->slotD
1da50 65 73 63 72 69 70 74 69 6f 6e 2c 20 27 20 27 2c  escription, ' ',
1da60 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73   sizeof(pInfo->s
1da70 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e 29 29  lotDescription))
1da80 3b 0a 09 6d 65 6d 63 70 79 28 70 49 6e 66 6f 2d  ;..memcpy(pInfo-
1da90 3e 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f 6e  >slotDescription
1daa0 2c 20 73 6c 6f 74 44 65 73 63 72 69 70 74 69 6f  , slotDescriptio
1dab0 6e 2c 20 73 69 7a 65 6f 66 28 73 6c 6f 74 44 65  n, sizeof(slotDe
1dac0 73 63 72 69 70 74 69 6f 6e 29 20 2d 20 31 29 3b  scription) - 1);
1dad0 0a 0a 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d  ...memset(pInfo-
1dae0 3e 6d 61 6e 75 66 61 63 74 75 72 65 72 49 44 2c  >manufacturerID,
1daf0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1db00 66 6f 2d 3e 6d 61 6e 75 66 61 63 74 75 72 65 72  fo->manufacturer
1db10 49 44 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68  ID));...pInfo->h
1db20 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
1db30 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  ajor = (cackey_g
1db40 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31  etversion() >> 1
1db50 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
1db60 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
1db70 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b  on.minor = (cack
1db80 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1db90 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1dba0 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1dbb0 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30  ersion.major = 0
1dbc0 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  x00;..pInfo->fir
1dbd0 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  mwareVersion.min
1dbe0 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 43 41 43  or = 0x00;...CAC
1dbf0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1dc00 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
1dc10 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
1dc20 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1dc30 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
1dc40 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
1dc50 2c 20 43 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f  , C_GetTokenInfo
1dc60 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f  )(CK_SLOT_ID slo
1dc70 74 49 44 2c 20 43 4b 5f 54 4f 4b 45 4e 5f 49 4e  tID, CK_TOKEN_IN
1dc80 46 4f 5f 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a  FO_PTR pInfo) {.
1dc90 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1dca0 48 41 52 20 6d 61 6e 75 66 61 63 74 75 72 65 72  HAR manufacturer
1dcb0 49 44 5b 5d 20 3d 20 22 55 2e 53 2e 20 47 6f 76  ID[] = "U.S. Gov
1dcc0 65 72 6e 6d 65 6e 74 22 3b 0a 09 73 74 61 74 69  ernment";..stati
1dcd0 63 20 43 4b 5f 55 54 46 38 43 48 41 52 20 64 65  c CK_UTF8CHAR de
1dce0 66 61 75 6c 74 4c 61 62 65 6c 5b 5d 20 3d 20 22  faultLabel[] = "
1dcf0 55 6e 6b 6e 6f 77 6e 20 54 6f 6b 65 6e 22 3b 0a  Unknown Token";.
1dd00 09 73 74 61 74 69 63 20 43 4b 5f 55 54 46 38 43  .static CK_UTF8C
1dd10 48 41 52 20 6d 6f 64 65 6c 5b 5d 20 3d 20 22 43  HAR model[] = "C
1dd20 41 43 20 54 6f 6b 65 6e 22 3b 0a 09 73 74 72 75  AC Token";..stru
1dd30 63 74 20 63 61 63 6b 65 79 5f 70 63 73 63 5f 69  ct cackey_pcsc_i
1dd40 64 65 6e 74 69 74 79 20 2a 70 63 73 63 5f 69 64  dentity *pcsc_id
1dd50 65 6e 74 69 74 69 65 73 3b 0a 09 75 6e 73 69 67  entities;..unsig
1dd60 6e 65 64 20 6c 6f 6e 67 20 6e 75 6d 5f 63 65 72  ned long num_cer
1dd70 74 73 3b 0a 09 73 73 69 7a 65 5f 74 20 6c 61 62  ts;..ssize_t lab
1dd80 65 6c 5f 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74  el_ret;..int mut
1dd90 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69 6e 74 20  ex_retval;..int 
1dda0 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65  use_default_labe
1ddb0 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
1ddc0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
1ddd0 2e 22 29 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f  .");...if (pInfo
1dde0 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41   == NULL) {...CA
1ddf0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1de00 46 28 22 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20  F("Error. pInfo 
1de10 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72  is NULL.");....r
1de20 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
1de30 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
1de40 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1de50 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1de60 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1de70 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1de80 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1de90 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1dea0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1deb0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 73  ZED);..}...if (s
1dec0 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
1ded0 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
1dee0 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
1def0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1df00 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
1df10 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1df20 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
1df30 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
1df40 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
1df50 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
1df60 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
1df70 72 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49  rn(CKR_SLOT_ID_I
1df80 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75  NVALID);..}...mu
1df90 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
1dfa0 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
1dfb0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1dfc0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1dfd0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1dfe0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1dff0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
1e000 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
1e010 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
1e020 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
1e030 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b  f (cackey_slots[
1e040 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d  slotID].active =
1e050 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  = 0) {...CACKEY_
1e060 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1e070 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f  ror. Invalid slo
1e080 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c 75  t requested (%lu
1e090 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72  ), slot not curr
1e0a0 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73  ently active", s
1e0b0 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65  lotID);....cacke
1e0c0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1e0d0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1e0e0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1e0f0 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1e100 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
1e110 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26 63  token_present(&c
1e120 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74  ackey_slots[slot
1e130 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f 50  ID]) != CACKEY_P
1e140 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53 45  CSC_S_TOKENPRESE
1e150 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  NT) {...CACKEY_D
1e160 45 42 55 47 5f 50 52 49 4e 54 46 28 22 4e 6f 20  EBUG_PRINTF("No 
1e170 74 6f 6b 65 6e 20 69 73 20 70 72 65 73 65 6e 74  token is present
1e180 20 69 6e 20 73 6c 6f 74 49 44 20 3d 20 25 6c 75   in slotID = %lu
1e190 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
1e1a0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
1e1b0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
1e1c0 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
1e1d0 52 5f 54 4f 4b 45 4e 5f 4e 4f 54 5f 50 52 45 53  R_TOKEN_NOT_PRES
1e1e0 45 4e 54 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  ENT);..}...mutex
1e1f0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
1e200 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
1e210 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
1e220 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
1e230 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
1e240 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1e250 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
1e260 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
1e270 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
1e280 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
1e290 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 6f 6b  /* Determine tok
1e2a0 65 6e 20 6c 61 62 65 6c 20 66 72 6f 6d 20 63 65  en label from ce
1e2b0 72 74 69 66 69 63 61 74 65 73 20 2a 2f 0a 09 6d  rtificates */..m
1e2c0 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 6c 61 62  emset(pInfo->lab
1e2d0 65 6c 2c 20 27 20 27 2c 20 73 69 7a 65 6f 66 28  el, ' ', sizeof(
1e2e0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a  pInfo->label));.
1e2f0 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62  .use_default_lab
1e300 65 6c 20 3d 20 31 3b 0a 0a 09 69 66 20 28 63 61  el = 1;...if (ca
1e310 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49  ckey_slots[slotI
1e320 44 5d 2e 6c 61 62 65 6c 20 3d 3d 20 4e 55 4c 4c  D].label == NULL
1e330 29 20 7b 0a 09 09 70 63 73 63 5f 69 64 65 6e 74  ) {...pcsc_ident
1e340 69 74 69 65 73 20 3d 20 63 61 63 6b 65 79 5f 72  ities = cackey_r
1e350 65 61 64 5f 63 65 72 74 73 28 26 63 61 63 6b 65  ead_certs(&cacke
1e360 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
1e370 20 4e 55 4c 4c 2c 20 26 6e 75 6d 5f 63 65 72 74   NULL, &num_cert
1e380 73 29 3b 0a 09 09 69 66 20 28 70 63 73 63 5f 69  s);...if (pcsc_i
1e390 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55 4c  dentities != NUL
1e3a0 4c 29 20 7b 0a 09 09 09 69 66 20 28 6e 75 6d 5f  L) {....if (num_
1e3b0 63 65 72 74 73 20 3e 20 30 29 20 7b 0a 09 09 09  certs > 0) {....
1e3c0 09 6c 61 62 65 6c 5f 72 65 74 20 3d 20 63 61 63  .label_ret = cac
1e3d0 6b 65 79 5f 70 63 73 63 5f 69 64 65 6e 74 69 74  key_pcsc_identit
1e3e0 79 5f 74 6f 5f 6c 61 62 65 6c 28 70 63 73 63 5f  y_to_label(pcsc_
1e3f0 69 64 65 6e 74 69 74 69 65 73 2c 20 70 49 6e 66  identities, pInf
1e400 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66  o->label, sizeof
1e410 28 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b  (pInfo->label));
1e420 0a 09 09 09 09 69 66 20 28 6c 61 62 65 6c 5f 72  .....if (label_r
1e430 65 74 20 3e 20 30 29 20 7b 0a 09 09 09 09 09 75  et > 0) {......u
1e440 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62 65 6c  se_default_label
1e450 20 3d 20 30 3b 0a 0a 09 09 09 09 09 63 61 63 6b   = 0;.......cack
1e460 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
1e470 2e 6c 61 62 65 6c 20 3d 20 6d 61 6c 6c 6f 63 28  .label = malloc(
1e480 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61  sizeof(pInfo->la
1e490 62 65 6c 29 29 3b 0a 0a 09 09 09 09 09 6d 65 6d  bel));.......mem
1e4a0 63 70 79 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  cpy(cackey_slots
1e4b0 5b 73 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 2c 20  [slotID].label, 
1e4c0 70 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 73 69  pInfo->label, si
1e4d0 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6c 61 62 65  zeof(pInfo->labe
1e4e0 6c 29 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  l));.....}....}.
1e4f0 0a 09 09 09 63 61 63 6b 65 79 5f 66 72 65 65 5f  ....cackey_free_
1e500 63 65 72 74 73 28 70 63 73 63 5f 69 64 65 6e 74  certs(pcsc_ident
1e510 69 74 69 65 73 2c 20 6e 75 6d 5f 63 65 72 74 73  ities, num_certs
1e520 2c 20 31 29 3b 0a 09 09 7d 0a 09 7d 20 65 6c 73  , 1);...}..} els
1e530 65 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70 49 6e  e {...memcpy(pIn
1e540 66 6f 2d 3e 6c 61 62 65 6c 2c 20 63 61 63 6b 65  fo->label, cacke
1e550 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1e560 6c 61 62 65 6c 2c 20 73 69 7a 65 6f 66 28 70 49  label, sizeof(pI
1e570 6e 66 6f 2d 3e 6c 61 62 65 6c 29 29 3b 0a 0a 09  nfo->label));...
1e580 09 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62  .use_default_lab
1e590 65 6c 20 3d 20 30 3b 0a 09 7d 0a 0a 09 69 66 20  el = 0;..}...if 
1e5a0 28 75 73 65 5f 64 65 66 61 75 6c 74 5f 6c 61 62  (use_default_lab
1e5b0 65 6c 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 70  el) {...memcpy(p
1e5c0 49 6e 66 6f 2d 3e 6c 61 62 65 6c 2c 20 64 65 66  Info->label, def
1e5d0 61 75 6c 74 4c 61 62 65 6c 2c 20 73 69 7a 65 6f  aultLabel, sizeo
1e5e0 66 28 64 65 66 61 75 6c 74 4c 61 62 65 6c 29 20  f(defaultLabel) 
1e5f0 2d 20 31 29 3b 0a 09 7d 0a 0a 09 6d 65 6d 73 65  - 1);..}...memse
1e600 74 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75 66 61 63  t(pInfo->manufac
1e610 74 75 72 65 72 49 44 2c 20 27 20 27 2c 20 73 69  turerID, ' ', si
1e620 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 6d 61 6e 75  zeof(pInfo->manu
1e630 66 61 63 74 75 72 65 72 49 44 29 29 3b 0a 09 6d  facturerID));..m
1e640 65 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 61 6e  emcpy(pInfo->man
1e650 75 66 61 63 74 75 72 65 72 49 44 2c 20 6d 61 6e  ufacturerID, man
1e660 75 66 61 63 74 75 72 65 72 49 44 2c 20 73 69 7a  ufacturerID, siz
1e670 65 6f 66 28 6d 61 6e 75 66 61 63 74 75 72 65 72  eof(manufacturer
1e680 49 44 29 20 2d 20 31 29 3b 0a 0a 09 6d 65 6d 73  ID) - 1);...mems
1e690 65 74 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65 6c 2c  et(pInfo->model,
1e6a0 20 27 20 27 2c 20 73 69 7a 65 6f 66 28 70 49 6e   ' ', sizeof(pIn
1e6b0 66 6f 2d 3e 6d 6f 64 65 6c 29 29 3b 0a 09 6d 65  fo->model));..me
1e6c0 6d 63 70 79 28 70 49 6e 66 6f 2d 3e 6d 6f 64 65  mcpy(pInfo->mode
1e6d0 6c 2c 20 6d 6f 64 65 6c 2c 20 73 69 7a 65 6f 66  l, model, sizeof
1e6e0 28 6d 6f 64 65 6c 29 20 2d 20 31 29 3b 0a 0a 09  (model) - 1);...
1e6f0 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 73 65  memset(pInfo->se
1e700 72 69 61 6c 4e 75 6d 62 65 72 2c 20 27 20 27 2c  rialNumber, ' ',
1e710 20 73 69 7a 65 6f 66 28 70 49 6e 66 6f 2d 3e 73   sizeof(pInfo->s
1e720 65 72 69 61 6c 4e 75 6d 62 65 72 29 29 3b 0a 0a  erialNumber));..
1e730 09 6d 65 6d 73 65 74 28 70 49 6e 66 6f 2d 3e 75  .memset(pInfo->u
1e740 74 63 54 69 6d 65 2c 20 27 20 27 2c 20 73 69 7a  tcTime, ' ', siz
1e750 65 6f 66 28 70 49 6e 66 6f 2d 3e 75 74 63 54 69  eof(pInfo->utcTi
1e760 6d 65 29 29 3b 0a 0a 09 70 49 6e 66 6f 2d 3e 68  me));...pInfo->h
1e770 61 72 64 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d  ardwareVersion.m
1e780 61 6a 6f 72 20 3d 20 28 63 61 63 6b 65 79 5f 67  ajor = (cackey_g
1e790 65 74 76 65 72 73 69 6f 6e 28 29 20 3e 3e 20 31  etversion() >> 1
1e7a0 36 29 20 26 20 30 78 66 66 3b 0a 09 70 49 6e 66  6) & 0xff;..pInf
1e7b0 6f 2d 3e 68 61 72 64 77 61 72 65 56 65 72 73 69  o->hardwareVersi
1e7c0 6f 6e 2e 6d 69 6e 6f 72 20 3d 20 28 63 61 63 6b  on.minor = (cack
1e7d0 65 79 5f 67 65 74 76 65 72 73 69 6f 6e 28 29 20  ey_getversion() 
1e7e0 3e 3e 20 38 29 20 26 20 30 78 66 66 3b 0a 0a 09  >> 8) & 0xff;...
1e7f0 70 49 6e 66 6f 2d 3e 66 69 72 6d 77 61 72 65 56  pInfo->firmwareV
1e800 65 72 73 69 6f 6e 2e 6d 61 6a 6f 72 20 3d 20 30  ersion.major = 0
1e810 78 30 30 3b 0a 09 70 49 6e 66 6f 2d 3e 66 69 72  x00;..pInfo->fir
1e820 6d 77 61 72 65 56 65 72 73 69 6f 6e 2e 6d 69 6e  mwareVersion.min
1e830 6f 72 20 3d 20 30 78 30 30 3b 0a 0a 09 70 49 6e  or = 0x00;...pIn
1e840 66 6f 2d 3e 66 6c 61 67 73 20 3d 20 43 4b 46 5f  fo->flags = CKF_
1e850 57 52 49 54 45 5f 50 52 4f 54 45 43 54 45 44 20  WRITE_PROTECTED 
1e860 7c 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 49  | CKF_USER_PIN_I
1e870 4e 49 54 49 41 4c 49 5a 45 44 20 7c 20 43 4b 46  NITIALIZED | CKF
1e880 5f 54 4f 4b 45 4e 5f 49 4e 49 54 49 41 4c 49 5a  _TOKEN_INITIALIZ
1e890 45 44 20 7c 20 63 61 63 6b 65 79 5f 73 6c 6f 74  ED | cackey_slot
1e8a0 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
1e8b0 66 6c 61 67 73 3b 0a 0a 09 70 49 6e 66 6f 2d 3e  flags;...pInfo->
1e8c0 75 6c 4d 61 78 53 65 73 73 69 6f 6e 43 6f 75 6e  ulMaxSessionCoun
1e8d0 74 20 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b  t = (sizeof(cack
1e8e0 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
1e8f0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
1e900 73 69 6f 6e 73 5b 30 5d 29 29 20 2d 20 31 3b 0a  sions[0])) - 1;.
1e910 09 70 49 6e 66 6f 2d 3e 75 6c 53 65 73 73 69 6f  .pInfo->ulSessio
1e920 6e 43 6f 75 6e 74 20 3d 20 43 4b 5f 55 4e 41 56  nCount = CK_UNAV
1e930 41 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54  AILABLE_INFORMAT
1e940 49 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 4d  ION;..pInfo->ulM
1e950 61 78 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74  axRwSessionCount
1e960 20 3d 20 30 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c   = 0;..pInfo->ul
1e970 52 77 53 65 73 73 69 6f 6e 43 6f 75 6e 74 20 3d  RwSessionCount =
1e980 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f   CK_UNAVAILABLE_
1e990 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49  INFORMATION;..pI
1e9a0 6e 66 6f 2d 3e 75 6c 4d 61 78 50 69 6e 4c 65 6e  nfo->ulMaxPinLen
1e9b0 20 3d 20 31 32 38 3b 0a 09 70 49 6e 66 6f 2d 3e   = 128;..pInfo->
1e9c0 75 6c 4d 69 6e 50 69 6e 4c 65 6e 20 3d 20 30 3b  ulMinPinLen = 0;
1e9d0 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f 74 61 6c  ..pInfo->ulTotal
1e9e0 50 75 62 6c 69 63 4d 65 6d 6f 72 79 20 3d 20 43  PublicMemory = C
1e9f0 4b 5f 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e  K_UNAVAILABLE_IN
1ea00 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09 70 49 6e 66  FORMATION;..pInf
1ea10 6f 2d 3e 75 6c 46 72 65 65 50 75 62 6c 69 63 4d  o->ulFreePublicM
1ea20 65 6d 6f 72 79 20 3d 20 43 4b 5f 55 4e 41 56 41  emory = CK_UNAVA
1ea30 49 4c 41 42 4c 45 5f 49 4e 46 4f 52 4d 41 54 49  ILABLE_INFORMATI
1ea40 4f 4e 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 54 6f  ON;..pInfo->ulTo
1ea50 74 61 6c 50 72 69 76 61 74 65 4d 65 6d 6f 72 79  talPrivateMemory
1ea60 20 3d 20 43 4b 5f 55 4e 41 56 41 49 4c 41 42 4c   = CK_UNAVAILABL
1ea70 45 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 3b 0a 09  E_INFORMATION;..
1ea80 70 49 6e 66 6f 2d 3e 75 6c 46 72 65 65 50 72 69  pInfo->ulFreePri
1ea90 76 61 74 65 4d 65 6d 6f 72 79 20 3d 20 43 4b 5f  vateMemory = CK_
1eaa0 55 4e 41 56 41 49 4c 41 42 4c 45 5f 49 4e 46 4f  UNAVAILABLE_INFO
1eab0 52 4d 41 54 49 4f 4e 3b 0a 0a 09 43 41 43 4b 45  RMATION;...CACKE
1eac0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1ead0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
1eae0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
1eaf0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
1eb00 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
1eb10 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1eb20 43 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65  C_WaitForSlotEve
1eb30 6e 74 29 28 43 4b 5f 46 4c 41 47 53 20 66 6c 61  nt)(CK_FLAGS fla
1eb40 67 73 2c 20 43 4b 5f 53 4c 4f 54 5f 49 44 5f 50  gs, CK_SLOT_ID_P
1eb50 54 52 20 70 53 6c 6f 74 49 44 2c 20 43 4b 5f 56  TR pSlotID, CK_V
1eb60 4f 49 44 5f 50 54 52 20 70 52 65 73 65 72 76 65  OID_PTR pReserve
1eb70 64 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  d) {..CACKEY_DEB
1eb80 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
1eb90 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 52 65 73  d.");...if (pRes
1eba0 65 72 76 65 64 20 21 3d 20 4e 55 4c 4c 29 20 7b  erved != NULL) {
1ebb0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ebc0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70  PRINTF("Error. p
1ebd0 52 65 73 65 72 76 65 64 20 69 73 20 6e 6f 74 20  Reserved is not 
1ebe0 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
1ebf0 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
1ec00 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
1ec10 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
1ec20 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
1ec30 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
1ec40 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
1ec50 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
1ec60 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
1ec70 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
1ec80 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 58 58 58 3a 20  );..}.../* XXX: 
1ec90 54 4f 44 4f 3a 20 49 6d 70 6c 65 6d 65 6e 74 20  TODO: Implement 
1eca0 74 68 69 73 2e 2e 2e 20 2a 2f 0a 09 43 41 43 4b  this... */..CACK
1ecb0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ecc0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
1ecd0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
1ece0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
1ecf0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
1ed00 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
1ed10 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
1ed20 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
1ed30 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
1ed40 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
1ed50 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 29  etMechanismList)
1ed60 28 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74  (CK_SLOT_ID slot
1ed70 49 44 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  ID, CK_MECHANISM
1ed80 5f 54 59 50 45 5f 50 54 52 20 70 4d 65 63 68 61  _TYPE_PTR pMecha
1ed90 6e 69 73 6d 4c 69 73 74 2c 20 43 4b 5f 55 4c 4f  nismList, CK_ULO
1eda0 4e 47 5f 50 54 52 20 70 75 6c 43 6f 75 6e 74 29  NG_PTR pulCount)
1edb0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
1edc0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
1edd0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
1ede0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1edf0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ee00 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1ee10 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1ee20 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1ee30 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1ee40 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1ee50 0a 09 69 66 20 28 70 75 6c 43 6f 75 6e 74 20 3d  ..if (pulCount =
1ee60 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b  = NULL) {...CACK
1ee70 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1ee80 22 45 72 72 6f 72 2e 20 20 70 75 6c 43 6f 75 6e  "Error.  pulCoun
1ee90 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  t is NULL.");...
1eea0 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
1eeb0 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
1eec0 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 4c  .if (pMechanismL
1eed0 69 73 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ist == NULL) {..
1eee0 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31 3b 0a  .*pulCount = 1;.
1eef0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1ef00 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
1ef10 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20  g CKR_OK (%i)", 
1ef20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
1ef30 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
1ef40 09 69 66 20 28 2a 70 75 6c 43 6f 75 6e 74 20 3c  .if (*pulCount <
1ef50 20 31 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   1) {...CACKEY_D
1ef60 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
1ef70 6f 72 2e 20 20 42 75 66 66 65 72 20 74 6f 6f 20  or.  Buffer too 
1ef80 73 6d 61 6c 6c 2e 22 29 3b 0a 0a 09 09 72 65 74  small.");....ret
1ef90 75 72 6e 28 43 4b 52 5f 42 55 46 46 45 52 5f 54  urn(CKR_BUFFER_T
1efa0 4f 4f 5f 53 4d 41 4c 4c 29 3b 0a 09 7d 0a 0a 09  OO_SMALL);..}...
1efb0 70 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 5b 30  pMechanismList[0
1efc0 5d 20 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53  ] = CKM_RSA_PKCS
1efd0 3b 0a 09 2a 70 75 6c 43 6f 75 6e 74 20 3d 20 31  ;..*pulCount = 1
1efe0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
1eff0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
1f000 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c  ng CKR_OK (%i)",
1f010 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75   CKR_OK);...retu
1f020 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43  rn(CKR_OK);.}..C
1f030 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1f040 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 4d 65  N(CK_RV, C_GetMe
1f050 63 68 61 6e 69 73 6d 49 6e 66 6f 29 28 43 4b 5f  chanismInfo)(CK_
1f060 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 2c 20  SLOT_ID slotID, 
1f070 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 54 59 50  CK_MECHANISM_TYP
1f080 45 20 74 79 70 65 2c 20 43 4b 5f 4d 45 43 48 41  E type, CK_MECHA
1f090 4e 49 53 4d 5f 49 4e 46 4f 5f 50 54 52 20 70 49  NISM_INFO_PTR pI
1f0a0 6e 66 6f 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  nfo) {..int mute
1f0b0 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b  x_retval;...CACK
1f0c0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f0d0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
1f0e0 20 28 70 49 6e 66 6f 20 3d 3d 20 4e 55 4c 4c 29   (pInfo == NULL)
1f0f0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1f100 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1f110 20 70 49 6e 66 6f 20 69 73 20 4e 55 4c 4c 2e 22   pInfo is NULL."
1f120 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f130 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
1f140 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
1f150 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
1f160 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f170 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f180 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
1f190 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1f1a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
1f1b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
1f1c0 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
1f1d0 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
1f1e0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
1f1f0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
1f200 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
1f210 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1f220 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1f230 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
1f240 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
1f250 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
1f260 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
1f270 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c  ...return(CKR_SL
1f280 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a  OT_ID_INVALID);.
1f290 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
1f2a0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
1f2b0 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  _lock(cackey_big
1f2c0 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65  lock);..if (mute
1f2d0 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b  x_retval != 0) {
1f2e0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
1f2f0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
1f300 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22  Locking failed."
1f310 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
1f320 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
1f330 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79  ..}...if (cackey
1f340 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61  _slots[slotID].a
1f350 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09  ctive == 0) {...
1f360 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f370 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61  NTF("Error. Inva
1f380 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74  lid slot request
1f390 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e  ed (%lu), slot n
1f3a0 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ot currently act
1f3b0 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  ive", slotID);..
1f3c0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
1f3d0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
1f3e0 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e  lock);....return
1f3f0 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56  (CKR_SLOT_ID_INV
1f400 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65  ALID);..}...mute
1f410 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
1f420 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
1f430 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
1f440 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
1f450 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
1f460 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f470 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
1f480 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
1f490 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
1f4a0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
1f4b0 09 73 77 69 74 63 68 20 28 74 79 70 65 29 20 7b  .switch (type) {
1f4c0 0a 09 09 63 61 73 65 20 43 4b 4d 5f 52 53 41 5f  ...case CKM_RSA_
1f4d0 50 4b 43 53 3a 0a 09 09 09 70 49 6e 66 6f 2d 3e  PKCS:....pInfo->
1f4e0 75 6c 4d 69 6e 4b 65 79 53 69 7a 65 20 3d 20 35  ulMinKeySize = 5
1f4f0 31 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 75 6c  12;....pInfo->ul
1f500 4d 61 78 4b 65 79 53 69 7a 65 20 3d 20 38 31 39  MaxKeySize = 819
1f510 32 3b 0a 09 09 09 70 49 6e 66 6f 2d 3e 66 6c 61  2;....pInfo->fla
1f520 67 73 20 3d 20 43 4b 46 5f 48 57 20 7c 20 43 4b  gs = CKF_HW | CK
1f530 46 5f 45 4e 43 52 59 50 54 20 7c 20 43 4b 46 5f  F_ENCRYPT | CKF_
1f540 44 45 43 52 59 50 54 20 7c 20 43 4b 46 5f 53 49  DECRYPT | CKF_SI
1f550 47 4e 20 7c 20 43 4b 46 5f 56 45 52 49 46 59 3b  GN | CKF_VERIFY;
1f560 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09  ....break;..}...
1f570 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f580 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
1f590 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
1f5a0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
1f5b0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 20 57 65  KR_OK);.}../* We
1f5c0 20 64 6f 6e 27 74 20 73 75 70 70 6f 72 74 20 74   don't support t
1f5d0 68 69 73 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 43  his method. */.C
1f5e0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
1f5f0 4e 28 43 4b 5f 52 56 2c 20 43 5f 49 6e 69 74 54  N(CK_RV, C_InitT
1f600 6f 6b 65 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44  oken)(CK_SLOT_ID
1f610 20 73 6c 6f 74 49 44 2c 20 43 4b 5f 55 54 46 38   slotID, CK_UTF8
1f620 43 48 41 52 5f 50 54 52 20 70 50 69 6e 2c 20 43  CHAR_PTR pPin, C
1f630 4b 5f 55 4c 4f 4e 47 20 75 6c 50 69 6e 4c 65 6e  K_ULONG ulPinLen
1f640 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50 54  , CK_UTF8CHAR_PT
1f650 52 20 70 4c 61 62 65 6c 29 20 7b 0a 09 43 41 43  R pLabel) {..CAC
1f660 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
1f670 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
1f680 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
1f690 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
1f6a0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
1f6b0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
1f6c0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
1f6d0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
1f6e0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
1f6f0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ZED);..}...CACKE
1f700 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
1f710 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 54 4f  Returning CKR_TO
1f720 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45 43  KEN_WRITE_PROTEC
1f730 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 54  TED (%i)", CKR_T
1f740 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f 54 45  OKEN_WRITE_PROTE
1f750 43 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  CTED);...return(
1f760 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f  CKR_TOKEN_WRITE_
1f770 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d 0a 0a 2f  PROTECTED);.}../
1f780 2a 20 57 65 20 64 6f 6e 27 74 20 73 75 70 70 6f  * We don't suppo
1f790 72 74 20 74 68 69 73 20 6d 65 74 68 6f 64 2e 20  rt this method. 
1f7a0 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  */.CK_DEFINE_FUN
1f7b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 49  CTION(CK_RV, C_I
1f7c0 6e 69 74 50 49 4e 29 28 43 4b 5f 53 45 53 53 49  nitPIN)(CK_SESSI
1f7d0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
1f7e0 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f  on, CK_UTF8CHAR_
1f7f0 50 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f  PTR pPin, CK_ULO
1f800 4e 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09  NG ulPinLen) {..
1f810 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
1f820 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
1f830 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
1f840 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
1f850 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
1f860 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
1f870 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
1f880 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
1f890 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
1f8a0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
1f8b0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
1f8c0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
1f8d0 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52 4f  _TOKEN_WRITE_PRO
1f8e0 54 45 43 54 45 44 20 28 25 69 29 22 2c 20 43 4b  TECTED (%i)", CK
1f8f0 52 5f 54 4f 4b 45 4e 5f 57 52 49 54 45 5f 50 52  R_TOKEN_WRITE_PR
1f900 4f 54 45 43 54 45 44 29 3b 0a 0a 09 72 65 74 75  OTECTED);...retu
1f910 72 6e 28 43 4b 52 5f 54 4f 4b 45 4e 5f 57 52 49  rn(CKR_TOKEN_WRI
1f920 54 45 5f 50 52 4f 54 45 43 54 45 44 29 3b 0a 7d  TE_PROTECTED);.}
1f930 0a 0a 2f 2a 20 57 65 20 64 6f 6e 27 74 20 73 75  ../* We don't su
1f940 70 70 6f 72 74 20 74 68 69 73 20 6d 65 74 68 6f  pport this metho
1f950 64 2e 20 2a 2f 0a 43 4b 5f 44 45 46 49 4e 45 5f  d. */.CK_DEFINE_
1f960 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
1f970 43 5f 53 65 74 50 49 4e 29 28 43 4b 5f 53 45 53  C_SetPIN)(CK_SES
1f980 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73  SION_HANDLE hSes
1f990 73 69 6f 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41  sion, CK_UTF8CHA
1f9a0 52 5f 50 54 52 20 70 4f 6c 64 50 69 6e 2c 20 43  R_PTR pOldPin, C
1f9b0 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 6c 64 50 69 6e  K_ULONG ulOldPin
1f9c0 4c 65 6e 2c 20 43 4b 5f 55 54 46 38 43 48 41 52  Len, CK_UTF8CHAR
1f9d0 5f 50 54 52 20 70 4e 65 77 50 69 6e 2c 20 43 4b  _PTR pNewPin, CK
1f9e0 5f 55 4c 4f 4e 47 20 75 6c 4e 65 77 50 69 6e 4c  _ULONG ulNewPinL
1f9f0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
1fa00 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
1fa10 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
1fa20 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
1fa30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
1fa40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
1fa50 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
1fa60 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
1fa70 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
1fa80 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
1fa90 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
1faa0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
1fab0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
1fac0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
1fad0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
1fae0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
1faf0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
1fb00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
1fb10 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
1fb20 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
1fb30 4b 5f 52 56 2c 20 43 5f 4f 70 65 6e 53 65 73 73  K_RV, C_OpenSess
1fb40 69 6f 6e 29 28 43 4b 5f 53 4c 4f 54 5f 49 44 20  ion)(CK_SLOT_ID 
1fb50 73 6c 6f 74 49 44 2c 20 43 4b 5f 46 4c 41 47 53  slotID, CK_FLAGS
1fb60 20 66 6c 61 67 73 2c 20 43 4b 5f 56 4f 49 44 5f   flags, CK_VOID_
1fb70 50 54 52 20 70 41 70 70 6c 69 63 61 74 69 6f 6e  PTR pApplication
1fb80 2c 20 43 4b 5f 4e 4f 54 49 46 59 20 6e 6f 74 69  , CK_NOTIFY noti
1fb90 66 79 2c 20 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  fy, CK_SESSION_H
1fba0 41 4e 44 4c 45 5f 50 54 52 20 70 68 53 65 73 73  ANDLE_PTR phSess
1fbb0 69 6f 6e 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64  ion) {..unsigned
1fbc0 20 6c 6f 6e 67 20 69 64 78 3b 0a 09 69 6e 74 20   long idx;..int 
1fbd0 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 09 69  mutex_retval;..i
1fbe0 6e 74 20 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e  nt found_session
1fbf0 20 3d 20 30 3b 0a 0a 09 43 41 43 4b 45 59 5f 44   = 0;...CACKEY_D
1fc00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
1fc10 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 28 66  led.");...if ((f
1fc20 6c 61 67 73 20 26 20 43 4b 46 5f 53 45 52 49 41  lags & CKF_SERIA
1fc30 4c 5f 53 45 53 53 49 4f 4e 29 20 21 3d 20 43 4b  L_SESSION) != CK
1fc40 46 5f 53 45 52 49 41 4c 5f 53 45 53 53 49 4f 4e  F_SERIAL_SESSION
1fc50 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ) {...return(CKR
1fc60 5f 53 45 53 53 49 4f 4e 5f 50 41 52 41 4c 4c 45  _SESSION_PARALLE
1fc70 4c 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  L_NOT_SUPPORTED)
1fc80 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
1fc90 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
1fca0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fcb0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fcc0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
1fcd0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
1fce0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
1fcf0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
1fd00 0a 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20  ...if (slotID < 
1fd10 30 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28  0 || slotID >= (
1fd20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
1fd30 6f 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ots) / sizeof(ca
1fd40 63 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29  ckey_slots[0])))
1fd50 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
1fd60 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
1fd70 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65   Invalid slot re
1fd80 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f  quested (%lu), o
1fd90 75 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20  utside of valid 
1fda0 72 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b  range", slotID);
1fdb0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53  ....return(CKR_S
1fdc0 4c 4f 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b  LOT_ID_INVALID);
1fdd0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
1fde0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
1fdf0 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
1fe00 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
1fe10 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
1fe20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
1fe30 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
1fe40 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
1fe50 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
1fe60 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
1fe70 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65  ;..}...if (cacke
1fe80 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
1fe90 61 63 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09  active == 0) {..
1fea0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
1feb0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
1fec0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
1fed0 74 65 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20  ted (%lu), slot 
1fee0 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63  not currently ac
1fef0 74 69 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  tive", slotID);.
1ff00 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f  ...cackey_mutex_
1ff10 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
1ff20 67 6c 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72  glock);....retur
1ff30 6e 28 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e  n(CKR_SLOT_ID_IN
1ff40 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  VALID);..}.../* 
1ff50 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1ff60 63 61 72 64 20 69 73 20 61 63 74 75 61 6c 6c 79  card is actually
1ff70 20 69 6e 20 74 68 65 20 73 6c 6f 74 2e 20 2a 2f   in the slot. */
1ff80 0a 09 2f 2a 20 58 58 58 3a 20 43 68 65 63 6b 20  ../* XXX: Check 
1ff90 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
1ffa0 73 20 69 73 20 69 6e 20 74 68 65 20 50 4b 43 53  s is in the PKCS
1ffb0 23 31 31 20 73 70 65 63 69 66 69 63 61 74 69 6f  #11 specificatio
1ffc0 6e 20 2a 2f 0a 09 69 66 20 28 63 61 63 6b 65 79  n */..if (cackey
1ffd0 5f 74 6f 6b 65 6e 5f 70 72 65 73 65 6e 74 28 26  _token_present(&
1ffe0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
1fff0 74 49 44 5d 29 20 21 3d 20 43 41 43 4b 45 59 5f  tID]) != CACKEY_
20000 50 43 53 43 5f 53 5f 54 4f 4b 45 4e 50 52 45 53  PCSC_S_TOKENPRES
20010 45 4e 54 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ENT) {...CACKEY_
20020 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
20030 72 6f 72 2e 20 20 43 61 72 64 20 6e 6f 74 20 70  ror.  Card not p
20040 72 65 73 65 6e 74 2e 20 20 52 65 74 75 72 6e 69  resent.  Returni
20050 6e 67 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45  ng CKR_DEVICE_RE
20060 4d 4f 56 45 44 22 29 3b 0a 0a 09 09 63 61 63 6b  MOVED");....cack
20070 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20080 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20090 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 44  ....return(CKR_D
200a0 45 56 49 43 45 5f 52 45 4d 4f 56 45 44 29 3b 0a  EVICE_REMOVED);.
200b0 09 7d 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  .}...for (idx = 
200c0 31 3b 20 69 64 78 20 3c 20 28 73 69 7a 65 6f 66  1; idx < (sizeof
200d0 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
200e0 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
200f0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 3b  y_sessions[0]));
20100 20 69 64 78 2b 2b 29 20 7b 0a 09 09 69 66 20 28   idx++) {...if (
20110 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  !cackey_sessions
20120 5b 69 64 78 5d 2e 61 63 74 69 76 65 29 20 7b 0a  [idx].active) {.
20130 09 09 09 66 6f 75 6e 64 5f 73 65 73 73 69 6f 6e  ...found_session
20140 20 3d 20 31 3b 0a 0a 09 09 09 2a 70 68 53 65 73   = 1;.....*phSes
20150 73 69 6f 6e 20 3d 20 69 64 78 3b 0a 0a 09 09 09  sion = idx;.....
20160 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
20170 69 64 78 5d 2e 61 63 74 69 76 65 20 3d 20 31 3b  idx].active = 1;
20180 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
20190 6f 6e 73 5b 69 64 78 5d 2e 73 6c 6f 74 49 44 20  ons[idx].slotID 
201a0 3d 20 73 6c 6f 74 49 44 3b 0a 09 09 09 63 61 63  = slotID;....cac
201b0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78  key_sessions[idx
201c0 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f  ].state = CKS_RO
201d0 5f 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b  _PUBLIC_SESSION;
201e0 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
201f0 6f 6e 73 5b 69 64 78 5d 2e 66 6c 61 67 73 20 3d  ons[idx].flags =
20200 20 66 6c 61 67 73 3b 0a 09 09 09 63 61 63 6b 65   flags;....cacke
20210 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
20220 75 6c 44 65 76 69 63 65 45 72 72 6f 72 20 3d 20  ulDeviceError = 
20230 30 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73  0;....cackey_ses
20240 73 69 6f 6e 73 5b 69 64 78 5d 2e 70 41 70 70 6c  sions[idx].pAppl
20250 69 63 61 74 69 6f 6e 20 3d 20 70 41 70 70 6c 69  ication = pAppli
20260 63 61 74 69 6f 6e 3b 0a 09 09 09 63 61 63 6b 65  cation;....cacke
20270 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
20280 4e 6f 74 69 66 79 20 3d 20 6e 6f 74 69 66 79 3b  Notify = notify;
20290 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
202a0 69 6f 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69  ions[idx].identi
202b0 74 69 65 73 20 3d 20 4e 55 4c 4c 3b 0a 09 09 09  ties = NULL;....
202c0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
202d0 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65 73 5f  idx].identities_
202e0 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 09 09 09 63  count = 0;.....c
202f0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69  ackey_sessions[i
20300 64 78 5d 2e 73 65 61 72 63 68 5f 61 63 74 69 76  dx].search_activ
20310 65 20 3d 20 30 3b 0a 0a 09 09 09 63 61 63 6b 65  e = 0;.....cacke
20320 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d 2e  y_sessions[idx].
20330 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20 30 3b  sign_active = 0;
20340 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
20350 69 6f 6e 73 5b 69 64 78 5d 2e 64 65 63 72 79 70  ions[idx].decryp
20360 74 5f 61 63 74 69 76 65 20 3d 20 30 3b 0a 0a 09  t_active = 0;...
20370 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
20380 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69 65  s[idx].identitie
20390 73 20 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f  s = cackey_read_
203a0 69 64 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b  identities(&cack
203b0 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d  ey_slots[slotID]
203c0 2c 20 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  , &cackey_sessio
203d0 6e 73 5b 69 64 78 5d 2e 69 64 65 6e 74 69 74 69  ns[idx].identiti
203e0 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 0a 09 09 09  es_count);......
203f0 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 7d 0a 0a 09  break;...}..}...
20400 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
20410 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20420 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20430 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
20440 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
20450 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
20460 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
20470 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20480 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20490 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
204a0 09 7d 0a 0a 09 69 66 20 28 21 66 6f 75 6e 64 5f  .}...if (!found_
204b0 73 65 73 73 69 6f 6e 29 20 7b 0a 09 09 43 41 43  session) {...CAC
204c0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
204d0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
204e0 53 45 53 53 49 4f 4e 5f 43 4f 55 4e 54 20 28 25  SESSION_COUNT (%
204f0 69 29 22 2c 20 43 4b 52 5f 53 45 53 53 49 4f 4e  i)", CKR_SESSION
20500 5f 43 4f 55 4e 54 29 3b 0a 0a 09 09 72 65 74 75  _COUNT);....retu
20510 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 43  rn(CKR_SESSION_C
20520 4f 55 4e 54 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  OUNT);..}...CACK
20530 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20540 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f  "Returning CKR_O
20550 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29  K (%i)", CKR_OK)
20560 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f  ;...return(CKR_O
20570 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  K);.}..CK_DEFINE
20580 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
20590 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 29   C_CloseSession)
205a0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
205b0 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
205c0 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
205d0 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
205e0 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
205f0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
20600 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
20610 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20620 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
20630 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
20640 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
20650 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
20660 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
20670 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
20680 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
20690 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
206a0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
206b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
206c0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
206d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
206e0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
206f0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
20700 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
20710 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
20720 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
20730 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
20740 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
20750 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
20760 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
20770 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
20780 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
20790 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
207a0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
207b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
207c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
207d0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
207e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
207f0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
20800 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
20810 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
20820 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
20830 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
20840 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
20850 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
20860 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
20870 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
20880 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f  D);..}...cackey_
20890 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
208a0 6e 5d 2e 61 63 74 69 76 65 20 3d 20 30 3b 0a 09  n].active = 0;..
208b0 63 61 63 6b 65 79 5f 66 72 65 65 5f 69 64 65 6e  cackey_free_iden
208c0 74 69 74 69 65 73 28 63 61 63 6b 65 79 5f 73 65  tities(cackey_se
208d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
208e0 2e 69 64 65 6e 74 69 74 69 65 73 2c 20 63 61 63  .identities, cac
208f0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
20900 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
20910 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 6d 75 74 65  s_count);...mute
20920 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
20930 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
20940 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
20950 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
20960 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
20970 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
20980 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
20990 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
209a0 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
209b0 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
209c0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
209d0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
209e0 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
209f0 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
20a00 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
20a10 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
20a20 4b 5f 52 56 2c 20 43 5f 43 6c 6f 73 65 41 6c 6c  K_RV, C_CloseAll
20a30 53 65 73 73 69 6f 6e 73 29 28 43 4b 5f 53 4c 4f  Sessions)(CK_SLO
20a40 54 5f 49 44 20 73 6c 6f 74 49 44 29 20 7b 0a 09  T_ID slotID) {..
20a50 75 69 6e 74 33 32 5f 74 20 69 64 78 3b 0a 09 69  uint32_t idx;..i
20a60 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
20a70 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20a80 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
20a90 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
20aa0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
20ab0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20ac0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
20ad0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
20ae0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
20af0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
20b00 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
20b10 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20  .if (slotID < 0 
20b20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69  || slotID >= (si
20b30 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74  zeof(cackey_slot
20b40 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b  s) / sizeof(cack
20b50 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b  ey_slots[0]))) {
20b60 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
20b70 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49  PRINTF("Error. I
20b80 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75  nvalid slot requ
20b90 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74  ested (%lu), out
20ba0 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61  side of valid ra
20bb0 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a  nge", slotID);..
20bc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 4c 4f  ..return(CKR_SLO
20bd0 54 5f 49 44 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  T_ID_INVALID);..
20be0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
20bf0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
20c00 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20c10 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
20c20 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
20c30 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
20c40 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
20c50 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
20c60 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
20c70 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
20c80 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
20c90 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63  slots[slotID].ac
20ca0 74 69 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43  tive == 0) {...C
20cb0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
20cc0 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c  TF("Error. Inval
20cd0 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65  id slot requeste
20ce0 64 20 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f  d (%lu), slot no
20cf0 74 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  t currently acti
20d00 76 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09  ve", slotID);...
20d10 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
20d20 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
20d30 6f 63 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  ock);....return(
20d40 43 4b 52 5f 53 4c 4f 54 5f 49 44 5f 49 4e 56 41  CKR_SLOT_ID_INVA
20d50 4c 49 44 29 3b 0a 09 7d 0a 0a 09 66 6f 72 20 28  LID);..}...for (
20d60 69 64 78 20 3d 20 30 3b 20 69 64 78 20 3c 20 28  idx = 0; idx < (
20d70 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
20d80 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
20d90 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
20da0 5b 30 5d 29 29 3b 20 69 64 78 2b 2b 29 20 7b 0a  [0])); idx++) {.
20db0 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
20dc0 73 69 6f 6e 73 5b 69 64 78 5d 2e 61 63 74 69 76  sions[idx].activ
20dd0 65 29 20 7b 0a 09 09 09 69 66 20 28 63 61 63 6b  e) {....if (cack
20de0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 69 64 78 5d  ey_sessions[idx]
20df0 2e 73 6c 6f 74 49 44 20 21 3d 20 73 6c 6f 74 49  .slotID != slotI
20e00 44 29 20 7b 0a 09 09 09 09 63 6f 6e 74 69 6e 75  D) {.....continu
20e10 65 3b 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b  e;....}.....cack
20e20 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
20e30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
20e40 0a 09 09 09 43 5f 43 6c 6f 73 65 53 65 73 73 69  ....C_CloseSessi
20e50 6f 6e 28 69 64 78 29 3b 0a 09 09 09 63 61 63 6b  on(idx);....cack
20e60 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61  ey_mutex_lock(ca
20e70 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
20e80 09 7d 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  .}..}...mutex_re
20e90 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
20ea0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
20eb0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
20ec0 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
20ed0 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
20ee0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
20ef0 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
20f00 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
20f10 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
20f20 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
20f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
20f40 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
20f50 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b  OK (%i)", CKR_OK
20f60 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
20f70 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  OK);.}..CK_DEFIN
20f80 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
20f90 2c 20 43 5f 47 65 74 53 65 73 73 69 6f 6e 49 6e  , C_GetSessionIn
20fa0 66 6f 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  fo)(CK_SESSION_H
20fb0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
20fc0 43 4b 5f 53 45 53 53 49 4f 4e 5f 49 4e 46 4f 5f  CK_SESSION_INFO_
20fd0 50 54 52 20 70 49 6e 66 6f 29 20 7b 0a 09 69 6e  PTR pInfo) {..in
20fe0 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a  t mutex_retval;.
20ff0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21000 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
21010 3b 0a 0a 09 69 66 20 28 70 49 6e 66 6f 20 3d 3d  ;...if (pInfo ==
21020 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
21030 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
21040 45 72 72 6f 72 2e 20 70 49 6e 66 6f 20 69 73 20  Error. pInfo is 
21050 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65 74 75  NULL.");....retu
21060 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e 54 53  rn(CKR_ARGUMENTS
21070 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  _BAD);..}...if (
21080 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
21090 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
210a0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
210b0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
210c0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
210d0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
210e0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
210f0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
21100 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
21110 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
21120 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
21130 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
21140 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
21150 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
21160 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
21170 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
21180 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
21190 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
211a0 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
211b0 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
211c0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
211d0 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
211e0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
211f0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
21200 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21210 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21220 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
21230 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21240 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21250 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
21260 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21270 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
21280 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
21290 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
212a0 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
212b0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
212c0 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
212d0 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
212e0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
212f0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
21300 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 70  INVALID);..}...p
21310 49 6e 66 6f 2d 3e 73 6c 6f 74 49 44 20 3d 20 63  Info->slotID = c
21320 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21330 53 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b  Session].slotID;
21340 0a 09 70 49 6e 66 6f 2d 3e 73 74 61 74 65 20 3d  ..pInfo->state =
21350 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
21360 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 74 61 74 65  [hSession].state
21370 3b 0a 09 70 49 6e 66 6f 2d 3e 66 6c 61 67 73 20  ;..pInfo->flags 
21380 3d 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  = cackey_session
21390 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 66 6c 61 67  s[hSession].flag
213a0 73 3b 0a 09 70 49 6e 66 6f 2d 3e 75 6c 44 65 76  s;..pInfo->ulDev
213b0 69 63 65 45 72 72 6f 72 20 3d 20 63 61 63 6b 65  iceError = cacke
213c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
213d0 69 6f 6e 5d 2e 75 6c 44 65 76 69 63 65 45 72 72  ion].ulDeviceErr
213e0 6f 72 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  or;...mutex_retv
213f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
21400 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21410 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
21420 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
21430 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
21440 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
21450 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69  .  Unlocking fai
21460 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  led.");....retur
21470 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52  n(CKR_GENERAL_ER
21480 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45  ROR);..}...CACKE
21490 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
214a0 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b  Returning CKR_OK
214b0 20 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b   (%i)", CKR_OK);
214c0 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
214d0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
214e0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
214f0 43 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_GetOperationSt
21500 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
21510 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
21520 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 4f 70   CK_BYTE_PTR pOp
21530 65 72 61 74 69 6f 6e 53 74 61 74 65 2c 20 43 4b  erationState, CK
21540 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4f 70  _ULONG_PTR pulOp
21550 65 72 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 29  erationStateLen)
21560 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
21570 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
21580 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
21590 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
215a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
215b0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
215c0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
215d0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
215e0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
215f0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
21600 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
21610 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
21620 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
21630 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
21640 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
21650 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
21660 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
21670 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
21680 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
21690 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
216a0 56 2c 20 43 5f 53 65 74 4f 70 65 72 61 74 69 6f  V, C_SetOperatio
216b0 6e 53 74 61 74 65 29 28 43 4b 5f 53 45 53 53 49  nState)(CK_SESSI
216c0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
216d0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
216e0 70 4f 70 65 72 61 74 69 6f 6e 53 74 61 74 65 2c  pOperationState,
216f0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 4f 70 65 72   CK_ULONG ulOper
21700 61 74 69 6f 6e 53 74 61 74 65 4c 65 6e 2c 20 43  ationStateLen, C
21710 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
21720 68 45 6e 63 72 79 70 74 69 6f 6e 4b 65 79 2c 20  hEncryptionKey, 
21730 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
21740 20 68 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e   hAuthentication
21750 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Key) {..CACKEY_D
21760 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
21770 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
21780 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
21790 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
217a0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
217b0 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
217c0 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
217d0 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
217e0 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
217f0 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
21800 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
21810 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
21820 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
21830 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
21840 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
21850 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
21860 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
21870 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
21880 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
21890 43 4b 5f 52 56 2c 20 43 5f 4c 6f 67 69 6e 29 28  CK_RV, C_Login)(
218a0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
218b0 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 55  E hSession, CK_U
218c0 53 45 52 5f 54 59 50 45 20 75 73 65 72 54 79 70  SER_TYPE userTyp
218d0 65 2c 20 43 4b 5f 55 54 46 38 43 48 41 52 5f 50  e, CK_UTF8CHAR_P
218e0 54 52 20 70 50 69 6e 2c 20 43 4b 5f 55 4c 4f 4e  TR pPin, CK_ULON
218f0 47 20 75 6c 50 69 6e 4c 65 6e 29 20 7b 0a 09 43  G ulPinLen) {..C
21900 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44  K_SLOT_ID slotID
21910 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
21920 76 61 6c 3b 0a 09 69 6e 74 20 74 72 69 65 73 5f  val;..int tries_
21930 72 65 6d 61 69 6e 69 6e 67 3b 0a 09 69 6e 74 20  remaining;..int 
21940 6c 6f 67 69 6e 5f 72 65 74 3b 0a 0a 09 43 41 43  login_ret;...CAC
21950 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21960 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69  ("Called.");...i
21970 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69  f (!cackey_initi
21980 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b  alized) {...CACK
21990 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
219a0 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69  "Error.  Not ini
219b0 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09  tialized.");....
219c0 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54  return(CKR_CRYPT
219d0 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49  OKI_NOT_INITIALI
219e0 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  ZED);..}...if (h
219f0 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20  Session == 0 || 
21a00 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a  hSession >= (siz
21a10 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
21a20 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61  ons) / sizeof(ca
21a30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d  ckey_sessions[0]
21a40 29 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ))) {...CACKEY_D
21a50 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
21a60 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74  or.  Session out
21a70 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09   of range.");...
21a80 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
21a90 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
21aa0 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
21ab0 75 73 65 72 54 79 70 65 20 21 3d 20 43 4b 55 5f  userType != CKU_
21ac0 55 53 45 52 29 20 7b 0a 09 09 43 41 43 4b 45 59  USER) {...CACKEY
21ad0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
21ae0 72 72 6f 72 2e 20 20 57 65 20 6f 6e 6c 79 20 73  rror.  We only s
21af0 75 70 70 6f 72 74 20 55 53 45 52 20 6d 6f 64 65  upport USER mode
21b00 2c 20 61 73 6b 65 64 20 66 6f 72 20 25 6c 75 20  , asked for %lu 
21b10 6d 6f 64 65 2e 22 2c 20 28 75 6e 73 69 67 6e 65  mode.", (unsigne
21b20 64 20 6c 6f 6e 67 29 20 75 73 65 72 54 79 70 65  d long) userType
21b30 29 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  )....return(CKR_
21b40 55 53 45 52 5f 54 59 50 45 5f 49 4e 56 41 4c 49  USER_TYPE_INVALI
21b50 44 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72  D);..}...mutex_r
21b60 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
21b70 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79  utex_lock(cackey
21b80 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
21b90 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
21ba0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21bb0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21bc0 72 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c  r.  Locking fail
21bd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
21be0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
21bf0 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63  OR);..}...if (!c
21c00 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
21c10 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
21c20 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65   {...cackey_mute
21c30 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  x_unlock(cackey_
21c40 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43  biglock);....CAC
21c50 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
21c60 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f  ("Error.  Sessio
21c70 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
21c80 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
21c90 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
21ca0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 73  INVALID);..}...s
21cb0 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73  lotID = cackey_s
21cc0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
21cd0 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28  ].slotID;...if (
21ce0 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c  slotID < 0 || sl
21cf0 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28  otID >= (sizeof(
21d00 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20  cackey_slots) / 
21d10 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c  sizeof(cackey_sl
21d20 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ots[0]))) {...CA
21d30 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
21d40 46 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69  F("Error. Invali
21d50 64 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64  d slot requested
21d60 20 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20   (%lu), outside 
21d70 6f 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c  of valid range",
21d80 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74   slotID);....ret
21d90 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
21da0 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20  ERROR);..}...if 
21db0 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  (cackey_slots[sl
21dc0 6f 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20  otID].active == 
21dd0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
21de0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
21df0 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20  r. Invalid slot 
21e00 72 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c  requested (%lu),
21e10 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e   slot not curren
21e20 74 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f  tly active", slo
21e30 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f  tID);....cackey_
21e40 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
21e50 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
21e60 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
21e70 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
21e80 09 6c 6f 67 69 6e 5f 72 65 74 20 3d 20 63 61 63  .login_ret = cac
21e90 6b 65 79 5f 6c 6f 67 69 6e 28 26 63 61 63 6b 65  key_login(&cacke
21ea0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c  y_slots[slotID],
21eb0 20 70 50 69 6e 2c 20 75 6c 50 69 6e 4c 65 6e 2c   pPin, ulPinLen,
21ec0 20 26 74 72 69 65 73 5f 72 65 6d 61 69 6e 69 6e   &tries_remainin
21ed0 67 29 3b 0a 09 69 66 20 28 6c 6f 67 69 6e 5f 72  g);..if (login_r
21ee0 65 74 20 21 3d 20 43 41 43 4b 45 59 5f 50 43 53  et != CACKEY_PCS
21ef0 43 5f 53 5f 4f 4b 29 20 7b 0a 09 09 63 61 63 6b  C_S_OK) {...cack
21f00 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
21f10 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
21f20 0a 0a 09 09 69 66 20 28 6c 6f 67 69 6e 5f 72 65  ....if (login_re
21f30 74 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43  t == CACKEY_PCSC
21f40 5f 45 5f 4c 4f 43 4b 45 44 29 20 7b 0a 09 09 09  _E_LOCKED) {....
21f50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
21f60 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 54 6f 6b  NTF("Error.  Tok
21f70 65 6e 20 69 73 20 6c 6f 63 6b 65 64 2e 22 29 3b  en is locked.");
21f80 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .....cackey_slot
21f90 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
21fa0 66 6c 61 67 73 20 7c 3d 20 43 4b 46 5f 55 53 45  flags |= CKF_USE
21fb0 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 3b 0a 0a 09  R_PIN_LOCKED;...
21fc0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 50 49 4e  ..return(CKR_PIN
21fd0 5f 4c 4f 43 4b 45 44 29 3b 0a 09 09 7d 20 65 6c  _LOCKED);...} el
21fe0 73 65 20 69 66 20 28 6c 6f 67 69 6e 5f 72 65 74  se if (login_ret
21ff0 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f   == CACKEY_PCSC_
22000 45 5f 42 41 44 50 49 4e 29 20 7b 0a 09 09 09 43  E_BADPIN) {....C
22010 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22020 54 46 28 22 45 72 72 6f 72 2e 20 20 49 6e 76 61  TF("Error.  Inva
22030 6c 69 64 20 50 49 4e 2e 22 29 3b 0a 0a 09 09 09  lid PIN.");.....
22040 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
22050 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
22060 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
22070 5f 43 4f 55 4e 54 5f 4c 4f 57 3b 0a 0a 09 09 09  _COUNT_LOW;.....
22080 69 66 20 28 74 72 69 65 73 5f 72 65 6d 61 69 6e  if (tries_remain
22090 69 6e 67 20 3d 3d 20 31 29 20 7b 0a 09 09 09 09  ing == 1) {.....
220a0 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
220b0 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67 73  tID].token_flags
220c0 20 7c 3d 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e   |= CKF_USER_PIN
220d0 5f 46 49 4e 41 4c 5f 54 52 59 3b 0a 09 09 09 7d  _FINAL_TRY;....}
220e0 0a 0a 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
220f0 50 49 4e 5f 49 4e 43 4f 52 52 45 43 54 29 3b 0a  PIN_INCORRECT);.
22100 09 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  ..}....CACKEY_DE
22110 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
22120 72 2e 20 20 55 6e 6b 6e 6f 77 6e 20 65 72 72 6f  r.  Unknown erro
22130 72 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  r returned from 
22140 63 61 63 6b 65 79 5f 6c 6f 67 69 6e 28 29 20 28  cackey_login() (
22150 25 69 29 22 2c 20 6c 6f 67 69 6e 5f 72 65 74 29  %i)", login_ret)
22160 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
22170 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
22180 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 6c 6f 74  .}...cackey_slot
22190 73 5b 73 6c 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f  s[slotID].token_
221a0 66 6c 61 67 73 20 26 3d 20 7e 28 43 4b 46 5f 55  flags &= ~(CKF_U
221b0 53 45 52 5f 50 49 4e 5f 4c 4f 43 4b 45 44 20 7c  SER_PIN_LOCKED |
221c0 20 43 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 43 4f   CKF_USER_PIN_CO
221d0 55 4e 54 5f 4c 4f 57 20 7c 20 43 4b 46 5f 4c 4f  UNT_LOW | CKF_LO
221e0 47 49 4e 5f 52 45 51 55 49 52 45 44 20 7c 20 43  GIN_REQUIRED | C
221f0 4b 46 5f 55 53 45 52 5f 50 49 4e 5f 46 49 4e 41  KF_USER_PIN_FINA
22200 4c 5f 54 52 59 29 3b 0a 0a 09 63 61 63 6b 65 79  L_TRY);...cackey
22210 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
22220 6f 6e 5d 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f  on].state = CKS_
22230 52 4f 5f 55 53 45 52 5f 46 55 4e 43 54 49 4f 4e  RO_USER_FUNCTION
22240 53 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  S;...mutex_retva
22250 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
22260 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
22270 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
22280 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
22290 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
222a0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
222b0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
222c0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
222d0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
222e0 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
222f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
22300 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
22310 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
22320 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
22330 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22340 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22350 5f 4c 6f 67 6f 75 74 29 28 43 4b 5f 53 45 53 53  _Logout)(CK_SESS
22360 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
22370 69 6f 6e 29 20 7b 0a 09 43 4b 5f 53 4c 4f 54 5f  ion) {..CK_SLOT_
22380 49 44 20 73 6c 6f 74 49 44 3b 0a 09 69 6e 74 20  ID slotID;..int 
22390 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b 0a 0a 09  mutex_retval;...
223a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
223b0 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
223c0 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
223d0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
223e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
223f0 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22400 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22410 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22420 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22430 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 69 66  ALIZED);..}...if
22440 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30 20   (hSession == 0 
22450 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20 28  || hSession >= (
22460 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65  sizeof(cackey_se
22470 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f 66  ssions) / sizeof
22480 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
22490 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b 45  [0]))) {...CACKE
224a0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
224b0 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20  Error.  Session 
224c0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29 3b  out of range.");
224d0 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
224e0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f  _SESSION_HANDLE_
224f0 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 6d  INVALID);..}...m
22500 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
22510 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
22520 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
22530 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76  ..if (mutex_retv
22540 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43  al != 0) {...CAC
22550 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22560 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e  ("Error.  Lockin
22570 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
22580 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
22590 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
225a0 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73  if (!cackey_sess
225b0 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61  ions[hSession].a
225c0 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
225d0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
225e0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
225f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
22600 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
22610 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69  Session not acti
22620 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75  ve.");......retu
22630 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
22640 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
22650 09 7d 0a 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61  .}...slotID = ca
22660 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
22670 65 73 73 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a  ession].slotID;.
22680 0a 09 69 66 20 28 73 6c 6f 74 49 44 20 3c 20 30  ..if (slotID < 0
22690 20 7c 7c 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73   || slotID >= (s
226a0 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
226b0 74 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ts) / sizeof(cac
226c0 6b 65 79 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20  key_slots[0]))) 
226d0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
226e0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
226f0 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72 65 71  Invalid slot req
22700 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20 6f 75  uested (%lu), ou
22710 74 73 69 64 65 20 6f 66 20 76 61 6c 69 64 20 72  tside of valid r
22720 61 6e 67 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a  ange", slotID);.
22730 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
22740 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
22750 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 6c  ...if (cackey_sl
22760 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69  ots[slotID].acti
22770 76 65 20 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43  ve == 0) {...CAC
22780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22790 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
227a0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
227b0 28 25 6c 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20  (%lu), slot not 
227c0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
227d0 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63  ", slotID);....c
227e0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
227f0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
22800 6b 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  k);....return(CK
22810 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
22820 3b 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65  ;..}...cackey_se
22830 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
22840 2e 73 74 61 74 65 20 3d 20 43 4b 53 5f 52 4f 5f  .state = CKS_RO_
22850 50 55 42 4c 49 43 5f 53 45 53 53 49 4f 4e 3b 0a  PUBLIC_SESSION;.
22860 09 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c  .cackey_slots[sl
22870 6f 74 49 44 5d 2e 74 6f 6b 65 6e 5f 66 6c 61 67  otID].token_flag
22880 73 20 3d 20 43 4b 46 5f 4c 4f 47 49 4e 5f 52 45  s = CKF_LOGIN_RE
22890 51 55 49 52 45 44 3b 0a 0a 09 6d 75 74 65 78 5f  QUIRED;...mutex_
228a0 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f  retval = cackey_
228b0 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
228c0 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69  key_biglock);..i
228d0 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  f (mutex_retval 
228e0 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  != 0) {...CACKEY
228f0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
22900 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67  rror.  Unlocking
22910 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
22920 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
22930 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43  L_ERROR);..}...C
22940 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22950 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
22960 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52 5f  R_OK (%i)", CKR_
22970 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  OK);...return(CK
22980 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  R_OK);.}..CK_DEF
22990 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
229a0 52 56 2c 20 43 5f 43 72 65 61 74 65 4f 62 6a 65  RV, C_CreateObje
229b0 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ct)(CK_SESSION_H
229c0 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
229d0 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52  CK_ATTRIBUTE_PTR
229e0 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55   pTemplate, CK_U
229f0 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20 43 4b  LONG ulCount, CK
22a00 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
22a10 54 52 20 70 68 4f 62 6a 65 63 74 29 20 7b 0a 09  TR phObject) {..
22a20 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
22a30 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a  NTF("Called.");.
22a40 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e  ..if (!cackey_in
22a50 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43  itialized) {...C
22a60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22a70 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20  TF("Error.  Not 
22a80 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a  initialized.");.
22a90 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52  ...return(CKR_CR
22aa0 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49  YPTOKI_NOT_INITI
22ab0 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41  ALIZED);..}...CA
22ac0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22ad0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52  F("Returning CKR
22ae0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
22af0 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43  PPORTED (%i)", C
22b00 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
22b10 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65  SUPPORTED);...re
22b20 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
22b30 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22b40 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
22b50 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
22b60 5f 43 6f 70 79 4f 62 6a 65 63 74 29 28 43 4b 5f  _CopyObject)(CK_
22b70 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
22b80 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45  Session, CK_OBJE
22b90 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63  CT_HANDLE hObjec
22ba0 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
22bb0 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
22bc0 4b 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c  K_ULONG ulCount,
22bd0 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c   CK_OBJECT_HANDL
22be0 45 5f 50 54 52 20 70 68 4e 65 77 4f 62 6a 65 63  E_PTR phNewObjec
22bf0 74 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  t) {..CACKEY_DEB
22c00 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
22c10 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
22c20 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
22c30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
22c40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
22c50 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
22c60 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
22c70 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
22c80 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
22c90 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
22ca0 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
22cb0 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
22cc0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
22cd0 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
22ce0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
22cf0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
22d00 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22d10 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
22d20 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
22d30 5f 52 56 2c 20 43 5f 44 65 73 74 72 6f 79 4f 62  _RV, C_DestroyOb
22d40 6a 65 63 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  ject)(CK_SESSION
22d50 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
22d60 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44  , CK_OBJECT_HAND
22d70 4c 45 20 68 4f 62 6a 65 63 74 29 20 7b 0a 09 43  LE hObject) {..C
22d80 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
22d90 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
22da0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
22db0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
22dc0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22dd0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
22de0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
22df0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
22e00 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
22e10 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
22e20 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22e30 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
22e40 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
22e50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
22e60 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
22e70 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
22e80 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
22e90 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
22ea0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
22eb0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
22ec0 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 29 28 43  GetObjectSize)(C
22ed0 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
22ee0 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42   hSession, CK_OB
22ef0 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4f 62 6a  JECT_HANDLE hObj
22f00 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  ect, CK_ULONG_PT
22f10 52 20 70 75 6c 53 69 7a 65 29 20 7b 0a 09 43 41  R pulSize) {..CA
22f20 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
22f30 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
22f40 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74  if (!cackey_init
22f50 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43  ialized) {...CAC
22f60 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
22f70 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e  ("Error.  Not in
22f80 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09  itialized.");...
22f90 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50  .return(CKR_CRYP
22fa0 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c  TOKI_NOT_INITIAL
22fb0 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b  IZED);..}...CACK
22fc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
22fd0 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46  "Returning CKR_F
22fe0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
22ff0 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b 52  ORTED (%i)", CKR
23000 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
23010 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74 75  PPORTED);...retu
23020 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  rn(CKR_FUNCTION_
23030 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
23040 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
23050 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47  CTION(CK_RV, C_G
23060 65 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65  etAttributeValue
23070 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
23080 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
23090 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
230a0 4f 62 6a 65 63 74 2c 20 43 4b 5f 41 54 54 52 49  Object, CK_ATTRI
230b0 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c 61  BUTE_PTR pTempla
230c0 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 43  te, CK_ULONG ulC
230d0 6f 75 6e 74 29 20 7b 0a 09 43 4b 5f 41 54 54 52  ount) {..CK_ATTR
230e0 49 42 55 54 45 20 2a 63 75 72 72 5f 61 74 74 72  IBUTE *curr_attr
230f0 3b 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79  ;..struct cackey
23100 5f 69 64 65 6e 74 69 74 79 20 2a 69 64 65 6e 74  _identity *ident
23110 69 74 79 3b 0a 09 75 6e 73 69 67 6e 65 64 20 6c  ity;..unsigned l
23120 6f 6e 67 20 69 64 65 6e 74 69 74 79 5f 69 64 78  ong identity_idx
23130 2c 20 61 74 74 72 5f 69 64 78 2c 20 73 65 73 73  , attr_idx, sess
23140 5f 61 74 74 72 5f 69 64 78 2c 20 6e 75 6d 5f 69  _attr_idx, num_i
23150 64 73 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ds;..int mutex_r
23160 65 74 76 61 6c 3b 0a 09 43 4b 5f 52 56 20 72 65  etval;..CK_RV re
23170 74 76 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09  tval = CKR_OK;..
23180 43 4b 5f 56 4f 49 44 5f 50 54 52 20 70 56 61 6c  CK_VOID_PTR pVal
23190 75 65 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ue;..CK_ULONG ul
231a0 56 61 6c 75 65 4c 65 6e 3b 0a 0a 09 43 41 43 4b  ValueLen;...CACK
231b0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
231c0 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66  "Called.");...if
231d0 20 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61   (!cackey_initia
231e0 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45  lized) {...CACKE
231f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
23200 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74  Error.  Not init
23210 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72  ialized.");....r
23220 65 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f  eturn(CKR_CRYPTO
23230 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a  KI_NOT_INITIALIZ
23240 45 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53  ED);..}...if (hS
23250 65 73 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68  ession == 0 || h
23260 53 65 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65  Session >= (size
23270 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  of(cackey_sessio
23280 6e 73 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63  ns) / sizeof(cac
23290 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29  key_sessions[0])
232a0 29 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  )) {...CACKEY_DE
232b0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
232c0 72 2e 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20  r.  Session out 
232d0 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
232e0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53  ..return(CKR_SES
232f0 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41  SION_HANDLE_INVA
23300 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  LID);..}...if (h
23310 4f 62 6a 65 63 74 20 3d 3d 20 30 29 20 7b 0a 09  Object == 0) {..
23320 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
23330 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4f 62  INTF("Error.  Ob
23340 6a 65 63 74 20 68 61 6e 64 6c 65 20 6f 75 74 20  ject handle out 
23350 6f 66 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a  of range.");....
23360 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a  ..return(CKR_OBJ
23370 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ECT_HANDLE_INVAL
23380 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 75 6c  ID);..}...if (ul
23390 43 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09  Count == 0) {...
233a0 2f 2a 20 53 68 6f 72 74 20 63 69 72 63 75 69 74  /* Short circuit
233b0 2c 20 69 66 20 7a 65 72 6f 20 6f 62 6a 65 63 74  , if zero object
233c0 73 20 77 65 72 65 20 73 70 65 63 69 66 69 65 64  s were specified
233d0 20 72 65 74 75 72 6e 20 7a 65 72 6f 20 69 74 65   return zero ite
233e0 6d 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 2a  ms immediately *
233f0 2f 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  /...CACKEY_DEBUG
23400 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
23410 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
23420 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
23430 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
23440 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
23450 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65 20  ..if (pTemplate 
23460 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
23470 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23480 28 22 45 72 72 6f 72 2e 20 20 70 54 65 6d 70 6c  ("Error.  pTempl
23490 61 74 65 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ate is NULL.");.
234a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
234b0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
234c0 0a 0a 09 69 64 65 6e 74 69 74 79 5f 69 64 78 20  ...identity_idx 
234d0 3d 20 68 4f 62 6a 65 63 74 20 2d 20 31 3b 0a 0a  = hObject - 1;..
234e0 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20  .mutex_retval = 
234f0 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63  cackey_mutex_loc
23500 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
23510 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
23520 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
23530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23540 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b  TF("Error.  Lock
23550 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
23560 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e  ..return(CKR_GEN
23570 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a  ERAL_ERROR);..}.
23580 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65  ..if (!cackey_se
23590 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
235a0 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63  .active) {...cac
235b0 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b  key_mutex_unlock
235c0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
235d0 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55  ;....CACKEY_DEBU
235e0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
235f0 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63    Session not ac
23600 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65  tive.");......re
23610 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e  turn(CKR_SESSION
23620 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29  _HANDLE_INVALID)
23630 3b 0a 09 7d 0a 0a 09 6e 75 6d 5f 69 64 73 20 3d  ;..}...num_ids =
23640 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
23650 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
23660 69 74 69 65 73 5f 63 6f 75 6e 74 3b 0a 0a 09 69  ities_count;...i
23670 66 20 28 69 64 65 6e 74 69 74 79 5f 69 64 78 20  f (identity_idx 
23680 3e 3d 20 6e 75 6d 5f 69 64 73 29 20 7b 0a 09 09  >= num_ids) {...
23690 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
236a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
236b0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
236c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
236d0 6f 72 2e 20 20 4f 62 6a 65 63 74 20 68 61 6e 64  or.  Object hand
236e0 6c 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  le out of range.
236f0 20 20 69 64 65 6e 74 69 74 79 5f 69 64 78 20 3d    identity_idx =
23700 20 25 6c 75 2c 20 6e 75 6d 5f 69 64 73 20 3d 20   %lu, num_ids = 
23710 25 6c 75 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  %lu.", (unsigned
23720 20 6c 6f 6e 67 29 20 69 64 65 6e 74 69 74 79 5f   long) identity_
23730 69 64 78 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c  idx, (unsigned l
23740 6f 6e 67 29 20 6e 75 6d 5f 69 64 73 29 3b 0a 0a  ong) num_ids);..
23750 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 42 4a  ..return(CKR_OBJ
23760 45 43 54 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ECT_HANDLE_INVAL
23770 49 44 29 3b 0a 09 7d 0a 0a 09 69 64 65 6e 74 69  ID);..}...identi
23780 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  ty = &cackey_ses
23790 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
237a0 69 64 65 6e 74 69 74 69 65 73 5b 69 64 65 6e 74  identities[ident
237b0 69 74 79 5f 69 64 78 5d 3b 0a 0a 09 66 6f 72 20  ity_idx];...for 
237c0 28 61 74 74 72 5f 69 64 78 20 3d 20 30 3b 20 61  (attr_idx = 0; a
237d0 74 74 72 5f 69 64 78 20 3c 20 75 6c 43 6f 75 6e  ttr_idx < ulCoun
237e0 74 3b 20 61 74 74 72 5f 69 64 78 2b 2b 29 20 7b  t; attr_idx++) {
237f0 0a 09 09 63 75 72 72 5f 61 74 74 72 20 3d 20 26  ...curr_attr = &
23800 70 54 65 6d 70 6c 61 74 65 5b 61 74 74 72 5f 69  pTemplate[attr_i
23810 64 78 5d 3b 0a 0a 09 09 70 56 61 6c 75 65 20 3d  dx];....pValue =
23820 20 4e 55 4c 4c 3b 0a 09 09 75 6c 56 61 6c 75 65   NULL;...ulValue
23830 4c 65 6e 20 3d 20 28 43 4b 5f 4c 4f 4e 47 29 20  Len = (CK_LONG) 
23840 2d 31 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  -1;....CACKEY_DE
23850 42 55 47 5f 50 52 49 4e 54 46 28 22 4c 6f 6f 6b  BUG_PRINTF("Look
23860 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75 74  ing for attribut
23870 65 20 30 78 25 30 38 6c 78 20 28 69 64 65 6e 74  e 0x%08lx (ident
23880 69 74 79 3a 25 6c 75 29 20 2e 2e 2e 22 2c 20 28  ity:%lu) ...", (
23890 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 63  unsigned long) c
238a0 75 72 72 5f 61 74 74 72 2d 3e 74 79 70 65 2c 20  urr_attr->type, 
238b0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
238c0 69 64 65 6e 74 69 74 79 5f 69 64 78 29 3b 0a 0a  identity_idx);..
238d0 09 09 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72  ..for (sess_attr
238e0 5f 69 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61  _idx = 0; sess_a
238f0 74 74 72 5f 69 64 78 20 3c 20 69 64 65 6e 74 69  ttr_idx < identi
23900 74 79 2d 3e 61 74 74 72 69 62 75 74 65 73 5f 63  ty->attributes_c
23910 6f 75 6e 74 3b 20 73 65 73 73 5f 61 74 74 72 5f  ount; sess_attr_
23920 69 64 78 2b 2b 29 20 7b 0a 09 09 09 69 66 20 28  idx++) {....if (
23930 69 64 65 6e 74 69 74 79 2d 3e 61 74 74 72 69 62  identity->attrib
23940 75 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69  utes[sess_attr_i
23950 64 78 5d 2e 74 79 70 65 20 3d 3d 20 63 75 72 72  dx].type == curr
23960 5f 61 74 74 72 2d 3e 74 79 70 65 29 20 7b 0a 09  _attr->type) {..
23970 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
23980 50 52 49 4e 54 46 28 22 20 2e 2e 2e 20 66 6f 75  PRINTF(" ... fou
23990 6e 64 20 69 74 2c 20 70 56 61 6c 75 65 20 3d 20  nd it, pValue = 
239a0 25 70 2c 20 75 6c 56 61 6c 75 65 4c 65 6e 20 3d  %p, ulValueLen =
239b0 20 25 6c 75 22 2c 20 69 64 65 6e 74 69 74 79 2d   %lu", identity-
239c0 3e 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73  >attributes[sess
239d0 5f 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75  _attr_idx].pValu
239e0 65 2c 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74  e, identity->att
239f0 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
23a00 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  r_idx].ulValueLe
23a10 6e 29 3b 0a 09 09 09 09 0a 09 09 09 09 70 56 61  n);..........pVa
23a20 6c 75 65 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e  lue = identity->
23a30 61 74 74 72 69 62 75 74 65 73 5b 73 65 73 73 5f  attributes[sess_
23a40 61 74 74 72 5f 69 64 78 5d 2e 70 56 61 6c 75 65  attr_idx].pValue
23a50 3b 0a 09 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e  ;.....ulValueLen
23a60 20 3d 20 69 64 65 6e 74 69 74 79 2d 3e 61 74 74   = identity->att
23a70 72 69 62 75 74 65 73 5b 73 65 73 73 5f 61 74 74  ributes[sess_att
23a80 72 5f 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  r_idx].ulValueLe
23a90 6e 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 69  n;....}...}....i
23aa0 66 20 28 63 75 72 72 5f 61 74 74 72 2d 3e 70 56  f (curr_attr->pV
23ab0 61 6c 75 65 20 26 26 20 70 56 61 6c 75 65 29 20  alue && pValue) 
23ac0 7b 0a 09 09 09 69 66 20 28 63 75 72 72 5f 61 74  {....if (curr_at
23ad0 74 72 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 20 3e  tr->ulValueLen >
23ae0 3d 20 75 6c 56 61 6c 75 65 4c 65 6e 29 20 7b 0a  = ulValueLen) {.
23af0 09 09 09 09 6d 65 6d 63 70 79 28 63 75 72 72 5f  ....memcpy(curr_
23b00 61 74 74 72 2d 3e 70 56 61 6c 75 65 2c 20 70 56  attr->pValue, pV
23b10 61 6c 75 65 2c 20 75 6c 56 61 6c 75 65 4c 65 6e  alue, ulValueLen
23b20 29 3b 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09  );....} else {..
23b30 09 09 09 75 6c 56 61 6c 75 65 4c 65 6e 20 3d 20  ...ulValueLen = 
23b40 28 43 4b 5f 4c 4f 4e 47 29 20 2d 31 3b 0a 0a 09  (CK_LONG) -1;...
23b50 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  ...retval = CKR_
23b60 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c  BUFFER_TOO_SMALL
23b70 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09 63 75  ;....}...}....cu
23b80 72 72 5f 61 74 74 72 2d 3e 75 6c 56 61 6c 75 65  rr_attr->ulValue
23b90 4c 65 6e 20 3d 20 75 6c 56 61 6c 75 65 4c 65 6e  Len = ulValueLen
23ba0 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74  ;..}...mutex_ret
23bb0 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74  val = cackey_mut
23bc0 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79  ex_unlock(cackey
23bd0 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28  _biglock);..if (
23be0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
23bf0 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  0) {...CACKEY_DE
23c00 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
23c10 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61  r.  Unlocking fa
23c20 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  iled.");....retu
23c30 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
23c40 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
23c50 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 41 54  retval == CKR_AT
23c60 54 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56  TRIBUTE_TYPE_INV
23c70 41 4c 49 44 29 20 7b 0a 09 09 43 41 43 4b 45 59  ALID) {...CACKEY
23c80 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
23c90 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 41 54 54  eturning CKR_ATT
23ca0 52 49 42 55 54 45 5f 54 59 50 45 5f 49 4e 56 41  RIBUTE_TYPE_INVA
23cb0 4c 49 44 20 28 25 69 29 22 2c 20 28 69 6e 74 29  LID (%i)", (int)
23cc0 20 72 65 74 76 61 6c 29 3b 0a 09 7d 20 65 6c 73   retval);..} els
23cd0 65 20 69 66 20 28 72 65 74 76 61 6c 20 3d 3d 20  e if (retval == 
23ce0 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53  CKR_BUFFER_TOO_S
23cf0 4d 41 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  MALL) {...CACKEY
23d00 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
23d10 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 42 55 46  eturning CKR_BUF
23d20 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 20 28 25  FER_TOO_SMALL (%
23d30 69 29 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61  i)", (int) retva
23d40 6c 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  l);..} else if (
23d50 72 65 74 76 61 6c 20 3d 3d 20 43 4b 52 5f 4f 4b  retval == CKR_OK
23d60 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
23d70 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
23d80 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
23d90 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29  ", (int) retval)
23da0 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 09 43 41  ;..} else {...CA
23db0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23dc0 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22  F("Returning %i"
23dd0 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b  , (int) retval);
23de0 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 28 72 65 74  ..}...return(ret
23df0 76 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  val);.}..CK_DEFI
23e00 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
23e10 56 2c 20 43 5f 53 65 74 41 74 74 72 69 62 75 74  V, C_SetAttribut
23e20 65 56 61 6c 75 65 29 28 43 4b 5f 53 45 53 53 49  eValue)(CK_SESSI
23e30 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
23e40 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41  on, CK_OBJECT_HA
23e50 4e 44 4c 45 20 68 4f 62 6a 65 63 74 2c 20 43 4b  NDLE hObject, CK
23e60 5f 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70  _ATTRIBUTE_PTR p
23e70 54 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f  Template, CK_ULO
23e80 4e 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43  NG ulCount) {..C
23e90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
23ea0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
23eb0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
23ec0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
23ed0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
23ee0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
23ef0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
23f00 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
23f10 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
23f20 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
23f30 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
23f40 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
23f50 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
23f60 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
23f70 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
23f80 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
23f90 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
23fa0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
23fb0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
23fc0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
23fd0 46 69 6e 64 4f 62 6a 65 63 74 73 49 6e 69 74 29  FindObjectsInit)
23fe0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
23ff0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
24000 41 54 54 52 49 42 55 54 45 5f 50 54 52 20 70 54  ATTRIBUTE_PTR pT
24010 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
24020 47 20 75 6c 43 6f 75 6e 74 29 20 7b 0a 09 43 4b  G ulCount) {..CK
24030 5f 53 4c 4f 54 5f 49 44 20 73 6c 6f 74 49 44 3b  _SLOT_ID slotID;
24040 0a 09 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a  ..CK_ULONG idx;.
24050 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
24060 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  l;...CACKEY_DEBU
24070 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
24080 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
24090 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
240a0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
240b0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
240c0 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
240d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
240e0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
240f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
24100 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
24110 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
24120 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
24130 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
24140 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
24150 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
24160 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24170 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
24180 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
24190 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
241a0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
241b0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
241c0 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  }...mutex_retval
241d0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
241e0 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
241f0 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78  ock);..if (mutex
24200 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a  _retval != 0) {.
24210 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24220 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c  RINTF("Error.  L
24230 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
24240 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
24250 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
24260 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  .}...if (!cackey
24270 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24280 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09  on].active) {...
24290 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c  cackey_mutex_unl
242a0 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
242b0 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44  ck);....CACKEY_D
242c0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
242d0 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74  or.  Session not
242e0 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
242f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53  .return(CKR_SESS
24300 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c  ION_HANDLE_INVAL
24310 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61  ID);..}...if (ca
24320 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
24330 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61  ession].search_a
24340 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65  ctive) {...cacke
24350 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
24360 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
24370 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
24380 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
24390 53 65 61 72 63 68 20 61 6c 72 65 61 64 79 20 61  Search already a
243a0 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
243b0 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
243c0 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
243d0 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
243e0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
243f0 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
24400 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
24410 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
24420 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
24430 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
24440 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
24450 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24460 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
24470 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
24480 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
24490 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
244a0 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
244b0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
244c0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
244d0 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
244e0 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
244f0 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
24500 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
24510 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
24520 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
24530 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
24540 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
24550 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
24560 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
24570 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
24580 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
24590 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
245a0 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73  }...if (cackey_s
245b0 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e 73 6c 6f  lots[slotID].slo
245c0 74 5f 72 65 73 65 74 29 20 7b 0a 09 09 43 41 43  t_reset) {...CAC
245d0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
245e0 28 22 54 68 65 20 73 6c 6f 74 20 68 61 73 20 62  ("The slot has b
245f0 65 65 6e 20 72 65 73 65 74 20 73 69 6e 63 65 20  een reset since 
24600 77 65 20 6c 61 73 74 20 6c 6f 6f 6b 65 64 20 66  we last looked f
24610 6f 72 20 69 64 65 6e 74 69 74 69 65 73 20 2d 2d  or identities --
24620 20 72 65 73 63 61 6e 6e 69 6e 67 22 29 3b 0a 0a   rescanning");..
24630 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
24640 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
24650 69 64 65 6e 74 69 74 69 65 73 20 21 3d 20 4e 55  identities != NU
24660 4c 4c 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f  LL) {....cackey_
24670 66 72 65 65 5f 69 64 65 6e 74 69 74 69 65 73 28  free_identities(
24680 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24690 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
246a0 74 69 65 73 2c 20 63 61 63 6b 65 79 5f 73 65 73  ties, cackey_ses
246b0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
246c0 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e 74  identities_count
246d0 29 3b 0a 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  );.....cackey_se
246e0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
246f0 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 20 4e 55  .identities = NU
24700 4c 4c 3b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65  LL;....cackey_se
24710 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
24720 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
24730 74 20 3d 20 30 3b 0a 09 09 7d 0a 0a 09 09 69 66  t = 0;...}....if
24740 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73   (cackey_slots[s
24750 6c 6f 74 49 44 5d 2e 6c 61 62 65 6c 20 21 3d 20  lotID].label != 
24760 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 72 65 65 28  NULL) {....free(
24770 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
24780 74 49 44 5d 2e 6c 61 62 65 6c 29 3b 0a 09 09 09  tID].label);....
24790 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
247a0 74 49 44 5d 2e 6c 61 62 65 6c 20 3d 20 4e 55 4c  tID].label = NUL
247b0 4c 3b 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79  L;...}....cackey
247c0 5f 6d 61 72 6b 5f 73 6c 6f 74 5f 72 65 73 65 74  _mark_slot_reset
247d0 28 26 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73  (&cackey_slots[s
247e0 6c 6f 74 49 44 5d 29 3b 0a 09 09 63 61 63 6b 65  lotID]);...cacke
247f0 79 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2e  y_slots[slotID].
24800 73 6c 6f 74 5f 72 65 73 65 74 20 3d 20 30 3b 0a  slot_reset = 0;.
24810 09 7d 0a 0a 09 69 66 20 28 63 61 63 6b 65 79 5f  .}...if (cackey_
24820 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24830 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20 3d 3d  n].identities ==
24840 20 4e 55 4c 4c 29 20 7b 0a 09 09 63 61 63 6b 65   NULL) {...cacke
24850 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24860 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65 73 20  ion].identities 
24870 3d 20 63 61 63 6b 65 79 5f 72 65 61 64 5f 69 64  = cackey_read_id
24880 65 6e 74 69 74 69 65 73 28 26 63 61 63 6b 65 79  entities(&cackey
24890 5f 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20  _slots[slotID], 
248a0 26 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  &cackey_sessions
248b0 5b 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74  [hSession].ident
248c0 69 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 09 7d  ities_count);..}
248d0 0a 0a 09 69 66 20 28 70 54 65 6d 70 6c 61 74 65  ...if (pTemplate
248e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 66   != NULL) {...if
248f0 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20 30 29 20   (ulCount != 0) 
24900 7b 0a 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  {....cackey_sess
24910 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24920 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
24930 74 20 3d 20 75 6c 43 6f 75 6e 74 3b 0a 09 09 09  t = ulCount;....
24940 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
24950 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68  hSession].search
24960 5f 71 75 65 72 79 20 3d 20 6d 61 6c 6c 6f 63 28  _query = malloc(
24970 75 6c 43 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66  ulCount * sizeof
24980 28 2a 70 54 65 6d 70 6c 61 74 65 29 29 3b 0a 0a  (*pTemplate));..
24990 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b 65 79  ...memcpy(cackey
249a0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
249b0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
249c0 2c 20 70 54 65 6d 70 6c 61 74 65 2c 20 75 6c 43  , pTemplate, ulC
249d0 6f 75 6e 74 20 2a 20 73 69 7a 65 6f 66 28 2a 70  ount * sizeof(*p
249e0 54 65 6d 70 6c 61 74 65 29 29 3b 0a 09 09 09 66  Template));....f
249f0 6f 72 20 28 69 64 78 20 3d 20 30 3b 20 69 64 78  or (idx = 0; idx
24a00 20 3c 20 75 6c 43 6f 75 6e 74 3b 20 69 64 78 2b   < ulCount; idx+
24a10 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 70 54 65  +) {.....if (pTe
24a20 6d 70 6c 61 74 65 5b 69 64 78 5d 2e 75 6c 56 61  mplate[idx].ulVa
24a30 6c 75 65 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09  lueLen == 0) {..
24a40 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
24a50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
24a60 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
24a70 70 56 61 6c 75 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  pValue = NULL;..
24a80 09 09 09 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09  .....continue;..
24a90 09 09 09 7d 0a 0a 09 09 09 09 63 61 63 6b 65 79  ...}......cackey
24aa0 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
24ab0 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
24ac0 5b 69 64 78 5d 2e 70 56 61 6c 75 65 20 3d 20 6d  [idx].pValue = m
24ad0 61 6c 6c 6f 63 28 70 54 65 6d 70 6c 61 74 65 5b  alloc(pTemplate[
24ae0 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65 6e 29  idx].ulValueLen)
24af0 3b 0a 0a 09 09 09 09 69 66 20 28 63 61 63 6b 65  ;......if (cacke
24b00 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24b10 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72  ion].search_quer
24b20 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 29 20 7b  y[idx].pValue) {
24b30 0a 09 09 09 09 09 6d 65 6d 63 70 79 28 63 61 63  ......memcpy(cac
24b40 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24b50 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
24b60 65 72 79 5b 69 64 78 5d 2e 70 56 61 6c 75 65 2c  ery[idx].pValue,
24b70 20 70 54 65 6d 70 6c 61 74 65 5b 69 64 78 5d 2e   pTemplate[idx].
24b80 70 56 61 6c 75 65 2c 20 70 54 65 6d 70 6c 61 74  pValue, pTemplat
24b90 65 5b 69 64 78 5d 2e 75 6c 56 61 6c 75 65 4c 65  e[idx].ulValueLe
24ba0 6e 29 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 09  n);.....}....}..
24bb0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 63 61 63  .} else {....cac
24bc0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24bd0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75  ssion].search_qu
24be0 65 72 79 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 09  ery_count = 0;..
24bf0 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
24c00 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72  s[hSession].sear
24c10 63 68 5f 71 75 65 72 79 20 3d 20 4e 55 4c 4c 3b  ch_query = NULL;
24c20 0a 09 09 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  ...}..} else {..
24c30 09 69 66 20 28 75 6c 43 6f 75 6e 74 20 21 3d 20  .if (ulCount != 
24c40 30 29 20 7b 0a 09 09 09 63 61 63 6b 65 79 5f 6d  0) {....cackey_m
24c50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
24c60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
24c70 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
24c80 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
24c90 61 72 63 68 20 71 75 65 72 79 20 73 70 65 63 69  arch query speci
24ca0 66 69 65 64 20 61 73 20 4e 55 4c 4c 2c 20 62 75  fied as NULL, bu
24cb0 74 20 6e 75 6d 62 65 72 20 6f 66 20 71 75 65 72  t number of quer
24cc0 79 20 74 65 72 6d 73 20 6e 6f 74 20 73 70 65 63  y terms not spec
24cd0 69 66 69 65 64 20 61 73 20 30 2e 22 29 3b 0a 0a  ified as 0.");..
24ce0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
24cf0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 09  GUMENTS_BAD);...
24d00 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73 65 73 73  }....cackey_sess
24d10 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
24d20 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
24d30 74 20 3d 20 30 3b 0a 09 09 63 61 63 6b 65 79 5f  t = 0;...cackey_
24d40 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
24d50 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 20  n].search_query 
24d60 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 09 63 61 63  = NULL;..}...cac
24d70 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
24d80 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
24d90 74 69 76 65 20 3d 20 31 3b 0a 09 63 61 63 6b 65  tive = 1;..cacke
24da0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
24db0 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 63 75 72 72  ion].search_curr
24dc0 5f 69 64 20 3d 20 30 3b 0a 0a 09 6d 75 74 65 78  _id = 0;...mutex
24dd0 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
24de0 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
24df0 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
24e00 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
24e10 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
24e20 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
24e30 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
24e40 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
24e50 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
24e60 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
24e70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
24e80 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
24e90 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b 52  KR_OK (%i)", CKR
24ea0 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  _OK);...return(C
24eb0 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 73 74 61 74 69  KR_OK);.}..stati
24ec0 63 20 69 6e 74 20 63 61 63 6b 65 79 5f 70 6b 63  c int cackey_pkc
24ed0 73 31 31 5f 63 6f 6d 70 61 72 65 5f 61 74 74 72  s11_compare_attr
24ee0 69 62 75 74 65 73 28 43 4b 5f 41 54 54 52 49 42  ibutes(CK_ATTRIB
24ef0 55 54 45 20 2a 61 2c 20 43 4b 5f 41 54 54 52 49  UTE *a, CK_ATTRI
24f00 42 55 54 45 20 2a 62 29 20 7b 0a 09 75 6e 73 69  BUTE *b) {..unsi
24f10 67 6e 65 64 20 63 68 61 72 20 2a 73 6d 61 6c 6c  gned char *small
24f20 62 75 66 2c 20 2a 6c 61 72 67 65 62 75 66 3b 0a  buf, *largebuf;.
24f30 09 73 69 7a 65 5f 74 20 73 6d 61 6c 6c 62 75 66  .size_t smallbuf
24f40 5f 6c 65 6e 2c 20 6c 61 72 67 65 62 75 66 5f 6c  _len, largebuf_l
24f50 65 6e 3b 0a 0a 09 69 66 20 28 61 2d 3e 74 79 70  en;...if (a->typ
24f60 65 20 21 3d 20 62 2d 3e 74 79 70 65 29 20 7b 0a  e != b->type) {.
24f70 09 09 72 65 74 75 72 6e 28 30 29 3b 0a 09 7d 0a  ..return(0);..}.
24f80 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
24f90 52 49 4e 54 46 28 22 20 20 20 20 2e 2e 2e 20 66  RINTF("    ... f
24fa0 6f 75 6e 64 20 6d 61 74 63 68 69 6e 67 20 74 79  ound matching ty
24fb0 70 65 20 2e 2e 2e 22 29 3b 0a 0a 09 43 41 43 4b  pe ...");...CACK
24fc0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 42 55  EY_DEBUG_PRINTBU
24fd0 46 28 22 20 20 20 20 2e 2e 2e 20 6f 75 72 20 76  F("    ... our v
24fe0 61 6c 75 65 3a 22 2c 20 61 2d 3e 70 56 61 6c 75  alue:", a->pValu
24ff0 65 2c 20 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  e, a->ulValueLen
25000 29 3b 0a 0a 09 69 66 20 28 62 2d 3e 70 56 61 6c  );...if (b->pVal
25010 75 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  ue == NULL) {...
25020 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25030 4e 54 46 28 22 20 20 20 20 20 20 20 2e 2e 2e 20  NTF("       ... 
25040 66 6f 75 6e 64 20 77 69 6c 64 63 61 72 64 20 6d  found wildcard m
25050 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72  atch");....retur
25060 6e 28 31 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 61  n(1);..}...if (a
25070 2d 3e 70 56 61 6c 75 65 20 3d 3d 20 4e 55 4c 4c  ->pValue == NULL
25080 29 20 7b 0a 09 09 72 65 74 75 72 6e 28 30 29 3b  ) {...return(0);
25090 0a 09 7d 0a 0a 20 09 69 66 20 28 62 2d 3e 75 6c  ..}.. .if (b->ul
250a0 56 61 6c 75 65 4c 65 6e 20 3d 3d 20 61 2d 3e 75  ValueLen == a->u
250b0 6c 56 61 6c 75 65 4c 65 6e 20 26 26 20 6d 65 6d  lValueLen && mem
250c0 63 6d 70 28 61 2d 3e 70 56 61 6c 75 65 2c 20 62  cmp(a->pValue, b
250d0 2d 3e 70 56 61 6c 75 65 2c 20 62 2d 3e 75 6c 56  ->pValue, b->ulV
250e0 61 6c 75 65 4c 65 6e 29 20 3d 3d 20 30 29 20 7b  alueLen) == 0) {
250f0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25100 50 52 49 4e 54 46 28 22 20 20 20 20 20 20 20 2e  PRINTF("       .
25110 2e 2e 20 66 6f 75 6e 64 20 65 78 61 63 74 20 6d  .. found exact m
25120 61 74 63 68 22 29 3b 0a 0a 09 09 72 65 74 75 72  atch");....retur
25130 6e 28 31 29 3b 0a 09 7d 0a 0a 09 73 77 69 74 63  n(1);..}...switc
25140 68 20 28 61 2d 3e 74 79 70 65 29 20 7b 0a 09 09  h (a->type) {...
25150 63 61 73 65 20 43 4b 41 5f 4d 4f 44 55 4c 55 53  case CKA_MODULUS
25160 3a 0a 09 09 09 69 66 20 28 61 2d 3e 75 6c 56 61  :....if (a->ulVa
25170 6c 75 65 4c 65 6e 20 3d 3d 20 62 2d 3e 75 6c 56  lueLen == b->ulV
25180 61 6c 75 65 4c 65 6e 29 20 7b 0a 09 09 09 09 62  alueLen) {.....b
25190 72 65 61 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69  reak;....}.....i
251a0 66 20 28 61 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e  f (a->ulValueLen
251b0 20 3e 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e   > b->ulValueLen
251c0 29 20 7b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66  ) {.....smallbuf
251d0 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a 09 09   = b->pValue;...
251e0 09 09 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 20 3d  ..smallbuf_len =
251f0 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a   b->ulValueLen;.
25200 0a 09 09 09 09 6c 61 72 67 65 62 75 66 20 3d 20  .....largebuf = 
25210 61 2d 3e 70 56 61 6c 75 65 3b 0a 09 09 09 09 6c  a->pValue;.....l
25220 61 72 67 65 62 75 66 5f 6c 65 6e 20 3d 20 61 2d  argebuf_len = a-
25230 3e 75 6c 56 61 6c 75 65 4c 65 6e 3b 0a 09 09 09  >ulValueLen;....
25240 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 73 6d 61  } else {.....sma
25250 6c 6c 62 75 66 20 3d 20 61 2d 3e 70 56 61 6c 75  llbuf = a->pValu
25260 65 3b 0a 09 09 09 09 73 6d 61 6c 6c 62 75 66 5f  e;.....smallbuf_
25270 6c 65 6e 20 3d 20 61 2d 3e 75 6c 56 61 6c 75 65  len = a->ulValue
25280 4c 65 6e 3b 0a 0a 09 09 09 09 6c 61 72 67 65 62  Len;......largeb
25290 75 66 20 3d 20 62 2d 3e 70 56 61 6c 75 65 3b 0a  uf = b->pValue;.
252a0 09 09 09 09 6c 61 72 67 65 62 75 66 5f 6c 65 6e  ....largebuf_len
252b0 20 3d 20 62 2d 3e 75 6c 56 61 6c 75 65 4c 65 6e   = b->ulValueLen
252c0 3b 0a 09 09 09 7d 0a 0a 09 09 09 66 6f 72 20 28  ;....}.....for (
252d0 3b 20 6c 61 72 67 65 62 75 66 5f 6c 65 6e 20 21  ; largebuf_len !
252e0 3d 20 73 6d 61 6c 6c 62 75 66 5f 6c 65 6e 3b 20  = smallbuf_len; 
252f0 6c 61 72 67 65 62 75 66 2b 2b 2c 6c 61 72 67 65  largebuf++,large
25300 62 75 66 5f 6c 65 6e 2d 2d 29 20 7b 0a 09 09 09  buf_len--) {....
25310 09 69 66 20 28 6c 61 72 67 65 62 75 66 5b 30 5d  .if (largebuf[0]
25320 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 09 62 72   != 0) {......br
25330 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  eak;.....}....}.
25340 0a 09 09 09 69 66 20 28 6c 61 72 67 65 62 75 66  ....if (largebuf
25350 5f 6c 65 6e 20 21 3d 20 73 6d 61 6c 6c 62 75 66  _len != smallbuf
25360 5f 6c 65 6e 29 20 7b 0a 09 09 09 09 62 72 65 61  _len) {.....brea
25370 6b 3b 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28  k;....}.....if (
25380 6d 65 6d 63 6d 70 28 6c 61 72 67 65 62 75 66 2c  memcmp(largebuf,
25390 20 73 6d 61 6c 6c 62 75 66 2c 20 73 6d 61 6c 6c   smallbuf, small
253a0 62 75 66 5f 6c 65 6e 29 20 3d 3d 20 30 29 20 7b  buf_len) == 0) {
253b0 0a 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
253c0 47 5f 50 52 49 4e 54 46 28 22 20 20 20 20 20 20  G_PRINTF("      
253d0 20 2e 2e 2e 20 66 6f 75 6e 64 20 61 70 70 72 6f   ... found appro
253e0 78 69 6d 61 74 65 20 6d 61 74 63 68 22 29 3b 0a  ximate match");.
253f0 0a 09 09 09 09 72 65 74 75 72 6e 28 31 29 3b 0a  .....return(1);.
25400 09 09 09 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  ...}.....break;.
25410 09 7d 0a 0a 09 72 65 74 75 72 6e 28 30 29 3b 0a  .}...return(0);.
25420 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
25430 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
25440 69 6e 64 4f 62 6a 65 63 74 73 29 28 43 4b 5f 53  indObjects)(CK_S
25450 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
25460 65 73 73 69 6f 6e 2c 20 43 4b 5f 4f 42 4a 45 43  ession, CK_OBJEC
25470 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70 68 4f  T_HANDLE_PTR phO
25480 62 6a 65 63 74 2c 20 43 4b 5f 55 4c 4f 4e 47 20  bject, CK_ULONG 
25490 75 6c 4d 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74  ulMaxObjectCount
254a0 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70  , CK_ULONG_PTR p
254b0 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 29 20 7b  ulObjectCount) {
254c0 0a 09 73 74 72 75 63 74 20 63 61 63 6b 65 79 5f  ..struct cackey_
254d0 69 64 65 6e 74 69 74 79 20 2a 63 75 72 72 5f 69  identity *curr_i
254e0 64 3b 0a 09 43 4b 5f 41 54 54 52 49 42 55 54 45  d;..CK_ATTRIBUTE
254f0 20 2a 63 75 72 72 5f 61 74 74 72 3b 0a 09 43 4b   *curr_attr;..CK
25500 5f 55 4c 4f 4e 47 20 63 75 72 72 5f 69 64 5f 69  _ULONG curr_id_i
25510 64 78 2c 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f  dx, curr_out_id_
25520 69 64 78 2c 20 63 75 72 72 5f 61 74 74 72 5f 69  idx, curr_attr_i
25530 64 78 2c 20 73 65 73 73 5f 61 74 74 72 5f 69 64  dx, sess_attr_id
25540 78 3b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 6d 61 74  x;..CK_ULONG mat
25550 63 68 65 64 5f 63 6f 75 6e 74 2c 20 70 72 65 76  ched_count, prev
25560 5f 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74 3b 0a  _matched_count;.
25570 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61  .int mutex_retva
25580 6c 3b 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  l;.#ifdef CACKEY
25590 5f 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50  _DEBUG_SEARCH_SP
255a0 45 45 44 54 45 53 54 0a 09 73 74 72 75 63 74 20  EEDTEST..struct 
255b0 74 69 6d 65 76 61 6c 20 73 74 61 72 74 2c 20 65  timeval start, e
255c0 6e 64 3b 0a 09 75 69 6e 74 36 34 5f 74 20 73 74  nd;..uint64_t st
255d0 61 72 74 5f 69 6e 74 2c 20 65 6e 64 5f 69 6e 74  art_int, end_int
255e0 3b 0a 23 65 6e 64 69 66 0a 0a 09 43 41 43 4b 45  ;.#endif...CACKE
255f0 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25600 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
25610 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
25620 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
25630 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
25640 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
25650 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
25660 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
25670 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
25680 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c  D);..}...if (pul
25690 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20 4e  ObjectCount == N
256a0 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
256b0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
256c0 72 6f 72 2e 20 20 70 75 6c 4f 62 6a 65 63 74 43  ror.  pulObjectC
256d0 6f 75 6e 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  ount is NULL.");
256e0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
256f0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
25700 7d 0a 0a 09 69 66 20 28 70 68 4f 62 6a 65 63 74  }...if (phObject
25710 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 75 6c 4d 61   == NULL && ulMa
25720 78 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d 3d 20  xObjectCount == 
25730 30 29 20 7b 0a 09 09 2f 2a 20 53 68 6f 72 74 20  0) {.../* Short 
25740 63 69 72 63 75 69 74 2c 20 69 66 20 7a 65 72 6f  circuit, if zero
25750 20 6f 62 6a 65 63 74 73 20 77 65 72 65 20 73 70   objects were sp
25760 65 63 69 66 69 65 64 20 72 65 74 75 72 6e 20 7a  ecified return z
25770 65 72 6f 20 69 74 65 6d 73 20 69 6d 6d 65 64 69  ero items immedi
25780 61 74 65 6c 79 20 2a 2f 0a 09 09 2a 70 75 6c 4f  ately */...*pulO
25790 62 6a 65 63 74 43 6f 75 6e 74 20 3d 20 30 3b 0a  bjectCount = 0;.
257a0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
257b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
257c0 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28 73  g CKR_OK (%i) (s
257d0 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c 20  hort circuit)", 
257e0 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74 75  CKR_OK);....retu
257f0 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a 0a  rn(CKR_OK);..}..
25800 09 69 66 20 28 70 68 4f 62 6a 65 63 74 20 3d 3d  .if (phObject ==
25810 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45   NULL) {...CACKE
25820 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
25830 45 72 72 6f 72 2e 20 20 70 68 4f 62 6a 65 63 74  Error.  phObject
25840 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09   is NULL.");....
25850 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d  return(CKR_ARGUM
25860 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09  ENTS_BAD);..}...
25870 69 66 20 28 75 6c 4d 61 78 4f 62 6a 65 63 74 43  if (ulMaxObjectC
25880 6f 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 43  ount == 0) {...C
25890 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
258a0 54 46 28 22 45 72 72 6f 72 2e 20 20 4d 61 78 69  TF("Error.  Maxi
258b0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 6f 62  mum number of ob
258c0 6a 65 63 74 73 20 73 70 65 63 69 66 69 65 64 20  jects specified 
258d0 61 73 20 7a 65 72 6f 2e 22 29 3b 0a 0a 09 09 72  as zero.");....r
258e0 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45  eturn(CKR_ARGUME
258f0 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 69  NTS_BAD);..}...i
25900 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d 20 30  f (hSession == 0
25910 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e 3d 20   || hSession >= 
25920 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73  (sizeof(cackey_s
25930 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a 65 6f  essions) / sizeo
25940 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  f(cackey_session
25950 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43 4b  s[0]))) {...CACK
25960 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
25970 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
25980 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 22 29   out of range.")
25990 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
259a0 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  R_SESSION_HANDLE
259b0 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09  _INVALID);..}...
259c0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
259d0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b  ackey_mutex_lock
259e0 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29  (cackey_biglock)
259f0 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74  ;..if (mutex_ret
25a00 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41  val != 0) {...CA
25a10 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
25a20 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
25a30 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
25a40 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
25a50 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
25a60 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73  .if (!cackey_ses
25a70 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
25a80 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b  active) {...cack
25a90 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
25aa0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
25ab0 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
25ac0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
25ad0 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74   Session not act
25ae0 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  ive.");......ret
25af0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
25b00 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
25b10 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ..}...if (!cacke
25b20 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
25b30 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63 74 69  ion].search_acti
25b40 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
25b50 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
25b60 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
25b70 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
25b80 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 61  NTF("Error.  Sea
25b90 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  rch not active."
25ba0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
25bb0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
25bc0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
25bd0 7d 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  }..#ifdef CACKEY
25be0 5f 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50  _DEBUG_SEARCH_SP
25bf0 45 45 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65  EEDTEST..gettime
25c00 6f 66 64 61 79 28 26 73 74 61 72 74 2c 20 4e 55  ofday(&start, NU
25c10 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 63 75  LL);.#endif...cu
25c20 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78 20 3d 20  rr_out_id_idx = 
25c30 30 3b 0a 09 66 6f 72 20 28 63 75 72 72 5f 69 64  0;..for (curr_id
25c40 5f 69 64 78 20 3d 20 63 61 63 6b 65 79 5f 73 65  _idx = cackey_se
25c50 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
25c60 2e 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 3b  .search_curr_id;
25c70 20 63 75 72 72 5f 69 64 5f 69 64 78 20 3c 20 63   curr_id_idx < c
25c80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
25c90 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74  Session].identit
25ca0 69 65 73 5f 63 6f 75 6e 74 20 26 26 20 75 6c 4d  ies_count && ulM
25cb0 61 78 4f 62 6a 65 63 74 43 6f 75 6e 74 3b 20 63  axObjectCount; c
25cc0 75 72 72 5f 69 64 5f 69 64 78 2b 2b 29 20 7b 0a  urr_id_idx++) {.
25cd0 09 09 63 75 72 72 5f 69 64 20 3d 20 26 63 61 63  ..curr_id = &cac
25ce0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
25cf0 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69 65  ssion].identitie
25d00 73 5b 63 75 72 72 5f 69 64 5f 69 64 78 5d 3b 0a  s[curr_id_idx];.
25d10 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
25d20 50 52 49 4e 54 46 28 22 50 72 6f 63 65 73 73 69  PRINTF("Processi
25d30 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 6c 75 22  ng identity:%lu"
25d40 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
25d50 29 20 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a  ) curr_id_idx);.
25d60 0a 09 09 6d 61 74 63 68 65 64 5f 63 6f 75 6e 74  ...matched_count
25d70 20 3d 20 30 3b 0a 0a 09 09 66 6f 72 20 28 63 75   = 0;....for (cu
25d80 72 72 5f 61 74 74 72 5f 69 64 78 20 3d 20 30 3b  rr_attr_idx = 0;
25d90 20 63 75 72 72 5f 61 74 74 72 5f 69 64 78 20 3c   curr_attr_idx <
25da0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
25db0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65 61 72 63  [hSession].searc
25dc0 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74 3b 20 63  h_query_count; c
25dd0 75 72 72 5f 61 74 74 72 5f 69 64 78 2b 2b 29 20  urr_attr_idx++) 
25de0 7b 0a 09 09 09 70 72 65 76 5f 6d 61 74 63 68 65  {....prev_matche
25df0 64 5f 63 6f 75 6e 74 20 3d 20 6d 61 74 63 68 65  d_count = matche
25e00 64 5f 63 6f 75 6e 74 3b 0a 0a 09 09 09 63 75 72  d_count;.....cur
25e10 72 5f 61 74 74 72 20 3d 20 26 63 61 63 6b 65 79  r_attr = &cackey
25e20 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
25e30 6f 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79  on].search_query
25e40 5b 63 75 72 72 5f 61 74 74 72 5f 69 64 78 5d 3b  [curr_attr_idx];
25e50 0a 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55  .....CACKEY_DEBU
25e60 47 5f 50 52 49 4e 54 46 28 22 20 20 43 68 65 63  G_PRINTF("  Chec
25e70 6b 69 6e 67 20 66 6f 72 20 61 74 74 72 69 62 75  king for attribu
25e80 74 65 20 25 73 20 28 30 78 25 30 38 6c 78 29 20  te %s (0x%08lx) 
25e90 69 6e 20 69 64 65 6e 74 69 74 79 3a 25 69 2e 2e  in identity:%i..
25ea0 2e 22 2c 20 43 41 43 4b 45 59 5f 44 45 42 55 47  .", CACKEY_DEBUG
25eb0 5f 46 55 4e 43 5f 41 54 54 52 49 42 55 54 45 5f  _FUNC_ATTRIBUTE_
25ec0 54 4f 5f 53 54 52 28 63 75 72 72 5f 61 74 74 72  TO_STR(curr_attr
25ed0 2d 3e 74 79 70 65 29 2c 20 28 75 6e 73 69 67 6e  ->type), (unsign
25ee0 65 64 20 6c 6f 6e 67 29 20 63 75 72 72 5f 61 74  ed long) curr_at
25ef0 74 72 2d 3e 74 79 70 65 2c 20 28 69 6e 74 29 20  tr->type, (int) 
25f00 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09  curr_id_idx);...
25f10 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
25f20 49 4e 54 42 55 46 28 22 20 20 20 20 56 61 6c 75  INTBUF("    Valu
25f30 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 3a 22 2c  e looking for:",
25f40 20 63 75 72 72 5f 61 74 74 72 2d 3e 70 56 61 6c   curr_attr->pVal
25f50 75 65 2c 20 63 75 72 72 5f 61 74 74 72 2d 3e 75  ue, curr_attr->u
25f60 6c 56 61 6c 75 65 4c 65 6e 29 3b 0a 0a 09 09 09  lValueLen);.....
25f70 66 6f 72 20 28 73 65 73 73 5f 61 74 74 72 5f 69  for (sess_attr_i
25f80 64 78 20 3d 20 30 3b 20 73 65 73 73 5f 61 74 74  dx = 0; sess_att
25f90 72 5f 69 64 78 20 3c 20 63 75 72 72 5f 69 64 2d  r_idx < curr_id-
25fa0 3e 61 74 74 72 69 62 75 74 65 73 5f 63 6f 75 6e  >attributes_coun
25fb0 74 3b 20 73 65 73 73 5f 61 74 74 72 5f 69 64 78  t; sess_attr_idx
25fc0 2b 2b 29 20 7b 0a 09 09 09 09 69 66 20 28 63 61  ++) {.....if (ca
25fd0 63 6b 65 79 5f 70 6b 63 73 31 31 5f 63 6f 6d 70  ckey_pkcs11_comp
25fe0 61 72 65 5f 61 74 74 72 69 62 75 74 65 73 28 26  are_attributes(&
25ff0 63 75 72 72 5f 69 64 2d 3e 61 74 74 72 69 62 75  curr_id->attribu
26000 74 65 73 5b 73 65 73 73 5f 61 74 74 72 5f 69 64  tes[sess_attr_id
26010 78 5d 2c 20 63 75 72 72 5f 61 74 74 72 29 29 20  x], curr_attr)) 
26020 7b 0a 09 09 09 09 09 6d 61 74 63 68 65 64 5f 63  {......matched_c
26030 6f 75 6e 74 2b 2b 3b 0a 0a 09 09 09 09 09 62 72  ount++;.......br
26040 65 61 6b 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 0a  eak;.....}....}.
26050 0a 09 09 09 2f 2a 20 49 66 20 74 68 65 20 61 74  ..../* If the at
26060 74 72 69 62 75 74 65 20 63 6f 75 6c 64 20 6e 6f  tribute could no
26070 74 20 62 65 20 6d 61 74 63 68 65 64 2c 20 64 6f  t be matched, do
26080 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 74 63   not try to matc
26090 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 74 74  h additional att
260a0 72 69 62 75 74 65 73 20 2a 2f 0a 09 09 09 69 66  ributes */....if
260b0 20 28 70 72 65 76 5f 6d 61 74 63 68 65 64 5f 63   (prev_matched_c
260c0 6f 75 6e 74 20 3d 3d 20 6d 61 74 63 68 65 64 5f  ount == matched_
260d0 63 6f 75 6e 74 29 20 7b 0a 09 09 09 09 62 72 65  count) {.....bre
260e0 61 6b 3b 0a 09 09 09 7d 0a 09 09 7d 0a 0a 09 09  ak;....}...}....
260f0 69 66 20 28 6d 61 74 63 68 65 64 5f 63 6f 75 6e  if (matched_coun
26100 74 20 3d 3d 20 63 61 63 6b 65 79 5f 73 65 73 73  t == cackey_sess
26110 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
26120 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e  earch_query_coun
26130 74 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f 44  t) {....CACKEY_D
26140 45 42 55 47 5f 50 52 49 4e 54 46 28 22 20 20 2e  EBUG_PRINTF("  .
26150 2e 2e 20 41 6c 6c 20 25 69 20 61 74 74 72 69 62  .. All %i attrib
26160 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72  utes checked for
26170 20 66 6f 75 6e 64 2c 20 61 64 64 69 6e 67 20 69   found, adding i
26180 64 65 6e 74 69 74 79 3a 25 69 20 74 6f 20 72 65  dentity:%i to re
26190 74 75 72 6e 65 64 20 6c 69 73 74 22 2c 20 28 69  turned list", (i
261a0 6e 74 29 20 63 61 63 6b 65 79 5f 73 65 73 73 69  nt) cackey_sessi
261b0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
261c0 61 72 63 68 5f 71 75 65 72 79 5f 63 6f 75 6e 74  arch_query_count
261d0 2c 20 28 69 6e 74 29 20 63 75 72 72 5f 69 64 5f  , (int) curr_id_
261e0 69 64 78 29 3b 0a 0a 09 09 09 70 68 4f 62 6a 65  idx);.....phObje
261f0 63 74 5b 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ct[curr_out_id_i
26200 64 78 5d 20 3d 20 63 75 72 72 5f 69 64 5f 69 64  dx] = curr_id_id
26210 78 20 2b 20 31 3b 0a 0a 09 09 09 75 6c 4d 61 78  x + 1;.....ulMax
26220 4f 62 6a 65 63 74 43 6f 75 6e 74 2d 2d 3b 0a 0a  ObjectCount--;..
26230 09 09 09 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69  ...curr_out_id_i
26240 64 78 2b 2b 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  dx++;...} else {
26250 0a 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
26260 5f 50 52 49 4e 54 46 28 22 20 20 2e 2e 2e 20 4e  _PRINTF("  ... N
26270 6f 74 20 61 6c 6c 20 25 69 20 28 6f 6e 6c 79 20  ot all %i (only 
26280 66 6f 75 6e 64 20 25 69 29 20 61 74 74 72 69 62  found %i) attrib
26290 75 74 65 73 20 63 68 65 63 6b 65 64 20 66 6f 72  utes checked for
262a0 20 66 6f 75 6e 64 2c 20 6e 6f 74 20 61 64 64 69   found, not addi
262b0 6e 67 20 69 64 65 6e 74 69 74 79 3a 25 69 22 2c  ng identity:%i",
262c0 20 28 69 6e 74 29 20 63 61 63 6b 65 79 5f 73 65   (int) cackey_se
262d0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
262e0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f 63 6f  .search_query_co
262f0 75 6e 74 2c 20 28 69 6e 74 29 20 6d 61 74 63 68  unt, (int) match
26300 65 64 5f 63 6f 75 6e 74 2c 20 28 69 6e 74 29 20  ed_count, (int) 
26310 63 75 72 72 5f 69 64 5f 69 64 78 29 3b 0a 09 09  curr_id_idx);...
26320 7d 0a 09 7d 0a 09 63 61 63 6b 65 79 5f 73 65 73  }..}..cackey_ses
26330 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26340 73 65 61 72 63 68 5f 63 75 72 72 5f 69 64 20 3d  search_curr_id =
26350 20 63 75 72 72 5f 69 64 5f 69 64 78 3b 0a 09 2a   curr_id_idx;..*
26360 70 75 6c 4f 62 6a 65 63 74 43 6f 75 6e 74 20 3d  pulObjectCount =
26370 20 63 75 72 72 5f 6f 75 74 5f 69 64 5f 69 64 78   curr_out_id_idx
26380 3b 0a 0a 23 69 66 64 65 66 20 43 41 43 4b 45 59  ;..#ifdef CACKEY
26390 5f 44 45 42 55 47 5f 53 45 41 52 43 48 5f 53 50  _DEBUG_SEARCH_SP
263a0 45 45 44 54 45 53 54 0a 09 67 65 74 74 69 6d 65  EEDTEST..gettime
263b0 6f 66 64 61 79 28 26 65 6e 64 2c 20 4e 55 4c 4c  ofday(&end, NULL
263c0 29 3b 0a 09 73 74 61 72 74 5f 69 6e 74 20 3d 20  );..start_int = 
263d0 28 73 74 61 72 74 2e 74 76 5f 73 65 63 20 2a 20  (start.tv_sec * 
263e0 31 30 30 30 30 30 30 29 20 2b 20 73 74 61 72 74  1000000) + start
263f0 2e 74 76 5f 75 73 65 63 3b 0a 09 65 6e 64 5f 69  .tv_usec;..end_i
26400 6e 74 20 3d 20 28 65 6e 64 2e 74 76 5f 73 65 63  nt = (end.tv_sec
26410 20 2a 20 31 30 30 30 30 30 30 29 20 2b 20 65 6e   * 1000000) + en
26420 64 2e 74 76 5f 75 73 65 63 3b 0a 09 66 70 72 69  d.tv_usec;..fpri
26430 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 65 61  ntf(stderr, "Sea
26440 72 63 68 20 74 6f 6f 6b 20 25 6c 75 20 6d 69 63  rch took %lu mic
26450 72 6f 73 65 63 6f 6e 64 73 5c 6e 22 2c 20 28 75  roseconds\n", (u
26460 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 28 65  nsigned long) (e
26470 6e 64 5f 69 6e 74 20 2d 20 73 74 61 72 74 5f 69  nd_int - start_i
26480 6e 74 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 6d  nt));.#endif...m
26490 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
264a0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
264b0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
264c0 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72 65  );..if (mutex_re
264d0 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43  tval != 0) {...C
264e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
264f0 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f  TF("Error.  Unlo
26500 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
26510 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
26520 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
26530 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
26540 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
26550 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 2c 20  ng CKR_OK (%i), 
26560 6e 75 6d 20 6f 62 6a 65 63 74 73 20 3d 20 25 6c  num objects = %l
26570 75 22 2c 20 43 4b 52 5f 4f 4b 2c 20 2a 70 75 6c  u", CKR_OK, *pul
26580 4f 62 6a 65 63 74 43 6f 75 6e 74 29 3b 0a 0a 09  ObjectCount);...
26590 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
265a0 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e  }..CK_DEFINE_FUN
265b0 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 46  CTION(CK_RV, C_F
265c0 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 29  indObjectsFinal)
265d0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
265e0 4c 45 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09  LE hSession) {..
265f0 43 4b 5f 55 4c 4f 4e 47 20 69 64 78 3b 0a 09 69  CK_ULONG idx;..i
26600 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
26610 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
26620 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
26630 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
26640 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
26650 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26660 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
26670 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
26680 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
26690 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
266a0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
266b0 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
266c0 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
266d0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
266e0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
266f0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
26700 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
26710 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26720 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
26730 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
26740 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
26750 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
26760 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
26770 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
26780 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
26790 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
267a0 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
267b0 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
267c0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
267d0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
267e0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
267f0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
26800 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
26810 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
26820 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
26830 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
26840 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
26850 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
26860 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
26870 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
26880 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
26890 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
268a0 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
268b0 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
268c0 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
268d0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
268e0 73 73 69 6f 6e 5d 2e 73 65 61 72 63 68 5f 61 63  ssion].search_ac
268f0 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
26900 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
26910 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
26920 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
26930 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
26940 65 61 72 63 68 20 6e 6f 74 20 61 63 74 69 76 65  earch not active
26950 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
26960 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
26970 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
26980 0a 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73  ..}...cackey_ses
26990 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
269a0 73 65 61 72 63 68 5f 61 63 74 69 76 65 20 3d 20  search_active = 
269b0 30 3b 0a 0a 09 66 6f 72 20 28 69 64 78 20 3d 20  0;...for (idx = 
269c0 30 3b 20 69 64 78 20 3c 20 63 61 63 6b 65 79 5f  0; idx < cackey_
269d0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
269e0 6e 5d 2e 73 65 61 72 63 68 5f 71 75 65 72 79 5f  n].search_query_
269f0 63 6f 75 6e 74 3b 20 69 64 78 2b 2b 29 20 7b 0a  count; idx++) {.
26a00 09 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
26a10 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26a20 73 65 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78  search_query[idx
26a30 5d 2e 70 56 61 6c 75 65 29 20 7b 0a 09 09 09 66  ].pValue) {....f
26a40 72 65 65 28 63 61 63 6b 65 79 5f 73 65 73 73 69  ree(cackey_sessi
26a50 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 65  ons[hSession].se
26a60 61 72 63 68 5f 71 75 65 72 79 5b 69 64 78 5d 2e  arch_query[idx].
26a70 70 56 61 6c 75 65 29 3b 0a 09 09 7d 0a 09 7d 0a  pValue);...}..}.
26a80 0a 09 69 66 20 28 63 61 63 6b 65 79 5f 73 65 73  ..if (cackey_ses
26a90 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
26aa0 73 65 61 72 63 68 5f 71 75 65 72 79 29 20 7b 0a  search_query) {.
26ab0 09 09 66 72 65 65 28 63 61 63 6b 65 79 5f 73 65  ..free(cackey_se
26ac0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
26ad0 2e 73 65 61 72 63 68 5f 71 75 65 72 79 29 3b 0a  .search_query);.
26ae0 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
26af0 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
26b00 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
26b10 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
26b20 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
26b30 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
26b40 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
26b50 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
26b60 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
26b70 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
26b80 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
26b90 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
26ba0 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
26bb0 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
26bc0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
26bd0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
26be0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
26bf0 5f 45 6e 63 72 79 70 74 49 6e 69 74 29 28 43 4b  _EncryptInit)(CK
26c00 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
26c10 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43  hSession, CK_MEC
26c20 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68  HANISM_PTR pMech
26c30 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54  anism, CK_OBJECT
26c40 5f 48 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a  _HANDLE hKey) {.
26c50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
26c60 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
26c70 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
26c80 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
26c90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
26ca0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
26cb0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
26cc0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
26cd0 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
26ce0 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
26cf0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26d00 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
26d10 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26d20 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
26d30 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
26d40 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
26d50 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
26d60 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
26d70 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
26d80 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
26d90 43 5f 45 6e 63 72 79 70 74 29 28 43 4b 5f 53 45  C_Encrypt)(CK_SE
26da0 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
26db0 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
26dc0 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  TR pData, CK_ULO
26dd0 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b  NG ulDataLen, CK
26de0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
26df0 70 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f  ptedData, CK_ULO
26e00 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
26e10 74 65 64 44 61 74 61 4c 65 6e 29 20 7b 0a 09 43  tedDataLen) {..C
26e20 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
26e30 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
26e40 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
26e50 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
26e60 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
26e70 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
26e80 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
26e90 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
26ea0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
26eb0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
26ec0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
26ed0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
26ee0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
26ef0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
26f00 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
26f10 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
26f20 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
26f30 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
26f40 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
26f50 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
26f60 45 6e 63 72 79 70 74 55 70 64 61 74 65 29 28 43  EncryptUpdate)(C
26f70 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
26f80 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59   hSession, CK_BY
26f90 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b  TE_PTR pPart, CK
26fa0 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e  _ULONG ulPartLen
26fb0 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45  , CK_BYTE_PTR pE
26fc0 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
26fd0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e  _ULONG_PTR pulEn
26fe0 63 72 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20  cryptedPartLen) 
26ff0 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
27000 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
27010 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
27020 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
27030 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27040 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
27050 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
27060 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27070 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
27080 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
27090 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
270a0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
270b0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
270c0 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
270d0 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
270e0 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
270f0 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
27100 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
27110 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
27120 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
27130 2c 20 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c  , C_EncryptFinal
27140 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
27150 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
27160 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 45  _BYTE_PTR pLastE
27170 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b  ncryptedPart, CK
27180 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 4c 61  _ULONG_PTR pulLa
27190 73 74 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  stEncryptedPartL
271a0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
271b0 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
271c0 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
271d0 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
271e0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
271f0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
27200 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
27210 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
27220 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
27230 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
27240 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
27250 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
27260 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
27270 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
27280 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
27290 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
272a0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
272b0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
272c0 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
272d0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
272e0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 49  K_RV, C_DecryptI
272f0 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  nit)(CK_SESSION_
27300 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
27310 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
27320 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
27330 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
27340 4b 65 79 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65  Key) {..int mute
27350 78 5f 72 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79  x_retval;...hKey
27360 2d 2d 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  --;...CACKEY_DEB
27370 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
27380 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
27390 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
273a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
273b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
273c0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
273d0 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
273e0 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
273f0 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
27400 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69  }...if (pMechani
27410 73 6d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  sm == NULL) {...
27420 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27430 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d 65 63  NTF("Error. pMec
27440 68 61 6e 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22  hanism is NULL."
27450 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27460 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
27470 0a 09 7d 0a 0a 09 69 66 20 28 70 4d 65 63 68 61  ..}...if (pMecha
27480 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20  nism->mechanism 
27490 21 3d 20 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29  != CKM_RSA_PKCS)
274a0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
274b0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
274c0 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63   pMechanism->mec
274d0 68 61 6e 69 73 6d 20 6e 6f 74 20 73 70 65 63 69  hanism not speci
274e0 66 69 65 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f  fied as CKM_RSA_
274f0 50 4b 43 53 22 29 3b 0a 0a 09 09 72 65 74 75 72  PKCS");....retur
27500 6e 28 43 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f  n(CKR_MECHANISM_
27510 50 41 52 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a  PARAM_INVALID);.
27520 09 7d 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f  .}...if (hSessio
27530 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69  n == 0 || hSessi
27540 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61  on >= (sizeof(ca
27550 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f  ckey_sessions) /
27560 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73   sizeof(cackey_s
27570 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a  essions[0]))) {.
27580 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
27590 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
275a0 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61  ession out of ra
275b0 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74  nge.");......ret
275c0 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f  urn(CKR_SESSION_
275d0 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b  HANDLE_INVALID);
275e0 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76  ..}...mutex_retv
275f0 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65  al = cackey_mute
27600 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  x_lock(cackey_bi
27610 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
27620 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
27630 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
27640 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
27650 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e   Locking failed.
27660 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
27670 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29  R_GENERAL_ERROR)
27680 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b  ;..}...if (!cack
27690 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
276a0 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
276b0 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75  ..cackey_mutex_u
276c0 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67  nlock(cackey_big
276d0 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59  lock);....CACKEY
276e0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
276f0 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e  rror.  Session n
27700 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09  ot active.");...
27710 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 53 45  ...return(CKR_SE
27720 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56  SSION_HANDLE_INV
27730 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  ALID);..}...if (
27740 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27750 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
27760 74 5f 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  t_active) {...ca
27770 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
27780 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
27790 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
277a0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
277b0 2e 20 20 44 65 63 72 79 70 74 20 61 6c 72 65 61  .  Decrypt alrea
277c0 64 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 22  dy in progress."
277d0 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
277e0 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 41 43 54  KR_OPERATION_ACT
277f0 49 56 45 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68  IVE);..}...if (h
27800 4b 65 79 20 3e 3d 20 63 61 63 6b 65 79 5f 73 65  Key >= cackey_se
27810 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
27820 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
27830 74 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  t) {...cackey_mu
27840 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
27850 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
27860 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
27870 54 46 28 22 45 72 72 6f 72 2e 20 20 4b 65 79 20  TF("Error.  Key 
27880 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 72 61  handle out of ra
27890 6e 67 65 20 28 72 65 71 75 65 73 74 65 64 20 6b  nge (requested k
278a0 65 79 20 25 6c 75 2c 20 6f 6e 6c 79 20 25 6c 75  ey %lu, only %lu
278b0 20 69 64 65 6e 74 69 74 69 65 73 20 61 76 61 69   identities avai
278c0 6c 61 62 6c 65 29 2e 22 2c 20 28 75 6e 73 69 67  lable).", (unsig
278d0 6e 65 64 20 6c 6f 6e 67 29 20 68 4b 65 79 2c 20  ned long) hKey, 
278e0 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20  (unsigned long) 
278f0 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27900 68 53 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69  hSession].identi
27910 74 69 65 73 5f 63 6f 75 6e 74 29 3b 0a 0a 09 09  ties_count);....
27920 72 65 74 75 72 6e 28 43 4b 52 5f 4b 45 59 5f 48  return(CKR_KEY_H
27930 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
27940 09 7d 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  .}...cackey_sess
27950 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
27960 65 63 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20  ecrypt_active = 
27970 31 3b 0a 0a 09 63 61 63 6b 65 79 5f 73 65 73 73  1;...cackey_sess
27980 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64  ions[hSession].d
27990 65 63 72 79 70 74 5f 6d 65 63 68 61 6e 69 73 6d  ecrypt_mechanism
279a0 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 6d   = pMechanism->m
279b0 65 63 68 61 6e 69 73 6d 3b 0a 09 63 61 63 6b 65  echanism;..cacke
279c0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
279d0 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63  ion].decrypt_mec
279e0 68 5f 70 61 72 6d 20 3d 20 70 4d 65 63 68 61 6e  h_parm = pMechan
279f0 69 73 6d 2d 3e 70 50 61 72 61 6d 65 74 65 72 3b  ism->pParameter;
27a00 0a 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  ..cackey_session
27a10 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72  s[hSession].decr
27a20 79 70 74 5f 6d 65 63 68 5f 70 61 72 6d 6c 65 6e  ypt_mech_parmlen
27a30 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e 75   = pMechanism->u
27a40 6c 50 61 72 61 6d 65 74 65 72 4c 65 6e 3b 0a 09  lParameterLen;..
27a50 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
27a60 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70  hSession].decryp
27a70 74 5f 69 64 65 6e 74 69 74 79 20 3d 20 26 63 61  t_identity = &ca
27a80 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
27a90 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
27aa0 65 73 5b 68 4b 65 79 5d 3b 0a 0a 09 6d 75 74 65  es[hKey];...mute
27ab0 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
27ac0 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63  y_mutex_unlock(c
27ad0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
27ae0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
27af0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
27b00 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
27b10 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69  "Error.  Unlocki
27b20 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
27b30 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45  .return(CKR_GENE
27b40 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a  RAL_ERROR);..}..
27b50 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27b60 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
27b70 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43 4b  CKR_OK (%i)", CK
27b80 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e 28  R_OK);...return(
27b90 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f 44  CKR_OK);.}..CK_D
27ba0 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
27bb0 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74 29  K_RV, C_Decrypt)
27bc0 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
27bd0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
27be0 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79 70  BYTE_PTR pEncryp
27bf0 74 65 64 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  tedData, CK_ULON
27c00 47 20 75 6c 45 6e 63 72 79 70 74 65 64 44 61 74  G ulEncryptedDat
27c10 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
27c20 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
27c30 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e  G_PTR pulDataLen
27c40 29 20 7b 0a 09 43 4b 5f 55 4c 4f 4e 47 20 64 61  ) {..CK_ULONG da
27c50 74 61 6c 65 6e 5f 75 70 64 61 74 65 2c 20 64 61  talen_update, da
27c60 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a 09 43 4b  talen_final;..CK
27c70 5f 52 56 20 64 65 63 72 79 70 74 5f 72 65 74 3b  _RV decrypt_ret;
27c80 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76  ..int mutex_retv
27c90 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  al;...CACKEY_DEB
27ca0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
27cb0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
27cc0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
27cd0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
27ce0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
27cf0 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
27d00 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
27d10 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
27d20 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
27d30 7d 0a 0a 09 69 66 20 28 70 75 6c 44 61 74 61 4c  }...if (pulDataL
27d40 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  en == NULL) {...
27d50 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
27d60 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75 6c 44  NTF("Error. pulD
27d70 61 74 61 4c 65 6e 20 69 73 20 4e 55 4c 4c 2e 22  ataLen is NULL."
27d80 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
27d90 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
27da0 0a 09 7d 0a 0a 09 64 61 74 61 6c 65 6e 5f 75 70  ..}...datalen_up
27db0 64 61 74 65 20 3d 20 2a 70 75 6c 44 61 74 61 4c  date = *pulDataL
27dc0 65 6e 3b 0a 0a 09 64 65 63 72 79 70 74 5f 72 65  en;...decrypt_re
27dd0 74 20 3d 20 43 5f 44 65 63 72 79 70 74 55 70 64  t = C_DecryptUpd
27de0 61 74 65 28 68 53 65 73 73 69 6f 6e 2c 20 70 45  ate(hSession, pE
27df0 6e 63 72 79 70 74 65 64 44 61 74 61 2c 20 75 6c  ncryptedData, ul
27e00 45 6e 63 72 79 70 74 65 64 44 61 74 61 4c 65 6e  EncryptedDataLen
27e10 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61 6c 65  , pData, &datale
27e20 6e 5f 75 70 64 61 74 65 29 3b 0a 09 69 66 20 28  n_update);..if (
27e30 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20 43  decrypt_ret != C
27e40 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45  KR_OK) {...CACKE
27e50 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
27e60 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74 55  Error.  DecryptU
27e70 70 64 61 74 65 28 29 20 72 65 74 75 72 6e 65 64  pdate() returned
27e80 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
27e90 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
27ea0 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72   long) decrypt_r
27eb0 65 74 29 3b 0a 0a 09 09 69 66 20 28 64 65 63 72  et);....if (decr
27ec0 79 70 74 5f 72 65 74 20 21 3d 20 43 4b 52 5f 42  ypt_ret != CKR_B
27ed0 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 29  UFFER_TOO_SMALL)
27ee0 20 7b 0a 09 09 09 2f 2a 20 54 65 72 6d 69 6e 61   {..../* Termina
27ef0 74 65 20 64 65 63 72 79 70 74 69 6f 6e 20 6f 70  te decryption op
27f00 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 09 09 09 6d  eration */.....m
27f10 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61  utex_retval = ca
27f20 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28  ckey_mutex_lock(
27f30 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
27f40 0a 09 09 09 69 66 20 28 6d 75 74 65 78 5f 72 65  ....if (mutex_re
27f50 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09  tval != 0) {....
27f60 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
27f70 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
27f80 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
27f90 0a 0a 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
27fa0 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b  _GENERAL_ERROR);
27fb0 0a 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63  ....}.....if (!c
27fc0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
27fd0 53 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29  Session].active)
27fe0 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d 75   {.....cackey_mu
27ff0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
28000 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09  y_biglock);.....
28010 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
28020 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65  INTF("Error.  Se
28030 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65  ssion not active
28040 2e 22 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75  .");........retu
28050 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48  rn(CKR_SESSION_H
28060 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a  ANDLE_INVALID);.
28070 09 09 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61  ...}.....if (!ca
28080 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
28090 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f  ession].decrypt_
280a0 61 63 74 69 76 65 29 20 7b 0a 09 09 09 09 63 61  active) {.....ca
280b0 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
280c0 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
280d0 29 3b 0a 0a 09 09 09 09 43 41 43 4b 45 59 5f 44  );......CACKEY_D
280e0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
280f0 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f 74  or.  Decrypt not
28100 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09   active.");.....
28110 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50  ...return(CKR_OP
28120 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54  ERATION_NOT_INIT
28130 49 41 4c 49 5a 45 44 29 3b 0a 09 09 09 7d 0a 0a  IALIZED);....}..
28140 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  ...cackey_sessio
28150 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
28160 72 79 70 74 5f 61 63 74 69 76 65 20 3d 20 30 3b  rypt_active = 0;
28170 0a 0a 09 09 09 6d 75 74 65 78 5f 72 65 74 76 61  .....mutex_retva
28180 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
28190 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
281a0 69 67 6c 6f 63 6b 29 3b 0a 09 09 09 69 66 20 28  iglock);....if (
281b0 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20  mutex_retval != 
281c0 30 29 20 7b 0a 09 09 09 09 43 41 43 4b 45 59 5f  0) {.....CACKEY_
281d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
281e0 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20  ror.  Unlocking 
281f0 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 09 09  failed.");......
28200 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28210 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 09 7d 0a  AL_ERROR);....}.
28220 09 09 7d 0a 0a 09 09 72 65 74 75 72 6e 28 64 65  ..}....return(de
28230 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a 0a  crypt_ret);..}..
28240 09 69 66 20 28 70 44 61 74 61 29 20 7b 0a 09 09  .if (pData) {...
28250 70 44 61 74 61 20 2b 3d 20 64 61 74 61 6c 65 6e  pData += datalen
28260 5f 75 70 64 61 74 65 3b 0a 09 7d 0a 09 64 61 74  _update;..}..dat
28270 61 6c 65 6e 5f 66 69 6e 61 6c 20 3d 20 2a 70 75  alen_final = *pu
28280 6c 44 61 74 61 4c 65 6e 20 2d 20 64 61 74 61 6c  lDataLen - datal
28290 65 6e 5f 75 70 64 61 74 65 3b 0a 0a 09 64 65 63  en_update;...dec
282a0 72 79 70 74 5f 72 65 74 20 3d 20 43 5f 44 65 63  rypt_ret = C_Dec
282b0 72 79 70 74 46 69 6e 61 6c 28 68 53 65 73 73 69  ryptFinal(hSessi
282c0 6f 6e 2c 20 70 44 61 74 61 2c 20 26 64 61 74 61  on, pData, &data
282d0 6c 65 6e 5f 66 69 6e 61 6c 29 3b 0a 09 69 66 20  len_final);..if 
282e0 28 64 65 63 72 79 70 74 5f 72 65 74 20 21 3d 20  (decrypt_ret != 
282f0 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b  CKR_OK) {...CACK
28300 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28310 22 45 72 72 6f 72 2e 20 20 44 65 63 72 79 70 74  "Error.  Decrypt
28320 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e 65 64  Final() returned
28330 20 66 61 69 6c 75 72 65 20 28 72 76 20 3d 20 25   failure (rv = %
28340 6c 75 29 2e 22 2c 20 28 75 6e 73 69 67 6e 65 64  lu).", (unsigned
28350 20 6c 6f 6e 67 29 20 64 65 63 72 79 70 74 5f 72   long) decrypt_r
28360 65 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 64  et);....return(d
28370 65 63 72 79 70 74 5f 72 65 74 29 3b 0a 09 7d 0a  ecrypt_ret);..}.
28380 0a 09 2a 70 75 6c 44 61 74 61 4c 65 6e 20 3d 20  ..*pulDataLen = 
28390 64 61 74 61 6c 65 6e 5f 75 70 64 61 74 65 20 2b  datalen_update +
283a0 20 64 61 74 61 6c 65 6e 5f 66 69 6e 61 6c 3b 0a   datalen_final;.
283b0 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
283c0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
283d0 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22 2c 20 43   CKR_OK (%i)", C
283e0 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74 75 72 6e  KR_OK);...return
283f0 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a 43 4b 5f  (CKR_OK);.}..CK_
28400 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
28410 43 4b 5f 52 56 2c 20 43 5f 44 65 63 72 79 70 74  CK_RV, C_Decrypt
28420 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49  Update)(CK_SESSI
28430 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
28440 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
28450 70 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20  pEncryptedPart, 
28460 43 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79  CK_ULONG ulEncry
28470 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f  ptedPartLen, CK_
28480 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20  BYTE_PTR pPart, 
28490 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
284a0 50 61 72 74 4c 65 6e 29 20 7b 0a 09 73 74 61 74  PartLen) {..stat
284b0 69 63 20 43 4b 5f 42 59 54 45 20 62 75 66 5b 31  ic CK_BYTE buf[1
284c0 36 33 38 34 5d 3b 0a 09 73 73 69 7a 65 5f 74 20  6384];..ssize_t 
284d0 62 75 66 6c 65 6e 3b 0a 09 43 4b 5f 53 4c 4f 54  buflen;..CK_SLOT
284e0 5f 49 44 20 73 6c 6f 74 49 44 3b 0a 09 43 4b 5f  _ID slotID;..CK_
284f0 52 56 20 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f  RV retval = CKR_
28500 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09  GENERAL_ERROR;..
28510 69 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c  int mutex_retval
28520 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ;...CACKEY_DEBUG
28530 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
28540 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
28550 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
28560 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
28570 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
28580 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
28590 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
285a0 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
285b0 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
285c0 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
285d0 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
285e0 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
285f0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
28600 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
28610 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
28620 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
28630 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
28640 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
28650 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
28660 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
28670 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
28680 0a 0a 09 69 66 20 28 70 45 6e 63 72 79 70 74 65  ...if (pEncrypte
28690 64 50 61 72 74 20 3d 3d 20 4e 55 4c 4c 20 26 26  dPart == NULL &&
286a0 20 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74   ulEncryptedPart
286b0 4c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a  Len == 0) {.../*
286c0 20 53 68 6f 72 74 20 63 69 72 63 75 69 74 20 69   Short circuit i
286d0 66 20 77 65 20 61 72 65 20 61 73 6b 65 64 20 74  f we are asked t
286e0 6f 20 64 65 63 72 79 70 74 20 6e 6f 74 68 69 6e  o decrypt nothin
286f0 67 2e 2e 2e 20 2a 2f 0a 09 09 43 41 43 4b 45 59  g... */...CACKEY
28700 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
28710 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
28720 28 25 69 29 20 28 73 68 6f 72 74 20 63 69 72 63  (%i) (short circ
28730 75 69 74 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  uit)", CKR_OK);.
28740 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b  ...return(CKR_OK
28750 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 70 45 6e 63  );..}...if (pEnc
28760 72 79 70 74 65 64 50 61 72 74 20 3d 3d 20 4e 55  ryptedPart == NU
28770 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  LL) {...CACKEY_D
28780 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
28790 6f 72 2e 20 70 45 6e 63 72 79 70 74 65 64 50 61  or. pEncryptedPa
287a0 72 74 20 69 73 20 4e 55 4c 4c 2c 20 62 75 74 20  rt is NULL, but 
287b0 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
287c0 65 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a  en is not 0.");.
287d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
287e0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
287f0 0a 0a 09 69 66 20 28 75 6c 45 6e 63 72 79 70 74  ...if (ulEncrypt
28800 65 64 50 61 72 74 4c 65 6e 20 3d 3d 20 30 29 20  edPartLen == 0) 
28810 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
28820 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
28830 75 6c 45 6e 63 72 79 70 74 65 64 50 61 72 74 4c  ulEncryptedPartL
28840 65 6e 20 69 73 20 30 2c 20 62 75 74 20 70 50 61  en is 0, but pPa
28850 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22  rt is not NULL."
28860 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
28870 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b  _ARGUMENTS_BAD);
28880 0a 09 7d 0a 0a 09 69 66 20 28 70 75 6c 50 61 72  ..}...if (pulPar
28890 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  tLen == NULL) {.
288a0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
288b0 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 75  RINTF("Error. pu
288c0 6c 50 61 72 74 4c 65 6e 20 69 73 20 4e 55 4c 4c  lPartLen is NULL
288d0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
288e0 4b 52 5f 41 52 47 55 4d 45 4e 54 53 5f 42 41 44  KR_ARGUMENTS_BAD
288f0 29 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  );..}...mutex_re
28900 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
28910 74 65 78 5f 6c 6f 63 6b 28 63 61 63 6b 65 79 5f  tex_lock(cackey_
28920 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d  biglock);..if (m
28930 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30  utex_retval != 0
28940 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28950 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28960 2e 20 20 4c 6f 63 6b 69 6e 67 20 66 61 69 6c 65  .  Locking faile
28970 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
28980 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
28990 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  R);..}...if (!ca
289a0 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
289b0 65 73 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20  ession].active) 
289c0 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  {...cackey_mutex
289d0 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
289e0 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b  iglock);....CACK
289f0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
28a00 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69 6f 6e  "Error.  Session
28a10 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b 0a   not active.");.
28a20 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  .....return(CKR_
28a30 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 5f 49  SESSION_HANDLE_I
28a40 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 69 66  NVALID);..}...if
28a50 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69 6f   (!cackey_sessio
28a60 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 64 65 63  ns[hSession].dec
28a70 72 79 70 74 5f 61 63 74 69 76 65 29 20 7b 0a 09  rypt_active) {..
28a80 09 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e  .cackey_mutex_un
28a90 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c  lock(cackey_bigl
28aa0 6f 63 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f  ock);....CACKEY_
28ab0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
28ac0 72 6f 72 2e 20 20 44 65 63 72 79 70 74 20 6e 6f  ror.  Decrypt no
28ad0 74 20 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a  t active.");....
28ae0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45  ..return(CKR_OPE
28af0 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49 4e 49 54 49  RATION_NOT_INITI
28b00 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 73 6c  ALIZED);..}...sl
28b10 6f 74 49 44 20 3d 20 63 61 63 6b 65 79 5f 73 65  otID = cackey_se
28b20 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
28b30 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69 66 20 28 73  .slotID;...if (s
28b40 6c 6f 74 49 44 20 3c 20 30 20 7c 7c 20 73 6c 6f  lotID < 0 || slo
28b50 74 49 44 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63  tID >= (sizeof(c
28b60 61 63 6b 65 79 5f 73 6c 6f 74 73 29 20 2f 20 73  ackey_slots) / s
28b70 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f  izeof(cackey_slo
28b80 74 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41 43  ts[0]))) {...CAC
28b90 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
28ba0 28 22 45 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64  ("Error. Invalid
28bb0 20 73 6c 6f 74 20 72 65 71 75 65 73 74 65 64 20   slot requested 
28bc0 28 25 6c 75 29 2c 20 6f 75 74 73 69 64 65 20 6f  (%lu), outside o
28bd0 66 20 76 61 6c 69 64 20 72 61 6e 67 65 22 2c 20  f valid range", 
28be0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 72 65 74 75  slotID);....retu
28bf0 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45  rn(CKR_GENERAL_E
28c00 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69 66 20 28  RROR);..}...if (
28c10 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
28c20 74 49 44 5d 2e 61 63 74 69 76 65 20 3d 3d 20 30  tID].active == 0
28c30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
28c40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
28c50 2e 20 49 6e 76 61 6c 69 64 20 73 6c 6f 74 20 72  . Invalid slot r
28c60 65 71 75 65 73 74 65 64 20 28 25 6c 75 29 2c 20  equested (%lu), 
28c70 73 6c 6f 74 20 6e 6f 74 20 63 75 72 72 65 6e 74  slot not current
28c80 6c 79 20 61 63 74 69 76 65 22 2c 20 73 6c 6f 74  ly active", slot
28c90 49 44 29 3b 0a 0a 09 09 63 61 63 6b 65 79 5f 6d  ID);....cackey_m
28ca0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
28cb0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
28cc0 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
28cd0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
28ce0 73 77 69 74 63 68 20 28 63 61 63 6b 65 79 5f 73  switch (cackey_s
28cf0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
28d00 5d 2e 64 65 63 72 79 70 74 5f 6d 65 63 68 61 6e  ].decrypt_mechan
28d10 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ism) {...case CK
28d20 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f  M_RSA_PKCS:..../
28d30 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 64 65  * Ask card to de
28d40 63 72 79 70 74 20 2a 2f 0a 09 09 09 62 75 66 6c  crypt */....bufl
28d50 65 6e 20 3d 20 63 61 63 6b 65 79 5f 73 69 67 6e  en = cackey_sign
28d60 64 65 63 72 79 70 74 28 26 63 61 63 6b 65 79 5f  decrypt(&cackey_
28d70 73 6c 6f 74 73 5b 73 6c 6f 74 49 44 5d 2c 20 63  slots[slotID], c
28d80 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
28d90 53 65 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74  Session].decrypt
28da0 5f 69 64 65 6e 74 69 74 79 2c 20 70 45 6e 63 72  _identity, pEncr
28db0 79 70 74 65 64 50 61 72 74 2c 20 75 6c 45 6e 63  yptedPart, ulEnc
28dc0 72 79 70 74 65 64 50 61 72 74 4c 65 6e 2c 20 62  ryptedPartLen, b
28dd0 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c  uf, sizeof(buf),
28de0 20 30 2c 20 31 29 3b 0a 0a 09 09 09 69 66 20 28   0, 1);.....if (
28df0 62 75 66 6c 65 6e 20 3c 20 30 29 20 7b 0a 09 09  buflen < 0) {...
28e00 09 09 2f 2a 20 44 65 63 72 79 70 74 69 6f 6e 20  ../* Decryption 
28e10 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09 09 69  failed. */.....i
28e20 66 20 28 62 75 66 6c 65 6e 20 3d 3d 20 43 41 43  f (buflen == CAC
28e30 4b 45 59 5f 50 43 53 43 5f 45 5f 4e 45 45 44 4c  KEY_PCSC_E_NEEDL
28e40 4f 47 49 4e 29 20 7b 0a 09 09 09 09 09 72 65 74  OGIN) {......ret
28e50 76 61 6c 20 3d 20 43 4b 52 5f 55 53 45 52 5f 4e  val = CKR_USER_N
28e60 4f 54 5f 4c 4f 47 47 45 44 5f 49 4e 3b 0a 09 09  OT_LOGGED_IN;...
28e70 09 09 7d 20 65 6c 73 65 20 69 66 20 28 62 75 66  ..} else if (buf
28e80 6c 65 6e 20 3d 3d 20 43 41 43 4b 45 59 5f 50 43  len == CACKEY_PC
28e90 53 43 5f 45 5f 54 4f 4b 45 4e 41 42 53 45 4e 54  SC_E_TOKENABSENT
28ea0 29 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20  ) {......retval 
28eb0 3d 20 43 4b 52 5f 44 45 56 49 43 45 5f 52 45 4d  = CKR_DEVICE_REM
28ec0 4f 56 45 44 3b 0a 09 09 09 09 7d 20 65 6c 73 65  OVED;.....} else
28ed0 20 7b 0a 09 09 09 09 09 72 65 74 76 61 6c 20 3d   {......retval =
28ee0 20 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52   CKR_GENERAL_ERR
28ef0 4f 52 3b 0a 09 09 09 09 7d 0a 09 09 09 7d 20 65  OR;.....}....} e
28f00 6c 73 65 20 69 66 20 28 28 28 75 6e 73 69 67 6e  lse if (((unsign
28f10 65 64 20 6c 6f 6e 67 29 20 62 75 66 6c 65 6e 29  ed long) buflen)
28f20 20 3e 20 2a 70 75 6c 50 61 72 74 4c 65 6e 20 26   > *pulPartLen &
28f30 26 20 70 50 61 72 74 29 20 7b 0a 09 09 09 09 2f  & pPart) {...../
28f40 2a 20 44 65 63 72 79 70 74 65 64 20 64 61 74 61  * Decrypted data
28f50 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a 09 09   too large */...
28f60 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 42  ..retval = CKR_B
28f70 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41 4c 4c 3b  UFFER_TOO_SMALL;
28f80 0a 09 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09  ....} else {....
28f90 09 69 66 20 28 70 50 61 72 74 29 20 7b 0a 09 09  .if (pPart) {...
28fa0 09 09 09 6d 65 6d 63 70 79 28 70 50 61 72 74 2c  ...memcpy(pPart,
28fb0 20 62 75 66 2c 20 62 75 66 6c 65 6e 29 3b 0a 09   buf, buflen);..
28fc0 09 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 50 61  ...}......*pulPa
28fd0 72 74 4c 65 6e 20 3d 20 62 75 66 6c 65 6e 3b 0a  rtLen = buflen;.
28fe0 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
28ff0 52 5f 4f 4b 3b 0a 09 09 09 7d 0a 0a 09 09 09 62  R_OK;....}.....b
29000 72 65 61 6b 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78  reak;..}...mutex
29010 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79  _retval = cackey
29020 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29030 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09  ckey_biglock);..
29040 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
29050 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45   != 0) {...CACKE
29060 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
29070 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e  Error.  Unlockin
29080 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09  g failed.");....
29090 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
290a0 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
290b0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
290c0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 25  NTF("Returning %
290d0 69 22 2c 20 28 69 6e 74 29 20 72 65 74 76 61 6c  i", (int) retval
290e0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 72 65 74 76  );...return(retv
290f0 61 6c 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  al);.}..CK_DEFIN
29100 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
29110 2c 20 43 5f 44 65 63 72 79 70 74 46 69 6e 61 6c  , C_DecryptFinal
29120 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29130 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
29140 5f 42 59 54 45 5f 50 54 52 20 70 4c 61 73 74 50  _BYTE_PTR pLastP
29150 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  art, CK_ULONG_PT
29160 52 20 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e  R pulLastPartLen
29170 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
29180 65 74 76 61 6c 3b 0a 09 69 6e 74 20 74 65 72 6d  etval;..int term
29190 69 6e 61 74 65 5f 64 65 63 72 79 70 74 20 3d 20  inate_decrypt = 
291a0 31 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  1;...CACKEY_DEBU
291b0 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
291c0 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
291d0 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
291e0 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
291f0 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29200 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
29210 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
29220 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
29230 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
29240 0a 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20  ...if (hSession 
29250 3d 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e  == 0 || hSession
29260 20 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b   >= (sizeof(cack
29270 65 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73  ey_sessions) / s
29280 69 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73  izeof(cackey_ses
29290 73 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09  sions[0]))) {...
292a0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
292b0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73  NTF("Error.  Ses
292c0 73 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67  sion out of rang
292d0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
292e0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
292f0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
29300 7d 0a 0a 09 69 66 20 28 70 75 6c 4c 61 73 74 50  }...if (pulLastP
29310 61 72 74 4c 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20  artLen == NULL) 
29320 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
29330 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
29340 70 75 6c 4c 61 73 74 50 61 72 74 4c 65 6e 20 69  pulLastPartLen i
29350 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09 09 72 65  s NULL.");....re
29360 74 75 72 6e 28 43 4b 52 5f 41 52 47 55 4d 45 4e  turn(CKR_ARGUMEN
29370 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a 09 6d 75  TS_BAD);..}...mu
29380 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63  tex_retval = cac
29390 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63  key_mutex_lock(c
293a0 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a  ackey_biglock);.
293b0 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
293c0 6c 20 21 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b  l != 0) {...CACK
293d0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
293e0 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69 6e 67  "Error.  Locking
293f0 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72   failed.");....r
29400 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41  eturn(CKR_GENERA
29410 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 69  L_ERROR);..}...i
29420 66 20 28 21 63 61 63 6b 65 79 5f 73 65 73 73 69  f (!cackey_sessi
29430 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 61 63  ons[hSession].ac
29440 74 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79  tive) {...cackey
29450 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61  _mutex_unlock(ca
29460 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a  ckey_biglock);..
29470 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29480 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
29490 65 73 73 69 6f 6e 20 6e 6f 74 20 61 63 74 69 76  ession not activ
294a0 65 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72  e.");......retur
294b0 6e 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41  n(CKR_SESSION_HA
294c0 4e 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09  NDLE_INVALID);..
294d0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
294e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
294f0 6e 5d 2e 64 65 63 72 79 70 74 5f 61 63 74 69 76  n].decrypt_activ
29500 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d 75  e) {...cackey_mu
29510 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
29520 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 43  y_biglock);....C
29530 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
29540 54 46 28 22 45 72 72 6f 72 2e 20 20 44 65 63 72  TF("Error.  Decr
29550 79 70 74 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ypt not active."
29560 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43  );......return(C
29570 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54  KR_OPERATION_NOT
29580 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
29590 7d 0a 0a 09 2a 70 75 6c 4c 61 73 74 50 61 72 74  }...*pulLastPart
295a0 4c 65 6e 20 3d 20 30 3b 0a 0a 09 69 66 20 28 70  Len = 0;...if (p
295b0 4c 61 73 74 50 61 72 74 20 3d 3d 20 4e 55 4c 4c  LastPart == NULL
295c0 29 20 7b 0a 09 09 74 65 72 6d 69 6e 61 74 65 5f  ) {...terminate_
295d0 64 65 63 72 79 70 74 20 3d 20 30 3b 0a 09 7d 0a  decrypt = 0;..}.
295e0 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f  ..if (terminate_
295f0 64 65 63 72 79 70 74 29 20 7b 0a 09 09 63 61 63  decrypt) {...cac
29600 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
29610 73 73 69 6f 6e 5d 2e 64 65 63 72 79 70 74 5f 61  ssion].decrypt_a
29620 63 74 69 76 65 20 3d 20 30 3b 0a 09 7d 0a 0a 09  ctive = 0;..}...
29630 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d 20 63  mutex_retval = c
29640 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
29650 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
29660 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
29670 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
29680 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
29690 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c  NTF("Error.  Unl
296a0 6f 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29  ocking failed.")
296b0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
296c0 47 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a  GENERAL_ERROR);.
296d0 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
296e0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
296f0 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 22  ing CKR_OK (%i)"
29700 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65 74  , CKR_OK);...ret
29710 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(CKR_OK);.}..
29720 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
29730 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65  ON(CK_RV, C_Dige
29740 73 74 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49  stInit)(CK_SESSI
29750 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29760 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d  on, CK_MECHANISM
29770 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 29  _PTR pMechanism)
29780 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
29790 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
297a0 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
297b0 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
297c0 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
297d0 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
297e0 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
297f0 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
29800 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
29810 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
29820 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29830 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
29840 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
29850 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
29860 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
29870 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
29880 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
29890 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
298a0 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
298b0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
298c0 56 2c 20 43 5f 44 69 67 65 73 74 29 28 43 4b 5f  V, C_Digest)(CK_
298d0 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
298e0 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
298f0 5f 50 54 52 20 70 44 61 74 61 2c 20 43 4b 5f 55  _PTR pData, CK_U
29900 4c 4f 4e 47 20 75 6c 44 61 74 61 4c 65 6e 2c 20  LONG ulDataLen, 
29910 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 69 67  CK_BYTE_PTR pDig
29920 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54  est, CK_ULONG_PT
29930 52 20 70 75 6c 44 69 67 65 73 74 4c 65 6e 29 20  R pulDigestLen) 
29940 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  {..CACKEY_DEBUG_
29950 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29960 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29970 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29980 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
29990 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
299a0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
299b0 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
299c0 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
299d0 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
299e0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
299f0 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20  INTF("Returning 
29a00 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
29a10 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22  _SUPPORTED (%i)"
29a20 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  , CKR_FUNCTION_N
29a30 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a  OT_SUPPORTED);..
29a40 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43  .return(CKR_FUNC
29a50 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
29a60 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e  ED);.}..CK_DEFIN
29a70 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56  E_FUNCTION(CK_RV
29a80 2c 20 43 5f 44 69 67 65 73 74 55 70 64 61 74 65  , C_DigestUpdate
29a90 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29aa0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
29ab0 5f 42 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c  _BYTE_PTR pPart,
29ac0 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 50 61 72 74   CK_ULONG ulPart
29ad0 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44  Len) {..CACKEY_D
29ae0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
29af0 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63  led.");...if (!c
29b00 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65  ackey_initialize
29b10 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45  d) {...CACKEY_DE
29b20 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
29b30 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69  r.  Not initiali
29b40 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72  zed.");....retur
29b50 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e  n(CKR_CRYPTOKI_N
29b60 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
29b70 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
29b80 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
29b90 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f  ning CKR_FUNCTIO
29ba0 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20  N_NOT_SUPPORTED 
29bb0 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54  (%i)", CKR_FUNCT
29bc0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29bd0 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  D);...return(CKR
29be0 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55  _FUNCTION_NOT_SU
29bf0 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f  PPORTED);.}..CK_
29c00 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28  DEFINE_FUNCTION(
29c10 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73 74 4b  CK_RV, C_DigestK
29c20 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48  ey)(CK_SESSION_H
29c30 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20  ANDLE hSession, 
29c40 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
29c50 20 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59   hKey) {..CACKEY
29c60 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
29c70 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
29c80 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
29c90 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
29ca0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
29cb0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
29cc0 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
29cd0 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
29ce0 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
29cf0 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
29d00 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
29d10 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
29d20 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
29d30 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
29d40 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
29d50 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
29d60 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
29d70 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
29d80 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
29d90 4e 28 43 4b 5f 52 56 2c 20 43 5f 44 69 67 65 73  N(CK_RV, C_Diges
29da0 74 46 69 6e 61 6c 29 28 43 4b 5f 53 45 53 53 49  tFinal)(CK_SESSI
29db0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
29dc0 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
29dd0 70 44 69 67 65 73 74 2c 20 43 4b 5f 55 4c 4f 4e  pDigest, CK_ULON
29de0 47 5f 50 54 52 20 70 75 6c 44 69 67 65 73 74 4c  G_PTR pulDigestL
29df0 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45  en) {..CACKEY_DE
29e00 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
29e10 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
29e20 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
29e30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
29e40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
29e50 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
29e60 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
29e70 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
29e80 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
29e90 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  .}...CACKEY_DEBU
29ea0 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e  G_PRINTF("Return
29eb0 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  ing CKR_FUNCTION
29ec0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28  _NOT_SUPPORTED (
29ed0 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49  %i)", CKR_FUNCTI
29ee0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
29ef0 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f  );...return(CKR_
29f00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
29f10 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44  PORTED);.}..CK_D
29f20 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43  EFINE_FUNCTION(C
29f30 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 49 6e 69 74  K_RV, C_SignInit
29f40 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
29f50 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
29f60 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
29f70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
29f80 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
29f90 29 20 7b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72  ) {..int mutex_r
29fa0 65 74 76 61 6c 3b 0a 0a 09 68 4b 65 79 2d 2d 3b  etval;...hKey--;
29fb0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
29fc0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
29fd0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
29fe0 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
29ff0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a000 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2a010 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2a020 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2a030 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2a040 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2a050 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73 6d 20  .if (pMechanism 
2a060 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43  == NULL) {...CAC
2a070 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2a080 28 22 45 72 72 6f 72 2e 20 70 4d 65 63 68 61 6e  ("Error. pMechan
2a090 69 73 6d 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a  ism is NULL.");.
2a0a0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2a0b0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2a0c0 0a 0a 09 69 66 20 28 70 4d 65 63 68 61 6e 69 73  ...if (pMechanis
2a0d0 6d 2d 3e 6d 65 63 68 61 6e 69 73 6d 20 21 3d 20  m->mechanism != 
2a0e0 43 4b 4d 5f 52 53 41 5f 50 4b 43 53 29 20 7b 0a  CKM_RSA_PKCS) {.
2a0f0 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2a100 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 70 4d  RINTF("Error. pM
2a110 65 63 68 61 6e 69 73 6d 2d 3e 6d 65 63 68 61 6e  echanism->mechan
2a120 69 73 6d 20 6e 6f 74 20 73 70 65 63 69 66 69 65  ism not specifie
2a130 64 20 61 73 20 43 4b 4d 5f 52 53 41 5f 50 4b 43  d as CKM_RSA_PKC
2a140 53 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  S");....return(C
2a150 4b 52 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 41 52  KR_MECHANISM_PAR
2a160 41 4d 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  AM_INVALID);..}.
2a170 0a 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d  ..if (hSession =
2a180 3d 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20  = 0 || hSession 
2a190 3e 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65  >= (sizeof(cacke
2a1a0 79 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69  y_sessions) / si
2a1b0 7a 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73  zeof(cackey_sess
2a1c0 69 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43  ions[0]))) {...C
2a1d0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2a1e0 54 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73  TF("Error.  Sess
2a1f0 69 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  ion out of range
2a200 2e 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e  .");......return
2a210 28 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  (CKR_SESSION_HAN
2a220 44 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d  DLE_INVALID);..}
2a230 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2a240 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2a250 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2a260 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2a270 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2a280 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2a290 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2a2a0 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2a2b0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2a2c0 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2a2d0 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2a2e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a2f0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2a300 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2a310 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2a320 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2a330 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2a340 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2a350 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2a360 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2a370 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2a380 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 61 63  D);..}...if (cac
2a390 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a3a0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
2a3b0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2a3c0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2a3d0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2a3e0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2a3f0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
2a400 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 70 72 6f  n already in pro
2a410 67 72 65 73 73 2e 22 29 3b 0a 09 09 0a 09 09 72  gress.");......r
2a420 65 74 75 72 6e 28 43 4b 52 5f 4f 50 45 52 41 54  eturn(CKR_OPERAT
2a430 49 4f 4e 5f 41 43 54 49 56 45 29 3b 0a 09 7d 0a  ION_ACTIVE);..}.
2a440 0a 09 69 66 20 28 68 4b 65 79 20 3e 3d 20 63 61  ..if (hKey >= ca
2a450 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2a460 65 73 73 69 6f 6e 5d 2e 69 64 65 6e 74 69 74 69  ession].identiti
2a470 65 73 5f 63 6f 75 6e 74 29 20 7b 0a 09 09 63 61  es_count) {...ca
2a480 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2a490 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2a4a0 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2a4b0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2a4c0 2e 20 20 4b 65 79 20 68 61 6e 64 6c 65 20 6f 75  .  Key handle ou
2a4d0 74 20 6f 66 20 72 61 6e 67 65 20 28 72 65 71 75  t of range (requ
2a4e0 65 73 74 65 64 20 6b 65 79 20 25 6c 75 2c 20 6f  ested key %lu, o
2a4f0 6e 6c 79 20 25 6c 75 20 69 64 65 6e 74 69 74 69  nly %lu identiti
2a500 65 73 20 61 76 61 69 6c 61 62 6c 65 29 2e 22 2c  es available).",
2a510 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29   (unsigned long)
2a520 20 68 4b 65 79 2c 20 28 75 6e 73 69 67 6e 65 64   hKey, (unsigned
2a530 20 6c 6f 6e 67 29 20 63 61 63 6b 65 79 5f 73 65   long) cackey_se
2a540 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a550 2e 69 64 65 6e 74 69 74 69 65 73 5f 63 6f 75 6e  .identities_coun
2a560 74 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  t);....return(CK
2a570 52 5f 4b 45 59 5f 48 41 4e 44 4c 45 5f 49 4e 56  R_KEY_HANDLE_INV
2a580 41 4c 49 44 29 3b 0a 09 7d 0a 0a 09 63 61 63 6b  ALID);..}...cack
2a590 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a5a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76  sion].sign_activ
2a5b0 65 20 3d 20 31 3b 0a 0a 09 63 61 63 6b 65 79 5f  e = 1;...cackey_
2a5c0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2a5d0 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e 69 73  n].sign_mechanis
2a5e0 6d 20 3d 20 70 4d 65 63 68 61 6e 69 73 6d 2d 3e  m = pMechanism->
2a5f0 6d 65 63 68 61 6e 69 73 6d 3b 0a 0a 09 63 61 63  mechanism;...cac
2a600 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2a610 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 6c  ssion].sign_bufl
2a620 65 6e 20 3d 20 31 32 38 3b 0a 09 63 61 63 6b 65  en = 128;..cacke
2a630 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a640 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73 65  ion].sign_bufuse
2a650 64 20 3d 20 30 3b 0a 09 63 61 63 6b 65 79 5f 73  d = 0;..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 62 75 66 20 3d 20 6d 61 6c  ].sign_buf = mal
2a680 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 63 61 63 6b  loc(sizeof(*cack
2a690 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2a6a0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 20  sion].sign_buf) 
2a6b0 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  * cackey_session
2a6c0 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2a6d0 5f 62 75 66 6c 65 6e 29 3b 0a 0a 09 43 41 43 4b  _buflen);...CACK
2a6e0 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28  EY_DEBUG_PRINTF(
2a6f0 22 53 65 73 73 69 6f 6e 20 25 6c 75 20 73 69 67  "Session %lu sig
2a700 6e 5f 69 64 65 6e 74 69 74 79 20 69 73 20 25 70  n_identity is %p
2a710 20 28 69 64 65 6e 74 69 74 79 20 23 25 6c 75 29   (identity #%lu)
2a720 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2a730 67 29 20 68 53 65 73 73 69 6f 6e 2c 20 28 76 6f  g) hSession, (vo
2a740 69 64 20 2a 29 20 26 63 61 63 6b 65 79 5f 73 65  id *) &cackey_se
2a750 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2a760 2e 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79  .identities[hKey
2a770 5d 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ], (unsigned lon
2a780 67 29 20 68 4b 65 79 29 3b 0a 09 63 61 63 6b 65  g) hKey);..cacke
2a790 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2a7a0 69 6f 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69  ion].sign_identi
2a7b0 74 79 20 3d 20 26 63 61 63 6b 65 79 5f 73 65 73  ty = &cackey_ses
2a7c0 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2a7d0 69 64 65 6e 74 69 74 69 65 73 5b 68 4b 65 79 5d  identities[hKey]
2a7e0 3b 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c  ;...mutex_retval
2a7f0 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f   = cackey_mutex_
2a800 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69  unlock(cackey_bi
2a810 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74  glock);..if (mut
2a820 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29 20  ex_retval != 0) 
2a830 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2a840 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2a850 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 65   Unlocking faile
2a860 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2a870 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52 4f  CKR_GENERAL_ERRO
2a880 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  R);..}...CACKEY_
2a890 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2a8a0 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28  turning CKR_OK (
2a8b0 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a  %i)", CKR_OK);..
2a8c0 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b  .return(CKR_OK);
2a8d0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2a8e0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2a8f0 53 69 67 6e 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Sign)(CK_SESSION
2a900 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2a910 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 44  , CK_BYTE_PTR pD
2a920 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ata, CK_ULONG ul
2a930 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45  DataLen, CK_BYTE
2a940 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c  _PTR pSignature,
2a950 20 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75   CK_ULONG_PTR pu
2a960 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
2a970 0a 09 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20  ..unsigned long 
2a980 73 74 61 72 74 5f 73 69 67 6e 5f 62 75 66 75 73  start_sign_bufus
2a990 65 64 3b 0a 09 43 4b 5f 52 56 20 73 69 67 6e 5f  ed;..CK_RV sign_
2a9a0 72 65 74 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f  ret;..int mutex_
2a9b0 72 65 74 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59  retval;...CACKEY
2a9c0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2a9d0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2a9e0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2a9f0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2aa00 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2aa10 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2aa20 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2aa30 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2aa40 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2aa50 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 68 53 65 73  );..}...if (hSes
2aa60 73 69 6f 6e 20 3d 3d 20 30 20 7c 7c 20 68 53 65  sion == 0 || hSe
2aa70 73 73 69 6f 6e 20 3e 3d 20 28 73 69 7a 65 6f 66  ssion >= (sizeof
2aa80 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2aa90 29 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65  ) / sizeof(cacke
2aaa0 79 5f 73 65 73 73 69 6f 6e 73 5b 30 5d 29 29 29  y_sessions[0])))
2aab0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2aac0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2aad0 20 20 53 65 73 73 69 6f 6e 20 6f 75 74 20 6f 66    Session out of
2aae0 20 72 61 6e 67 65 2e 22 29 3b 0a 09 09 0a 09 09   range.");......
2aaf0 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2ab00 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2ab10 44 29 3b 0a 09 7d 0a 0a 09 73 74 61 72 74 5f 73  D);..}...start_s
2ab20 69 67 6e 5f 62 75 66 75 73 65 64 20 3d 20 63 61  ign_bufused = ca
2ab30 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2ab40 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2ab50 75 73 65 64 3b 0a 0a 09 73 69 67 6e 5f 72 65 74  used;...sign_ret
2ab60 20 3d 20 43 5f 53 69 67 6e 55 70 64 61 74 65 28   = C_SignUpdate(
2ab70 68 53 65 73 73 69 6f 6e 2c 20 70 44 61 74 61 2c  hSession, pData,
2ab80 20 75 6c 44 61 74 61 4c 65 6e 29 3b 0a 09 69 66   ulDataLen);..if
2ab90 20 28 73 69 67 6e 5f 72 65 74 20 21 3d 20 43 4b   (sign_ret != CK
2aba0 52 5f 4f 4b 29 20 7b 0a 09 09 43 41 43 4b 45 59  R_OK) {...CACKEY
2abb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2abc0 72 72 6f 72 2e 20 20 53 69 67 6e 55 70 64 61 74  rror.  SignUpdat
2abd0 65 28 29 20 72 65 74 75 72 6e 65 64 20 66 61 69  e() returned fai
2abe0 6c 75 72 65 20 28 72 76 20 3d 20 25 6c 75 29 2e  lure (rv = %lu).
2abf0 22 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  ", (unsigned lon
2ac00 67 29 20 73 69 67 6e 5f 72 65 74 29 3b 0a 0a 09  g) sign_ret);...
2ac10 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21 3d  .if (sign_ret !=
2ac20 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f   CKR_BUFFER_TOO_
2ac30 53 4d 41 4c 4c 29 20 7b 0a 09 09 09 6d 75 74 65  SMALL) {....mute
2ac40 78 5f 72 65 74 76 61 6c 20 3d 20 63 61 63 6b 65  x_retval = cacke
2ac50 79 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 63 61 63  y_mutex_lock(cac
2ac60 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09  key_biglock);...
2ac70 09 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61  .if (mutex_retva
2ac80 6c 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41  l != 0) {.....CA
2ac90 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2aca0 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63 6b 69  F("Error.  Locki
2acb0 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a 09  ng failed.");...
2acc0 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2acd0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 09  NERAL_ERROR);...
2ace0 09 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b  .}.....if (!cack
2acf0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2ad00 73 69 6f 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a  sion].active) {.
2ad10 09 09 09 09 63 61 63 6b 65 79 5f 6d 75 74 65 78  ....cackey_mutex
2ad20 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2ad30 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09 09 09 43 41  iglock);......CA
2ad40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ad50 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2ad60 6f 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  on not active.")
2ad70 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e 28  ;........return(
2ad80 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2ad90 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 09 09  LE_INVALID);....
2ada0 7d 0a 0a 09 09 09 69 66 20 28 21 63 61 63 6b 65  }.....if (!cacke
2adb0 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2adc0 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65  ion].sign_active
2add0 29 20 7b 0a 09 09 09 09 63 61 63 6b 65 79 5f 6d  ) {.....cackey_m
2ade0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2adf0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2ae00 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2ae10 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53  RINTF("Error.  S
2ae20 69 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22  ign not active."
2ae30 29 3b 0a 09 09 0a 09 09 09 09 72 65 74 75 72 6e  );........return
2ae40 28 43 4b 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e  (CKR_OPERATION_N
2ae50 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b  OT_INITIALIZED);
2ae60 0a 09 09 09 7d 0a 0a 09 09 09 63 61 63 6b 65 79  ....}.....cackey
2ae70 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69  _sessions[hSessi
2ae80 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20  on].sign_active 
2ae90 3d 20 30 3b 0a 0a 09 09 09 6d 75 74 65 78 5f 72  = 0;.....mutex_r
2aea0 65 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d  etval = cackey_m
2aeb0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2aec0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 09 09  ey_biglock);....
2aed0 69 66 20 28 6d 75 74 65 78 5f 72 65 74 76 61 6c  if (mutex_retval
2aee0 20 21 3d 20 30 29 20 7b 0a 09 09 09 09 43 41 43   != 0) {.....CAC
2aef0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2af00 28 22 45 72 72 6f 72 2e 20 20 55 6e 6c 6f 63 6b  ("Error.  Unlock
2af10 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a 0a  ing failed.");..
2af20 09 09 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2af30 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2af40 09 09 7d 0a 09 09 7d 0a 0a 09 09 72 65 74 75 72  ..}...}....retur
2af50 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d 0a  n(sign_ret);..}.
2af60 0a 09 73 69 67 6e 5f 72 65 74 20 3d 20 43 5f 53  ..sign_ret = C_S
2af70 69 67 6e 46 69 6e 61 6c 28 68 53 65 73 73 69 6f  ignFinal(hSessio
2af80 6e 2c 20 70 53 69 67 6e 61 74 75 72 65 2c 20 70  n, pSignature, p
2af90 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b  ulSignatureLen);
2afa0 0a 09 69 66 20 28 73 69 67 6e 5f 72 65 74 20 21  ..if (sign_ret !
2afb0 3d 20 43 4b 52 5f 4f 4b 29 20 7b 0a 09 09 69 66  = CKR_OK) {...if
2afc0 20 28 73 69 67 6e 5f 72 65 74 20 3d 3d 20 43 4b   (sign_ret == CK
2afd0 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
2afe0 4c 4c 29 20 7b 0a 09 09 09 43 41 43 4b 45 59 5f  LL) {....CACKEY_
2aff0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 53 69  DEBUG_PRINTF("Si
2b000 67 6e 46 69 6e 61 6c 28 29 20 72 65 74 75 72 6e  gnFinal() return
2b010 65 64 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f  ed CKR_BUFFER_TO
2b020 4f 5f 53 4d 41 4c 4c 20 28 72 76 20 3d 20 25 6c  O_SMALL (rv = %l
2b030 75 29 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69  u), undoing C_Si
2b040 67 6e 55 70 64 61 74 65 28 29 22 2c 20 28 75 6e  gnUpdate()", (un
2b050 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69 67  signed long) sig
2b060 6e 5f 72 65 74 29 3b 0a 0a 09 09 09 63 61 63 6b  n_ret);.....cack
2b070 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b080 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 75 73  sion].sign_bufus
2b090 65 64 20 3d 20 73 74 61 72 74 5f 73 69 67 6e 5f  ed = start_sign_
2b0a0 62 75 66 75 73 65 64 3b 0a 0a 09 09 09 72 65 74  bufused;.....ret
2b0b0 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09  urn(sign_ret);..
2b0c0 09 7d 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  .}....CACKEY_DEB
2b0d0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2b0e0 2e 20 20 53 69 67 6e 46 69 6e 61 6c 28 29 20 72  .  SignFinal() r
2b0f0 65 74 75 72 6e 65 64 20 66 61 69 6c 75 72 65 20  eturned failure 
2b100 28 72 76 20 3d 20 25 6c 75 29 2e 22 2c 20 28 75  (rv = %lu).", (u
2b110 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 73 69  nsigned long) si
2b120 67 6e 5f 72 65 74 29 3b 0a 0a 09 09 72 65 74 75  gn_ret);....retu
2b130 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b 0a 09 7d  rn(sign_ret);..}
2b140 0a 0a 09 69 66 20 28 70 53 69 67 6e 61 74 75 72  ...if (pSignatur
2b150 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 43  e == NULL) {...C
2b160 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2b170 54 46 28 22 70 53 69 67 6e 61 74 75 72 65 20 73  TF("pSignature s
2b180 70 65 63 69 66 69 65 64 20 61 73 20 4e 55 4c 4c  pecified as NULL
2b190 2c 20 75 6e 64 6f 69 6e 67 20 43 5f 53 69 67 6e  , undoing C_Sign
2b1a0 55 70 64 61 74 65 28 29 22 29 3b 0a 0a 09 09 63  Update()");....c
2b1b0 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2b1c0 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2b1d0 66 75 73 65 64 20 3d 20 73 74 61 72 74 5f 73 69  fused = start_si
2b1e0 67 6e 5f 62 75 66 75 73 65 64 3b 0a 0a 09 09 72  gn_bufused;....r
2b1f0 65 74 75 72 6e 28 73 69 67 6e 5f 72 65 74 29 3b  eturn(sign_ret);
2b200 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42  ..}...CACKEY_DEB
2b210 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72  UG_PRINTF("Retur
2b220 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29  ning CKR_OK (%i)
2b230 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 72 65  ", CKR_OK);...re
2b240 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 7d 0a  turn(CKR_OK);.}.
2b250 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54  .CK_DEFINE_FUNCT
2b260 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67  ION(CK_RV, C_Sig
2b270 6e 55 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53  nUpdate)(CK_SESS
2b280 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2b290 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2b2a0 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f 4e 47   pPart, CK_ULONG
2b2b0 20 75 6c 50 61 72 74 4c 65 6e 29 20 7b 0a 09 69   ulPartLen) {..i
2b2c0 6e 74 20 6d 75 74 65 78 5f 72 65 74 76 61 6c 3b  nt mutex_retval;
2b2d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2b2e0 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22  PRINTF("Called."
2b2f0 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79  );...if (!cackey
2b300 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  _initialized) {.
2b310 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2b320 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e  RINTF("Error.  N
2b330 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22  ot initialized."
2b340 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  );....return(CKR
2b350 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e  _CRYPTOKI_NOT_IN
2b360 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a  ITIALIZED);..}..
2b370 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
2b380 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
2b390 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2b3a0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
2b3b0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2b3c0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
2b3d0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2b3e0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2b3f0 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
2b400 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2b410 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2b420 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2b430 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e  ..if (pPart == N
2b440 55 4c 4c 20 26 26 20 75 6c 50 61 72 74 4c 65 6e  ULL && ulPartLen
2b450 20 3d 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 53 68   == 0) {.../* Sh
2b460 6f 72 74 20 63 69 72 63 75 69 74 20 69 66 20 77  ort circuit if w
2b470 65 20 61 72 65 20 61 73 6b 65 64 20 74 6f 20 73  e are asked to s
2b480 69 67 6e 20 6e 6f 74 68 69 6e 67 2e 2e 2e 20 2a  ign nothing... *
2b490 2f 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 52 65 74 75 72 6e 69  _PRINTF("Returni
2b4b0 6e 67 20 43 4b 52 5f 4f 4b 20 28 25 69 29 20 28  ng CKR_OK (%i) (
2b4c0 73 68 6f 72 74 20 63 69 72 63 75 69 74 29 22 2c  short circuit)",
2b4d0 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09 09 72 65 74   CKR_OK);....ret
2b4e0 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a 09 7d 0a  urn(CKR_OK);..}.
2b4f0 0a 09 69 66 20 28 70 50 61 72 74 20 3d 3d 20 4e  ..if (pPart == N
2b500 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  ULL) {...CACKEY_
2b510 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2b520 72 6f 72 2e 20 70 50 61 72 74 20 69 73 20 4e 55  ror. pPart is NU
2b530 4c 4c 2c 20 62 75 74 20 75 6c 50 61 72 74 4c 65  LL, but ulPartLe
2b540 6e 20 69 73 20 6e 6f 74 20 30 2e 22 29 3b 0a 0a  n is not 0.");..
2b550 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47  ..return(CKR_ARG
2b560 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a  UMENTS_BAD);..}.
2b570 0a 09 69 66 20 28 75 6c 50 61 72 74 4c 65 6e 20  ..if (ulPartLen 
2b580 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2b590 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2b5a0 72 72 6f 72 2e 20 75 6c 50 61 72 74 4c 65 6e 20  rror. ulPartLen 
2b5b0 69 73 20 30 2c 20 62 75 74 20 70 50 61 72 74 20  is 0, but pPart 
2b5c0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 22 29 3b 0a  is not NULL.");.
2b5d0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52  ...return(CKR_AR
2b5e0 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d  GUMENTS_BAD);..}
2b5f0 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20  ...mutex_retval 
2b600 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c  = cackey_mutex_l
2b610 6f 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f  ock(cackey_biglo
2b620 63 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f  ck);..if (mutex_
2b630 72 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09  retval != 0) {..
2b640 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b650 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f  INTF("Error.  Lo
2b660 63 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b  cking failed.");
2b670 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2b680 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2b690 7d 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  }...if (!cackey_
2b6a0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2b6b0 6e 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63  n].active) {...c
2b6c0 61 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f  ackey_mutex_unlo
2b6d0 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2b6e0 6b 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45  k);....CACKEY_DE
2b6f0 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f  BUG_PRINTF("Erro
2b700 72 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20  r.  Session not 
2b710 61 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09  active.");......
2b720 72 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49  return(CKR_SESSI
2b730 4f 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49  ON_HANDLE_INVALI
2b740 44 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61  D);..}...if (!ca
2b750 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b760 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74  ession].sign_act
2b770 69 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f  ive) {...cackey_
2b780 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63  mutex_unlock(cac
2b790 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09  key_biglock);...
2b7a0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2b7b0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69  INTF("Error.  Si
2b7c0 67 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29  gn not active.")
2b7d0 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b  ;......return(CK
2b7e0 52 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f  R_OPERATION_NOT_
2b7f0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2b800 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b 65  ...switch (cacke
2b810 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2b820 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61 6e  ion].sign_mechan
2b830 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43 4b  ism) {...case CK
2b840 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09 2f  M_RSA_PKCS:..../
2b850 2a 20 41 63 63 75 6d 75 6c 61 74 65 20 64 69 72  * Accumulate dir
2b860 65 63 74 6c 79 20 2a 2f 0a 09 09 09 69 66 20 28  ectly */....if (
2b870 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73  (cackey_sessions
2b880 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2b890 62 75 66 75 73 65 64 20 2b 20 75 6c 50 61 72 74  bufused + ulPart
2b8a0 4c 65 6e 29 20 3e 20 63 61 63 6b 65 79 5f 73 65  Len) > cackey_se
2b8b0 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d  ssions[hSession]
2b8c0 2e 73 69 67 6e 5f 62 75 66 6c 65 6e 29 20 7b 0a  .sign_buflen) {.
2b8d0 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73 69  ....cackey_sessi
2b8e0 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2b8f0 67 6e 5f 62 75 66 6c 65 6e 20 2a 3d 20 32 3b 0a  gn_buflen *= 2;.
2b900 0a 09 09 09 09 63 61 63 6b 65 79 5f 73 65 73 73  .....cackey_sess
2b910 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73  ions[hSession].s
2b920 69 67 6e 5f 62 75 66 20 3d 20 72 65 61 6c 6c 6f  ign_buf = reallo
2b930 63 28 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e  c(cackey_session
2b940 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e  s[hSession].sign
2b950 5f 62 75 66 2c 20 73 69 7a 65 6f 66 28 2a 63 61  _buf, sizeof(*ca
2b960 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2b970 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2b980 29 20 2a 20 63 61 63 6b 65 79 5f 73 65 73 73 69  ) * cackey_sessi
2b990 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69  ons[hSession].si
2b9a0 67 6e 5f 62 75 66 6c 65 6e 29 3b 0a 09 09 09 7d  gn_buflen);....}
2b9b0 0a 0a 09 09 09 6d 65 6d 63 70 79 28 63 61 63 6b  .....memcpy(cack
2b9c0 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2b9d0 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 20 2b  sion].sign_buf +
2b9e0 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73   cackey_sessions
2b9f0 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f  [hSession].sign_
2ba00 62 75 66 75 73 65 64 2c 20 70 50 61 72 74 2c 20  bufused, pPart, 
2ba10 75 6c 50 61 72 74 4c 65 6e 29 3b 0a 0a 09 09 09  ulPartLen);.....
2ba20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b  cackey_sessions[
2ba30 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62  hSession].sign_b
2ba40 75 66 75 73 65 64 20 2b 3d 20 75 6c 50 61 72 74  ufused += ulPart
2ba50 4c 65 6e 3b 0a 0a 09 09 09 62 72 65 61 6b 3b 0a  Len;.....break;.
2ba60 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65 74 76 61  .}...mutex_retva
2ba70 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75 74 65 78  l = cackey_mutex
2ba80 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65 79 5f 62  _unlock(cackey_b
2ba90 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20 28 6d 75  iglock);..if (mu
2baa0 74 65 78 5f 72 65 74 76 61 6c 20 21 3d 20 30 29  tex_retval != 0)
2bab0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2bac0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2bad0 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66 61 69 6c    Unlocking fail
2bae0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2baf0 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f 45 52 52  (CKR_GENERAL_ERR
2bb00 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59  OR);..}...CACKEY
2bb10 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52  _DEBUG_PRINTF("R
2bb20 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20  eturning CKR_OK 
2bb30 28 25 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a  (%i)", CKR_OK);.
2bb40 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29  ..return(CKR_OK)
2bb50 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2bb60 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2bb70 5f 53 69 67 6e 46 69 6e 61 6c 29 28 43 4b 5f 53  _SignFinal)(CK_S
2bb80 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2bb90 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2bba0 50 54 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20  PTR pSignature, 
2bbb0 43 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c  CK_ULONG_PTR pul
2bbc0 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a  SignatureLen) {.
2bbd0 09 73 74 61 74 69 63 20 43 4b 5f 42 59 54 45 20  .static CK_BYTE 
2bbe0 73 69 67 62 75 66 5b 31 30 32 34 5d 3b 0a 09 73  sigbuf[1024];..s
2bbf0 73 69 7a 65 5f 74 20 73 69 67 62 75 66 6c 65 6e  size_t sigbuflen
2bc00 3b 0a 09 43 4b 5f 53 4c 4f 54 5f 49 44 20 73 6c  ;..CK_SLOT_ID sl
2bc10 6f 74 49 44 3b 0a 09 43 4b 5f 52 56 20 72 65 74  otID;..CK_RV ret
2bc20 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e 45 52 41  val = CKR_GENERA
2bc30 4c 5f 45 52 52 4f 52 3b 0a 09 69 6e 74 20 74 65  L_ERROR;..int te
2bc40 72 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 31  rminate_sign = 1
2bc50 3b 0a 09 69 6e 74 20 6d 75 74 65 78 5f 72 65 74  ;..int mutex_ret
2bc60 76 61 6c 3b 0a 0a 09 43 41 43 4b 45 59 5f 44 45  val;...CACKEY_DE
2bc70 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c  BUG_PRINTF("Call
2bc80 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61  ed.");...if (!ca
2bc90 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64  ckey_initialized
2bca0 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2bcb0 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2bcc0 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  .  Not initializ
2bcd0 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e  ed.");....return
2bce0 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f  (CKR_CRYPTOKI_NO
2bcf0 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a  T_INITIALIZED);.
2bd00 09 7d 0a 0a 09 69 66 20 28 70 75 6c 53 69 67 6e  .}...if (pulSign
2bd10 61 74 75 72 65 4c 65 6e 20 3d 3d 20 4e 55 4c 4c  atureLen == NULL
2bd20 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  ) {...CACKEY_DEB
2bd30 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2bd40 2e 20 70 75 6c 53 69 67 6e 61 74 75 72 65 4c 65  . pulSignatureLe
2bd50 6e 20 69 73 20 4e 55 4c 4c 2e 22 29 3b 0a 0a 09  n is NULL.");...
2bd60 09 72 65 74 75 72 6e 28 43 4b 52 5f 41 52 47 55  .return(CKR_ARGU
2bd70 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09 7d 0a 0a  MENTS_BAD);..}..
2bd80 09 69 66 20 28 68 53 65 73 73 69 6f 6e 20 3d 3d  .if (hSession ==
2bd90 20 30 20 7c 7c 20 68 53 65 73 73 69 6f 6e 20 3e   0 || hSession >
2bda0 3d 20 28 73 69 7a 65 6f 66 28 63 61 63 6b 65 79  = (sizeof(cackey
2bdb0 5f 73 65 73 73 69 6f 6e 73 29 20 2f 20 73 69 7a  _sessions) / siz
2bdc0 65 6f 66 28 63 61 63 6b 65 79 5f 73 65 73 73 69  eof(cackey_sessi
2bdd0 6f 6e 73 5b 30 5d 29 29 29 20 7b 0a 09 09 43 41  ons[0]))) {...CA
2bde0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2bdf0 46 28 22 45 72 72 6f 72 2e 20 20 53 65 73 73 69  F("Error.  Sessi
2be00 6f 6e 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  on out of range.
2be10 22 29 3b 0a 09 09 0a 09 09 72 65 74 75 72 6e 28  ");......return(
2be20 43 4b 52 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  CKR_SESSION_HAND
2be30 4c 45 5f 49 4e 56 41 4c 49 44 29 3b 0a 09 7d 0a  LE_INVALID);..}.
2be40 0a 09 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 3d  ..mutex_retval =
2be50 20 63 61 63 6b 65 79 5f 6d 75 74 65 78 5f 6c 6f   cackey_mutex_lo
2be60 63 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63  ck(cackey_bigloc
2be70 6b 29 3b 0a 09 69 66 20 28 6d 75 74 65 78 5f 72  k);..if (mutex_r
2be80 65 74 76 61 6c 20 21 3d 20 30 29 20 7b 0a 09 09  etval != 0) {...
2be90 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2bea0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4c 6f 63  NTF("Error.  Loc
2beb0 6b 69 6e 67 20 66 61 69 6c 65 64 2e 22 29 3b 0a  king failed.");.
2bec0 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47 45  ...return(CKR_GE
2bed0 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d  NERAL_ERROR);..}
2bee0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 73  ...if (!cackey_s
2bef0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2bf00 5d 2e 61 63 74 69 76 65 29 20 7b 0a 09 09 63 61  ].active) {...ca
2bf10 63 6b 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63  ckey_mutex_unloc
2bf20 6b 28 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b  k(cackey_biglock
2bf30 29 3b 0a 0a 09 09 43 41 43 4b 45 59 5f 44 45 42  );....CACKEY_DEB
2bf40 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72  UG_PRINTF("Error
2bf50 2e 20 20 53 65 73 73 69 6f 6e 20 6e 6f 74 20 61  .  Session not a
2bf60 63 74 69 76 65 2e 22 29 3b 0a 09 09 0a 09 09 72  ctive.");......r
2bf70 65 74 75 72 6e 28 43 4b 52 5f 53 45 53 53 49 4f  eturn(CKR_SESSIO
2bf80 4e 5f 48 41 4e 44 4c 45 5f 49 4e 56 41 4c 49 44  N_HANDLE_INVALID
2bf90 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 21 63 61 63  );..}...if (!cac
2bfa0 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65  key_sessions[hSe
2bfb0 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 61 63 74 69  ssion].sign_acti
2bfc0 76 65 29 20 7b 0a 09 09 63 61 63 6b 65 79 5f 6d  ve) {...cackey_m
2bfd0 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b  utex_unlock(cack
2bfe0 65 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 0a 09 09  ey_biglock);....
2bff0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2c000 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 53 69 67  NTF("Error.  Sig
2c010 6e 20 6e 6f 74 20 61 63 74 69 76 65 2e 22 29 3b  n not active.");
2c020 0a 09 09 0a 09 09 72 65 74 75 72 6e 28 43 4b 52  ......return(CKR
2c030 5f 4f 50 45 52 41 54 49 4f 4e 5f 4e 4f 54 5f 49  _OPERATION_NOT_I
2c040 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2c050 0a 09 73 6c 6f 74 49 44 20 3d 20 63 61 63 6b 65  ..slotID = cacke
2c060 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73  y_sessions[hSess
2c070 69 6f 6e 5d 2e 73 6c 6f 74 49 44 3b 0a 0a 09 69  ion].slotID;...i
2c080 66 20 28 73 6c 6f 74 49 44 20 3c 20 30 20 7c 7c  f (slotID < 0 ||
2c090 20 73 6c 6f 74 49 44 20 3e 3d 20 28 73 69 7a 65   slotID >= (size
2c0a0 6f 66 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73 29  of(cackey_slots)
2c0b0 20 2f 20 73 69 7a 65 6f 66 28 63 61 63 6b 65 79   / sizeof(cackey
2c0c0 5f 73 6c 6f 74 73 5b 30 5d 29 29 29 20 7b 0a 09  _slots[0]))) {..
2c0d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2c0e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 49 6e 76  INTF("Error. Inv
2c0f0 61 6c 69 64 20 73 6c 6f 74 20 72 65 71 75 65 73  alid slot reques
2c100 74 65 64 20 28 25 6c 75 29 2c 20 6f 75 74 73 69  ted (%lu), outsi
2c110 64 65 20 6f 66 20 76 61 6c 69 64 20 72 61 6e 67  de of valid rang
2c120 65 22 2c 20 73 6c 6f 74 49 44 29 3b 0a 0a 09 09  e", slotID);....
2c130 72 65 74 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52  return(CKR_GENER
2c140 41 4c 5f 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09  AL_ERROR);..}...
2c150 69 66 20 28 63 61 63 6b 65 79 5f 73 6c 6f 74 73  if (cackey_slots
2c160 5b 73 6c 6f 74 49 44 5d 2e 61 63 74 69 76 65 20  [slotID].active 
2c170 3d 3d 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59  == 0) {...CACKEY
2c180 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2c190 72 72 6f 72 2e 20 49 6e 76 61 6c 69 64 20 73 6c  rror. Invalid sl
2c1a0 6f 74 20 72 65 71 75 65 73 74 65 64 20 28 25 6c  ot requested (%l
2c1b0 75 29 2c 20 73 6c 6f 74 20 6e 6f 74 20 63 75 72  u), slot not cur
2c1c0 72 65 6e 74 6c 79 20 61 63 74 69 76 65 22 2c 20  rently active", 
2c1d0 73 6c 6f 74 49 44 29 3b 0a 0a 09 09 63 61 63 6b  slotID);....cack
2c1e0 65 79 5f 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28  ey_mutex_unlock(
2c1f0 63 61 63 6b 65 79 5f 62 69 67 6c 6f 63 6b 29 3b  cackey_biglock);
2c200 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 47  ....return(CKR_G
2c210 45 4e 45 52 41 4c 5f 45 52 52 4f 52 29 3b 0a 09  ENERAL_ERROR);..
2c220 7d 0a 0a 09 73 77 69 74 63 68 20 28 63 61 63 6b  }...switch (cack
2c230 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c240 73 69 6f 6e 5d 2e 73 69 67 6e 5f 6d 65 63 68 61  sion].sign_mecha
2c250 6e 69 73 6d 29 20 7b 0a 09 09 63 61 73 65 20 43  nism) {...case C
2c260 4b 4d 5f 52 53 41 5f 50 4b 43 53 3a 0a 09 09 09  KM_RSA_PKCS:....
2c270 2f 2a 20 41 73 6b 20 63 61 72 64 20 74 6f 20 73  /* Ask card to s
2c280 69 67 6e 20 2a 2f 0a 09 09 09 43 41 43 4b 45 59  ign */....CACKEY
2c290 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 41  _DEBUG_PRINTF("A
2c2a0 73 6b 69 6e 67 20 74 6f 20 73 69 67 6e 20 66 72  sking to sign fr
2c2b0 6f 6d 20 69 64 65 6e 74 69 74 79 20 25 70 20 69  om identity %p i
2c2c0 6e 20 73 65 73 73 69 6f 6e 20 25 6c 75 22 2c 20  n session %lu", 
2c2d0 28 76 6f 69 64 20 2a 29 20 63 61 63 6b 65 79 5f  (void *) cackey_
2c2e0 73 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f  sessions[hSessio
2c2f0 6e 5d 2e 73 69 67 6e 5f 69 64 65 6e 74 69 74 79  n].sign_identity
2c300 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2c310 29 20 68 53 65 73 73 69 6f 6e 29 3b 0a 09 09 09  ) hSession);....
2c320 73 69 67 62 75 66 6c 65 6e 20 3d 20 63 61 63 6b  sigbuflen = cack
2c330 65 79 5f 73 69 67 6e 64 65 63 72 79 70 74 28 26  ey_signdecrypt(&
2c340 63 61 63 6b 65 79 5f 73 6c 6f 74 73 5b 73 6c 6f  cackey_slots[slo
2c350 74 49 44 5d 2c 20 63 61 63 6b 65 79 5f 73 65 73  tID], cackey_ses
2c360 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e  sions[hSession].
2c370 73 69 67 6e 5f 69 64 65 6e 74 69 74 79 2c 20 63  sign_identity, c
2c380 61 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68  ackey_sessions[h
2c390 53 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75  Session].sign_bu
2c3a0 66 2c 20 63 61 63 6b 65 79 5f 73 65 73 73 69 6f  f, cackey_sessio
2c3b0 6e 73 5b 68 53 65 73 73 69 6f 6e 5d 2e 73 69 67  ns[hSession].sig
2c3c0 6e 5f 62 75 66 75 73 65 64 2c 20 73 69 67 62 75  n_bufused, sigbu
2c3d0 66 2c 20 73 69 7a 65 6f 66 28 73 69 67 62 75 66  f, sizeof(sigbuf
2c3e0 29 2c 20 31 2c 20 30 29 3b 0a 0a 09 09 09 69 66  ), 1, 0);.....if
2c3f0 20 28 73 69 67 62 75 66 6c 65 6e 20 3c 20 30 29   (sigbuflen < 0)
2c400 20 7b 0a 09 09 09 09 2f 2a 20 53 69 67 6e 69 6e   {...../* Signin
2c410 67 20 66 61 69 6c 65 64 2e 20 2a 2f 0a 09 09 09  g failed. */....
2c420 09 69 66 20 28 73 69 67 62 75 66 6c 65 6e 20 3d  .if (sigbuflen =
2c430 3d 20 43 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f  = CACKEY_PCSC_E_
2c440 4e 45 45 44 4c 4f 47 49 4e 29 20 7b 0a 09 09 09  NEEDLOGIN) {....
2c450 09 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 55  ..retval = CKR_U
2c460 53 45 52 5f 4e 4f 54 5f 4c 4f 47 47 45 44 5f 49  SER_NOT_LOGGED_I
2c470 4e 3b 0a 09 09 09 09 7d 20 65 6c 73 65 20 69 66  N;.....} else if
2c480 20 28 73 69 67 62 75 66 6c 65 6e 20 3d 3d 20 43   (sigbuflen == C
2c490 41 43 4b 45 59 5f 50 43 53 43 5f 45 5f 54 4f 4b  ACKEY_PCSC_E_TOK
2c4a0 45 4e 41 42 53 45 4e 54 29 20 7b 0a 09 09 09 09  ENABSENT) {.....
2c4b0 09 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 44 45  .retval = CKR_DE
2c4c0 56 49 43 45 5f 52 45 4d 4f 56 45 44 3b 0a 09 09  VICE_REMOVED;...
2c4d0 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 09  ..} else {......
2c4e0 72 65 74 76 61 6c 20 3d 20 43 4b 52 5f 47 45 4e  retval = CKR_GEN
2c4f0 45 52 41 4c 5f 45 52 52 4f 52 3b 0a 09 09 09 09  ERAL_ERROR;.....
2c500 7d 0a 09 09 09 7d 20 65 6c 73 65 20 69 66 20 28  }....} else if (
2c510 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
2c520 20 73 69 67 62 75 66 6c 65 6e 29 20 3e 20 2a 70   sigbuflen) > *p
2c530 75 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 20 26  ulSignatureLen &
2c540 26 20 70 53 69 67 6e 61 74 75 72 65 29 20 7b 0a  & pSignature) {.
2c550 09 09 09 09 2f 2a 20 53 69 67 6e 65 64 20 64 61  ..../* Signed da
2c560 74 61 20 74 6f 6f 20 6c 61 72 67 65 20 2a 2f 0a  ta too large */.
2c570 09 09 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  ....CACKEY_DEBUG
2c580 5f 50 52 49 4e 54 46 28 22 72 65 74 76 61 6c 20  _PRINTF("retval 
2c590 3d 20 43 4b 52 5f 42 55 46 46 45 52 5f 54 4f 4f  = CKR_BUFFER_TOO
2c5a0 5f 53 4d 41 4c 4c 3b 20 20 73 69 67 62 75 66 6c  _SMALL;  sigbufl
2c5b0 65 6e 20 3d 20 25 6c 75 2c 20 70 75 6c 53 69 67  en = %lu, pulSig
2c5c0 6e 61 74 75 72 65 4c 65 6e 20 3d 20 25 6c 75 22  natureLen = %lu"
2c5d0 2c 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  , (unsigned long
2c5e0 29 20 73 69 67 62 75 66 6c 65 6e 2c 20 28 75 6e  ) sigbuflen, (un
2c5f0 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 2a 70 75  signed long) *pu
2c600 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 3b 0a  lSignatureLen);.
2c610 0a 09 09 09 09 72 65 74 76 61 6c 20 3d 20 43 4b  .....retval = CK
2c620 52 5f 42 55 46 46 45 52 5f 54 4f 4f 5f 53 4d 41  R_BUFFER_TOO_SMA
2c630 4c 4c 3b 0a 0a 09 09 09 09 74 65 72 6d 69 6e 61  LL;......termina
2c640 74 65 5f 73 69 67 6e 20 3d 20 30 3b 0a 09 09 09  te_sign = 0;....
2c650 7d 20 65 6c 73 65 20 7b 0a 09 09 09 09 74 65 72  } else {.....ter
2c660 6d 69 6e 61 74 65 5f 73 69 67 6e 20 3d 20 30 3b  minate_sign = 0;
2c670 0a 0a 09 09 09 09 69 66 20 28 70 53 69 67 6e 61  ......if (pSigna
2c680 74 75 72 65 29 20 7b 0a 09 09 09 09 09 6d 65 6d  ture) {......mem
2c690 63 70 79 28 70 53 69 67 6e 61 74 75 72 65 2c 20  cpy(pSignature, 
2c6a0 73 69 67 62 75 66 2c 20 73 69 67 62 75 66 6c 65  sigbuf, sigbufle
2c6b0 6e 29 3b 0a 0a 09 09 09 09 09 74 65 72 6d 69 6e  n);.......termin
2c6c0 61 74 65 5f 73 69 67 6e 20 3d 20 31 3b 0a 09 09  ate_sign = 1;...
2c6d0 09 09 7d 0a 0a 09 09 09 09 2a 70 75 6c 53 69 67  ..}......*pulSig
2c6e0 6e 61 74 75 72 65 4c 65 6e 20 3d 20 73 69 67 62  natureLen = sigb
2c6f0 75 66 6c 65 6e 3b 0a 0a 09 09 09 09 72 65 74 76  uflen;......retv
2c700 61 6c 20 3d 20 43 4b 52 5f 4f 4b 3b 0a 09 09 09  al = CKR_OK;....
2c710 7d 0a 0a 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a  }.....break;..}.
2c720 0a 09 69 66 20 28 74 65 72 6d 69 6e 61 74 65 5f  ..if (terminate_
2c730 73 69 67 6e 29 20 7b 0a 09 09 69 66 20 28 63 61  sign) {...if (ca
2c740 63 6b 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53  ckey_sessions[hS
2c750 65 73 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66  ession].sign_buf
2c760 29 20 7b 0a 09 09 09 66 72 65 65 28 63 61 63 6b  ) {....free(cack
2c770 65 79 5f 73 65 73 73 69 6f 6e 73 5b 68 53 65 73  ey_sessions[hSes
2c780 73 69 6f 6e 5d 2e 73 69 67 6e 5f 62 75 66 29 3b  sion].sign_buf);
2c790 0a 09 09 7d 0a 0a 09 09 63 61 63 6b 65 79 5f 73  ...}....cackey_s
2c7a0 65 73 73 69 6f 6e 73 5b 68 53 65 73 73 69 6f 6e  essions[hSession
2c7b0 5d 2e 73 69 67 6e 5f 61 63 74 69 76 65 20 3d 20  ].sign_active = 
2c7c0 30 3b 0a 09 7d 0a 0a 09 6d 75 74 65 78 5f 72 65  0;..}...mutex_re
2c7d0 74 76 61 6c 20 3d 20 63 61 63 6b 65 79 5f 6d 75  tval = cackey_mu
2c7e0 74 65 78 5f 75 6e 6c 6f 63 6b 28 63 61 63 6b 65  tex_unlock(cacke
2c7f0 79 5f 62 69 67 6c 6f 63 6b 29 3b 0a 09 69 66 20  y_biglock);..if 
2c800 28 6d 75 74 65 78 5f 72 65 74 76 61 6c 20 21 3d  (mutex_retval !=
2c810 20 30 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44   0) {...CACKEY_D
2c820 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2c830 6f 72 2e 20 20 55 6e 6c 6f 63 6b 69 6e 67 20 66  or.  Unlocking f
2c840 61 69 6c 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  ailed.");....ret
2c850 75 72 6e 28 43 4b 52 5f 47 45 4e 45 52 41 4c 5f  urn(CKR_GENERAL_
2c860 45 52 52 4f 52 29 3b 0a 09 7d 0a 0a 09 43 41 43  ERROR);..}...CAC
2c870 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2c880 28 22 52 65 74 75 72 6e 69 6e 67 20 25 69 22 2c  ("Returning %i",
2c890 20 28 69 6e 74 29 20 72 65 74 76 61 6c 29 3b 0a   (int) retval);.
2c8a0 0a 09 72 65 74 75 72 6e 28 72 65 74 76 61 6c 29  ..return(retval)
2c8b0 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46  ;.}..CK_DEFINE_F
2c8c0 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43  UNCTION(CK_RV, C
2c8d0 5f 53 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74  _SignRecoverInit
2c8e0 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2c8f0 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2c900 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70  _MECHANISM_PTR p
2c910 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42  Mechanism, CK_OB
2c920 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79  JECT_HANDLE hKey
2c930 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2c940 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2c950 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2c960 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2c970 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2c980 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2c990 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2c9a0 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2c9b0 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2c9c0 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2c9d0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2c9e0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2c9f0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2ca00 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2ca10 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2ca20 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2ca30 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2ca40 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2ca50 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2ca60 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2ca70 52 56 2c 20 43 5f 53 69 67 6e 52 65 63 6f 76 65  RV, C_SignRecove
2ca80 72 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  r)(CK_SESSION_HA
2ca90 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2caa0 4b 5f 42 59 54 45 5f 50 54 52 20 70 44 61 74 61  K_BYTE_PTR pData
2cab0 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 44 61 74  , CK_ULONG ulDat
2cac0 61 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  aLen, CK_BYTE_PT
2cad0 52 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b  R pSignature, CK
2cae0 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 53 69  _ULONG_PTR pulSi
2caf0 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
2cb00 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2cb10 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2cb20 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2cb30 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2cb40 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2cb50 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2cb60 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2cb70 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2cb80 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2cb90 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2cba0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cbb0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2cbc0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2cbd0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2cbe0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2cbf0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2cc00 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2cc10 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2cc20 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2cc30 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2cc40 56 65 72 69 66 79 49 6e 69 74 29 28 43 4b 5f 53  VerifyInit)(CK_S
2cc50 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2cc60 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41  ession, CK_MECHA
2cc70 4e 49 53 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e  NISM_PTR pMechan
2cc80 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45 43 54 5f 48  ism, CK_OBJECT_H
2cc90 41 4e 44 4c 45 20 68 4b 65 79 29 20 7b 0a 09 43  ANDLE hKey) {..C
2cca0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ccb0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ccc0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ccd0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2cce0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ccf0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2cd00 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2cd10 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2cd20 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2cd30 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2cd40 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cd50 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2cd60 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2cd70 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2cd80 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2cd90 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2cda0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2cdb0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2cdc0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2cdd0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2cde0 56 65 72 69 66 79 29 28 43 4b 5f 53 45 53 53 49  Verify)(CK_SESSI
2cdf0 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69  ON_HANDLE hSessi
2ce00 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20  on, CK_BYTE_PTR 
2ce10 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47 20  pData, CK_ULONG 
2ce20 75 6c 44 61 74 61 4c 65 6e 2c 20 43 4b 5f 42 59  ulDataLen, CK_BY
2ce30 54 45 5f 50 54 52 20 70 53 69 67 6e 61 74 75 72  TE_PTR pSignatur
2ce40 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c 53 69  e, CK_ULONG ulSi
2ce50 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b 0a 09 43  gnatureLen) {..C
2ce60 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2ce70 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2ce80 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2ce90 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2cea0 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2ceb0 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2cec0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2ced0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2cee0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2cef0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2cf00 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2cf10 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2cf20 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2cf30 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2cf40 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2cf50 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2cf60 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2cf70 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2cf80 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2cf90 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2cfa0 56 65 72 69 66 79 55 70 64 61 74 65 29 28 43 4b  VerifyUpdate)(CK
2cfb0 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20  _SESSION_HANDLE 
2cfc0 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54  hSession, CK_BYT
2cfd0 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2cfe0 55 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 29  ULONG ulPartLen)
2cff0 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47   {..CACKEY_DEBUG
2d000 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e  _PRINTF("Called.
2d010 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65  ");...if (!cacke
2d020 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  y_initialized) {
2d030 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d040 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20  PRINTF("Error.  
2d050 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e  Not initialized.
2d060 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b  ");....return(CK
2d070 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49  R_CRYPTOKI_NOT_I
2d080 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a  NITIALIZED);..}.
2d090 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d0a0 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67  RINTF("Returning
2d0b0 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2d0c0 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69 29  T_SUPPORTED (%i)
2d0d0 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ", CKR_FUNCTION_
2d0e0 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a  NOT_SUPPORTED);.
2d0f0 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e  ..return(CKR_FUN
2d100 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2d110 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49  TED);.}..CK_DEFI
2d120 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2d130 56 2c 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c  V, C_VerifyFinal
2d140 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e  )(CK_SESSION_HAN
2d150 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b  DLE hSession, CK
2d160 5f 42 59 54 45 5f 50 54 52 20 70 53 69 67 6e 61  _BYTE_PTR pSigna
2d170 74 75 72 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75  ture, CK_ULONG u
2d180 6c 53 69 67 6e 61 74 75 72 65 4c 65 6e 29 20 7b  lSignatureLen) {
2d190 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2d1a0 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2d1b0 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2d1c0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2d1d0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2d1e0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2d1f0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2d200 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2d210 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2d220 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2d230 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2d240 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2d250 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2d260 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2d270 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2d280 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2d290 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2d2a0 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2d2b0 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2d2c0 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2d2d0 20 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72   C_VerifyRecover
2d2e0 49 6e 69 74 29 28 43 4b 5f 53 45 53 53 49 4f 4e  Init)(CK_SESSION
2d2f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2d300 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2d310 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2d320 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2d330 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2d340 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2d350 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2d360 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2d370 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2d380 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d390 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2d3a0 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2d3b0 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2d3c0 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d3d0 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2d3e0 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2d3f0 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2d400 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d410 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2d420 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d430 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2d440 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d450 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2d460 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d470 28 43 4b 5f 52 56 2c 20 43 5f 56 65 72 69 66 79  (CK_RV, C_Verify
2d480 52 65 63 6f 76 65 72 29 28 43 4b 5f 53 45 53 53  Recover)(CK_SESS
2d490 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2d4a0 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52  ion, CK_BYTE_PTR
2d4b0 20 70 53 69 67 6e 61 74 75 72 65 2c 20 43 4b 5f   pSignature, CK_
2d4c0 55 4c 4f 4e 47 20 75 6c 53 69 67 6e 61 74 75 72  ULONG ulSignatur
2d4d0 65 4c 65 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54  eLen, CK_BYTE_PT
2d4e0 52 20 70 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e  R pData, CK_ULON
2d4f0 47 5f 50 54 52 20 70 75 6c 44 61 74 61 4c 65 6e  G_PTR pulDataLen
2d500 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42 55  ) {..CACKEY_DEBU
2d510 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65 64  G_PRINTF("Called
2d520 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b  .");...if (!cack
2d530 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  ey_initialized) 
2d540 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55 47  {...CACKEY_DEBUG
2d550 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e 20  _PRINTF("Error. 
2d560 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   Not initialized
2d570 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43  .");....return(C
2d580 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f  KR_CRYPTOKI_NOT_
2d590 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d  INITIALIZED);..}
2d5a0 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f  ...CACKEY_DEBUG_
2d5b0 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69 6e  PRINTF("Returnin
2d5c0 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e  g CKR_FUNCTION_N
2d5d0 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25 69  OT_SUPPORTED (%i
2d5e0 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  )", CKR_FUNCTION
2d5f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d600 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46 55  ...return(CKR_FU
2d610 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2d620 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46  RTED);.}..CK_DEF
2d630 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f  INE_FUNCTION(CK_
2d640 52 56 2c 20 43 5f 44 69 67 65 73 74 45 6e 63 72  RV, C_DigestEncr
2d650 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f 53 45  yptUpdate)(CK_SE
2d660 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65  SSION_HANDLE hSe
2d670 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f 50  ssion, CK_BYTE_P
2d680 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  TR pPart, CK_ULO
2d690 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20 43 4b  NG ulPartLen, CK
2d6a0 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63 72 79  _BYTE_PTR pEncry
2d6b0 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55 4c 4f  ptedPart, CK_ULO
2d6c0 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72 79 70  NG_PTR pulEncryp
2d6d0 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a 09 43  tedPartLen) {..C
2d6e0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2d6f0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2d700 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2d710 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2d720 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2d730 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2d740 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2d750 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2d760 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2d770 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2d780 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2d790 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2d7a0 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2d7b0 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2d7c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d7d0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2d7e0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2d7f0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2d800 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2d810 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2d820 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
2d830 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  ate)(CK_SESSION_
2d840 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2d850 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e   CK_BYTE_PTR pEn
2d860 63 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f  cryptedPart, CK_
2d870 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70 74 65  ULONG ulEncrypte
2d880 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42 59 54  dPartLen, CK_BYT
2d890 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f  E_PTR pPart, CK_
2d8a0 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50 61 72  ULONG_PTR pulPar
2d8b0 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f  tLen) {..CACKEY_
2d8c0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2d8d0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2d8e0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2d8f0 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2d900 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2d910 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2d920 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2d930 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2d940 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2d950 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2d960 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2d970 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2d980 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2d990 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2d9a0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2d9b0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2d9c0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2d9d0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2d9e0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2d9f0 28 43 4b 5f 52 56 2c 20 43 5f 53 69 67 6e 45 6e  (CK_RV, C_SignEn
2da00 63 72 79 70 74 55 70 64 61 74 65 29 28 43 4b 5f  cryptUpdate)(CK_
2da10 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68  SESSION_HANDLE h
2da20 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45  Session, CK_BYTE
2da30 5f 50 54 52 20 70 50 61 72 74 2c 20 43 4b 5f 55  _PTR pPart, CK_U
2da40 4c 4f 4e 47 20 75 6c 50 61 72 74 4c 65 6e 2c 20  LONG ulPartLen, 
2da50 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 45 6e 63  CK_BYTE_PTR pEnc
2da60 72 79 70 74 65 64 50 61 72 74 2c 20 43 4b 5f 55  ryptedPart, CK_U
2da70 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 45 6e 63 72  LONG_PTR pulEncr
2da80 79 70 74 65 64 50 61 72 74 4c 65 6e 29 20 7b 0a  yptedPartLen) {.
2da90 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2daa0 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2dab0 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2dac0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2dad0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2dae0 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2daf0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2db00 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2db10 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2db20 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2db30 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2db40 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2db50 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2db60 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2db70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2db80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2db90 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2dba0 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2dbb0 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f  );.}..CK_DEFINE_
2dbc0 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20  FUNCTION(CK_RV, 
2dbd0 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
2dbe0 70 64 61 74 65 29 28 43 4b 5f 53 45 53 53 49 4f  pdate)(CK_SESSIO
2dbf0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2dc00 6e 2c 20 43 4b 5f 42 59 54 45 5f 50 54 52 20 70  n, CK_BYTE_PTR p
2dc10 45 6e 63 72 79 70 74 65 64 50 61 72 74 2c 20 43  EncryptedPart, C
2dc20 4b 5f 55 4c 4f 4e 47 20 75 6c 45 6e 63 72 79 70  K_ULONG ulEncryp
2dc30 74 65 64 50 61 72 74 4c 65 6e 2c 20 43 4b 5f 42  tedPartLen, CK_B
2dc40 59 54 45 5f 50 54 52 20 70 50 61 72 74 2c 20 43  YTE_PTR pPart, C
2dc50 4b 5f 55 4c 4f 4e 47 5f 50 54 52 20 70 75 6c 50  K_ULONG_PTR pulP
2dc60 61 72 74 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45  artLen) {..CACKE
2dc70 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22  Y_DEBUG_PRINTF("
2dc80 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20  Called.");...if 
2dc90 28 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c  (!cackey_initial
2dca0 69 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59  ized) {...CACKEY
2dcb0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2dcc0 72 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69  rror.  Not initi
2dcd0 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65  alized.");....re
2dce0 74 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b  turn(CKR_CRYPTOK
2dcf0 49 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45  I_NOT_INITIALIZE
2dd00 44 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f  D);..}...CACKEY_
2dd10 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65  DEBUG_PRINTF("Re
2dd20 74 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43  turning CKR_FUNC
2dd30 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2dd40 45 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55  ED (%i)", CKR_FU
2dd50 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f  NCTION_NOT_SUPPO
2dd60 52 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28  RTED);...return(
2dd70 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2dd80 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a  _SUPPORTED);.}..
2dd90 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2dda0 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 6e 65  ON(CK_RV, C_Gene
2ddb0 72 61 74 65 4b 65 79 29 28 43 4b 5f 53 45 53 53  rateKey)(CK_SESS
2ddc0 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73  ION_HANDLE hSess
2ddd0 69 6f 6e 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53  ion, CK_MECHANIS
2dde0 4d 5f 50 54 52 20 70 4d 65 63 68 61 6e 69 73 6d  M_PTR pMechanism
2ddf0 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f 50  , CK_ATTRIBUTE_P
2de00 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43 4b  TR pTemplate, CK
2de10 5f 55 4c 4f 4e 47 20 75 6c 43 6f 75 6e 74 2c 20  _ULONG ulCount, 
2de20 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2de30 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
2de40 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2de50 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2de60 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2de70 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2de80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2de90 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2dea0 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2deb0 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2dec0 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2ded0 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2dee0 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2def0 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2df00 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2df10 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2df20 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2df30 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2df40 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2df50 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2df60 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2df70 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2df80 47 65 6e 65 72 61 74 65 4b 65 79 50 61 69 72 29  GenerateKeyPair)
2df90 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44  (CK_SESSION_HAND
2dfa0 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f  LE hSession, CK_
2dfb0 4d 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d  MECHANISM_PTR pM
2dfc0 65 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 41 54 54  echanism, CK_ATT
2dfd0 52 49 42 55 54 45 5f 50 54 52 20 70 50 75 62 6c  RIBUTE_PTR pPubl
2dfe0 69 63 4b 65 79 54 65 6d 70 6c 61 74 65 2c 20 43  icKeyTemplate, C
2dff0 4b 5f 55 4c 4f 4e 47 20 75 6c 50 75 62 6c 69 63  K_ULONG ulPublic
2e000 4b 65 79 41 74 74 72 69 62 75 74 65 43 6f 75 6e  KeyAttributeCoun
2e010 74 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  t, CK_ATTRIBUTE_
2e020 50 54 52 20 70 50 72 69 76 61 74 65 4b 65 79 54  PTR pPrivateKeyT
2e030 65 6d 70 6c 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e  emplate, CK_ULON
2e040 47 20 75 6c 50 72 69 76 61 74 65 4b 65 79 41 74  G ulPrivateKeyAt
2e050 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20 43 4b  tributeCount, CK
2e060 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 5f 50  _OBJECT_HANDLE_P
2e070 54 52 20 70 68 50 75 62 6c 69 63 4b 65 79 2c 20  TR phPublicKey, 
2e080 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2e090 5f 50 54 52 20 70 68 50 72 69 76 61 74 65 4b 65  _PTR phPrivateKe
2e0a0 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  y) {..CACKEY_DEB
2e0b0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2e0c0 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21 63 61 63  d.");...if (!cac
2e0d0 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a 65 64 29  key_initialized)
2e0e0 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44 45 42 55   {...CACKEY_DEBU
2e0f0 47 5f 50 52 49 4e 54 46 28 22 45 72 72 6f 72 2e  G_PRINTF("Error.
2e100 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65    Not initialize
2e110 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75 72 6e 28  d.");....return(
2e120 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f 4e 4f 54  CKR_CRYPTOKI_NOT
2e130 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29 3b 0a 09  _INITIALIZED);..
2e140 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47  }...CACKEY_DEBUG
2e150 5f 50 52 49 4e 54 46 28 22 52 65 74 75 72 6e 69  _PRINTF("Returni
2e160 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f  ng CKR_FUNCTION_
2e170 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 20 28 25  NOT_SUPPORTED (%
2e180 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43 54 49 4f  i)", CKR_FUNCTIO
2e190 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29  N_NOT_SUPPORTED)
2e1a0 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52 5f 46  ;...return(CKR_F
2e1b0 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50  UNCTION_NOT_SUPP
2e1c0 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45  ORTED);.}..CK_DE
2e1d0 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2e1e0 5f 52 56 2c 20 43 5f 57 72 61 70 4b 65 79 29 28  _RV, C_WrapKey)(
2e1f0 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c  CK_SESSION_HANDL
2e200 45 20 68 53 65 73 73 69 6f 6e 2c 20 43 4b 5f 4d  E hSession, CK_M
2e210 45 43 48 41 4e 49 53 4d 5f 50 54 52 20 70 4d 65  ECHANISM_PTR pMe
2e220 63 68 61 6e 69 73 6d 2c 20 43 4b 5f 4f 42 4a 45  chanism, CK_OBJE
2e230 43 54 5f 48 41 4e 44 4c 45 20 68 57 72 61 70 70  CT_HANDLE hWrapp
2e240 69 6e 67 4b 65 79 2c 20 43 4b 5f 4f 42 4a 45 43  ingKey, CK_OBJEC
2e250 54 5f 48 41 4e 44 4c 45 20 68 4b 65 79 2c 20 43  T_HANDLE hKey, C
2e260 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61 70  K_BYTE_PTR pWrap
2e270 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e 47  pedKey, CK_ULONG
2e280 5f 50 54 52 20 70 75 6c 57 72 61 70 70 65 64 4b  _PTR pulWrappedK
2e290 65 79 4c 65 6e 29 20 7b 0a 09 43 41 43 4b 45 59  eyLen) {..CACKEY
2e2a0 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43  _DEBUG_PRINTF("C
2e2b0 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28  alled.");...if (
2e2c0 21 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69  !cackey_initiali
2e2d0 7a 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f  zed) {...CACKEY_
2e2e0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72  DEBUG_PRINTF("Er
2e2f0 72 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61  ror.  Not initia
2e300 6c 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74  lized.");....ret
2e310 75 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49  urn(CKR_CRYPTOKI
2e320 5f 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44  _NOT_INITIALIZED
2e330 29 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44  );..}...CACKEY_D
2e340 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2e350 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2e360 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e370 44 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e  D (%i)", CKR_FUN
2e380 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52  CTION_NOT_SUPPOR
2e390 54 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43  TED);...return(C
2e3a0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e3b0 53 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43  SUPPORTED);.}..C
2e3c0 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f  K_DEFINE_FUNCTIO
2e3d0 4e 28 43 4b 5f 52 56 2c 20 43 5f 55 6e 77 72 61  N(CK_RV, C_Unwra
2e3e0 70 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e  pKey)(CK_SESSION
2e3f0 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e  _HANDLE hSession
2e400 2c 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50  , CK_MECHANISM_P
2e410 54 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43  TR pMechanism, C
2e420 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20  K_OBJECT_HANDLE 
2e430 68 55 6e 77 72 61 70 70 69 6e 67 4b 65 79 2c 20  hUnwrappingKey, 
2e440 43 4b 5f 42 59 54 45 5f 50 54 52 20 70 57 72 61  CK_BYTE_PTR pWra
2e450 70 70 65 64 4b 65 79 2c 20 43 4b 5f 55 4c 4f 4e  ppedKey, CK_ULON
2e460 47 20 75 6c 57 72 61 70 70 65 64 4b 65 79 4c 65  G ulWrappedKeyLe
2e470 6e 2c 20 43 4b 5f 41 54 54 52 49 42 55 54 45 5f  n, CK_ATTRIBUTE_
2e480 50 54 52 20 70 54 65 6d 70 6c 61 74 65 2c 20 43  PTR pTemplate, C
2e490 4b 5f 55 4c 4f 4e 47 20 75 6c 41 74 74 72 69 62  K_ULONG ulAttrib
2e4a0 75 74 65 43 6f 75 6e 74 2c 20 43 4b 5f 4f 42 4a  uteCount, CK_OBJ
2e4b0 45 43 54 5f 48 41 4e 44 4c 45 5f 50 54 52 20 70  ECT_HANDLE_PTR p
2e4c0 68 4b 65 79 29 20 7b 0a 09 43 41 43 4b 45 59 5f  hKey) {..CACKEY_
2e4d0 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61  DEBUG_PRINTF("Ca
2e4e0 6c 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 21  lled.");...if (!
2e4f0 63 61 63 6b 65 79 5f 69 6e 69 74 69 61 6c 69 7a  cackey_initializ
2e500 65 64 29 20 7b 0a 09 09 43 41 43 4b 45 59 5f 44  ed) {...CACKEY_D
2e510 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45 72 72  EBUG_PRINTF("Err
2e520 6f 72 2e 20 20 4e 6f 74 20 69 6e 69 74 69 61 6c  or.  Not initial
2e530 69 7a 65 64 2e 22 29 3b 0a 0a 09 09 72 65 74 75  ized.");....retu
2e540 72 6e 28 43 4b 52 5f 43 52 59 50 54 4f 4b 49 5f  rn(CKR_CRYPTOKI_
2e550 4e 4f 54 5f 49 4e 49 54 49 41 4c 49 5a 45 44 29  NOT_INITIALIZED)
2e560 3b 0a 09 7d 0a 0a 09 43 41 43 4b 45 59 5f 44 45  ;..}...CACKEY_DE
2e570 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74 75  BUG_PRINTF("Retu
2e580 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54 49  rning CKR_FUNCTI
2e590 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2e5a0 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2e5b0 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54  TION_NOT_SUPPORT
2e5c0 45 44 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b  ED);...return(CK
2e5d0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e5e0 55 50 50 4f 52 54 45 44 29 3b 0a 7d 0a 0a 43 4b  UPPORTED);.}..CK
2e5f0 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e  _DEFINE_FUNCTION
2e600 28 43 4b 5f 52 56 2c 20 43 5f 44 65 72 69 76 65  (CK_RV, C_Derive
2e610 4b 65 79 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f  Key)(CK_SESSION_
2e620 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c  HANDLE hSession,
2e630 20 43 4b 5f 4d 45 43 48 41 4e 49 53 4d 5f 50 54   CK_MECHANISM_PT
2e640 52 20 70 4d 65 63 68 61 6e 69 73 6d 2c 20 43 4b  R pMechanism, CK
2e650 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45 20 68  _OBJECT_HANDLE h
2e660 42 61 73 65 4b 65 79 2c 20 43 4b 5f 41 54 54 52  BaseKey, CK_ATTR
2e670 49 42 55 54 45 5f 50 54 52 20 70 54 65 6d 70 6c  IBUTE_PTR pTempl
2e680 61 74 65 2c 20 43 4b 5f 55 4c 4f 4e 47 20 75 6c  ate, CK_ULONG ul
2e690 41 74 74 72 69 62 75 74 65 43 6f 75 6e 74 2c 20  AttributeCount, 
2e6a0 43 4b 5f 4f 42 4a 45 43 54 5f 48 41 4e 44 4c 45  CK_OBJECT_HANDLE
2e6b0 5f 50 54 52 20 70 68 4b 65 79 29 20 7b 0a 09 43  _PTR phKey) {..C
2e6c0 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2e6d0 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a  TF("Called.");..
2e6e0 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69 6e 69  .if (!cackey_ini
2e6f0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09 43 41  tialized) {...CA
2e700 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2e710 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74 20 69  F("Error.  Not i
2e720 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b 0a 0a  nitialized.");..
2e730 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43 52 59  ..return(CKR_CRY
2e740 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54 49 41  PTOKI_NOT_INITIA
2e750 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43 41 43  LIZED);..}...CAC
2e760 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54 46  KEY_DEBUG_PRINTF
2e770 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b 52 5f  ("Returning CKR_
2e780 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53 55 50  FUNCTION_NOT_SUP
2e790 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20 43 4b  PORTED (%i)", CK
2e7a0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2e7b0 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72 65 74  UPPORTED);...ret
2e7c0 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f 4e  urn(CKR_FUNCTION
2e7d0 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44 29 3b  _NOT_SUPPORTED);
2e7e0 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45 5f 46 55  .}..CK_DEFINE_FU
2e7f0 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f  NCTION(CK_RV, C_
2e800 53 65 65 64 52 61 6e 64 6f 6d 29 28 43 4b 5f 53  SeedRandom)(CK_S
2e810 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45 20 68 53  ESSION_HANDLE hS
2e820 65 73 73 69 6f 6e 2c 20 43 4b 5f 42 59 54 45 5f  ession, CK_BYTE_
2e830 50 54 52 20 70 53 65 65 64 2c 20 43 4b 5f 55 4c  PTR pSeed, CK_UL
2e840 4f 4e 47 20 75 6c 53 65 65 64 4c 65 6e 29 20 7b  ONG ulSeedLen) {
2e850 0a 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50  ..CACKEY_DEBUG_P
2e860 52 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29  RINTF("Called.")
2e870 3b 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f  ;...if (!cackey_
2e880 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
2e890 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2e8a0 49 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f  INTF("Error.  No
2e8b0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29  t initialized.")
2e8c0 3b 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f  ;....return(CKR_
2e8d0 43 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49  CRYPTOKI_NOT_INI
2e8e0 54 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09  TIALIZED);..}...
2e8f0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2e900 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2e910 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2e920 53 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c  SUPPORTED (%i)",
2e930 20 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f   CKR_FUNCTION_NO
2e940 54 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09  T_SUPPORTED);...
2e950 72 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54  return(CKR_FUNCT
2e960 49 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45  ION_NOT_SUPPORTE
2e970 44 29 3b 0a 7d 0a 0a 43 4b 5f 44 45 46 49 4e 45  D);.}..CK_DEFINE
2e980 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52 56 2c  _FUNCTION(CK_RV,
2e990 20 43 5f 47 65 6e 65 72 61 74 65 52 61 6e 64 6f   C_GenerateRando
2e9a0 6d 29 28 43 4b 5f 53 45 53 53 49 4f 4e 5f 48 41  m)(CK_SESSION_HA
2e9b0 4e 44 4c 45 20 68 53 65 73 73 69 6f 6e 2c 20 43  NDLE hSession, C
2e9c0 4b 5f 42 59 54 45 5f 50 54 52 20 70 52 61 6e 64  K_BYTE_PTR pRand
2e9d0 6f 6d 44 61 74 61 2c 20 43 4b 5f 55 4c 4f 4e 47  omData, CK_ULONG
2e9e0 20 75 6c 52 61 6e 64 6f 6d 4c 65 6e 29 20 7b 0a   ulRandomLen) {.
2e9f0 09 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52  .CACKEY_DEBUG_PR
2ea00 49 4e 54 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b  INTF("Called.");
2ea10 0a 0a 09 69 66 20 28 21 63 61 63 6b 65 79 5f 69  ...if (!cackey_i
2ea20 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 09  nitialized) {...
2ea30 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ea40 4e 54 46 28 22 45 72 72 6f 72 2e 20 20 4e 6f 74  NTF("Error.  Not
2ea50 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 22 29 3b   initialized.");
2ea60 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 43  ....return(CKR_C
2ea70 52 59 50 54 4f 4b 49 5f 4e 4f 54 5f 49 4e 49 54  RYPTOKI_NOT_INIT
2ea80 49 41 4c 49 5a 45 44 29 3b 0a 09 7d 0a 0a 09 43  IALIZED);..}...C
2ea90 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e  ACKEY_DEBUG_PRIN
2eaa0 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43 4b  TF("Returning CK
2eab0 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 53  R_FUNCTION_NOT_S
2eac0 55 50 50 4f 52 54 45 44 20 28 25 69 29 22 2c 20  UPPORTED (%i)", 
2ead0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2eae0 5f 53 55 50 50 4f 52 54 45 44 29 3b 0a 0a 09 72  _SUPPORTED);...r
2eaf0 65 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49  eturn(CKR_FUNCTI
2eb00 4f 4e 5f 4e 4f 54 5f 53 55 50 50 4f 52 54 45 44  ON_NOT_SUPPORTED
2eb10 29 3b 0a 7d 0a 0a 2f 2a 20 44 65 70 72 65 63 61  );.}../* Depreca
2eb20 74 65 64 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ted Function */.
2eb30 43 4b 5f 44 45 46 49 4e 45 5f 46 55 4e 43 54 49  CK_DEFINE_FUNCTI
2eb40 4f 4e 28 43 4b 5f 52 56 2c 20 43 5f 47 65 74 46  ON(CK_RV, C_GetF
2eb50 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 29 28 43  unctionStatus)(C
2eb60 4b 5f 53 45 53 53 49 4f 4e 5f 48 41 4e 44 4c 45  K_SESSION_HANDLE
2eb70 20 68 53 65 73 73 69 6f 6e 29 20 7b 0a 09 43 41   hSession) {..CA
2eb80 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49 4e 54  CKEY_DEBUG_PRINT
2eb90 46 28 22 43 61 6c 6c 65 64 2e 22 29 3b 0a 0a 09  F("Called.");...
2eba0 43 41 43 4b 45 59 5f 44 45 42 55 47 5f 50 52 49  CACKEY_DEBUG_PRI
2ebb0 4e 54 46 28 22 52 65 74 75 72 6e 69 6e 67 20 43  NTF("Returning C
2ebc0 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f  KR_FUNCTION_NOT_
2ebd0 50 41 52 41 4c 4c 45 4c 20 28 25 69 29 22 2c 20  PARALLEL (%i)", 
2ebe0 43 4b 52 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54  CKR_FUNCTION_NOT
2ebf0 5f 50 41 52 41 4c 4c 45 4c 29 3b 0a 0a 09 72 65  _PARALLEL);...re
2ec00 74 75 72 6e 28 43 4b 52 5f 46 55 4e 43 54 49 4f  turn(CKR_FUNCTIO
2ec10 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c 29 3b  N_NOT_PARALLEL);
2ec20 0a 0a 09 68 53 65 73 73 69 6f 6e 20 3d 20 68 53  ...hSession = hS
2ec30 65 73 73 69 6f 6e 3b 20 2f 2a 20 53 75 70 72 65  ession; /* Supre
2ec40 73 73 20 75 6e 75 73 65 64 20 76 61 72 69 61 62  ss unused variab
2ec50 6c 65 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 7d 0a  le warning */.}.
2ec60 0a 2f 2a 20 44 65 70 72 65 63 61 74 65 64 20 46  ./* Deprecated F
2ec70 75 6e 63 74 69 6f 6e 20 2a 2f 0a 43 4b 5f 44 45  unction */.CK_DE
2ec80 46 49 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b  FINE_FUNCTION(CK
2ec90 5f 52 56 2c 20 43 5f 43 61 6e 63 65 6c 46 75 6e  _RV, C_CancelFun
2eca0 63 74 69 6f 6e 29 28 43 4b 5f 53 45 53 53 49 4f  ction)(CK_SESSIO
2ecb0 4e 5f 48 41 4e 44 4c 45 20 68 53 65 73 73 69 6f  N_HANDLE hSessio
2ecc0 6e 29 20 7b 0a 09 43 41 43 4b 45 59 5f 44 45 42  n) {..CACKEY_DEB
2ecd0 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c 6c 65  UG_PRINTF("Calle
2ece0 64 2e 22 29 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  d.");...CACKEY_D
2ecf0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2ed00 75 72 6e 69 6e 67 20 43 4b 52 5f 46 55 4e 43 54  urning CKR_FUNCT
2ed10 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45 4c  ION_NOT_PARALLEL
2ed20 20 28 25 69 29 22 2c 20 43 4b 52 5f 46 55 4e 43   (%i)", CKR_FUNC
2ed30 54 49 4f 4e 5f 4e 4f 54 5f 50 41 52 41 4c 4c 45  TION_NOT_PARALLE
2ed40 4c 29 3b 0a 0a 09 72 65 74 75 72 6e 28 43 4b 52  L);...return(CKR
2ed50 5f 46 55 4e 43 54 49 4f 4e 5f 4e 4f 54 5f 50 41  _FUNCTION_NOT_PA
2ed60 52 41 4c 4c 45 4c 29 3b 0a 0a 09 68 53 65 73 73  RALLEL);...hSess
2ed70 69 6f 6e 20 3d 20 68 53 65 73 73 69 6f 6e 3b 20  ion = hSession; 
2ed80 2f 2a 20 53 75 70 72 65 73 73 20 75 6e 75 73 65  /* Supress unuse
2ed90 64 20 76 61 72 69 61 62 6c 65 20 77 61 72 6e 69  d variable warni
2eda0 6e 67 20 2a 2f 0a 7d 0a 0a 43 4b 5f 44 45 46 49  ng */.}..CK_DEFI
2edb0 4e 45 5f 46 55 4e 43 54 49 4f 4e 28 43 4b 5f 52  NE_FUNCTION(CK_R
2edc0 56 2c 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e  V, C_GetFunction
2edd0 4c 69 73 74 29 28 43 4b 5f 46 55 4e 43 54 49 4f  List)(CK_FUNCTIO
2ede0 4e 5f 4c 49 53 54 5f 50 54 52 5f 50 54 52 20 70  N_LIST_PTR_PTR p
2edf0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 29 20 7b  pFunctionList) {
2ee00 0a 09 43 4b 5f 46 55 4e 43 54 49 4f 4e 5f 4c 49  ..CK_FUNCTION_LI
2ee10 53 54 5f 50 54 52 20 70 46 75 6e 63 74 69 6f 6e  ST_PTR pFunction
2ee20 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  List;...CACKEY_D
2ee30 45 42 55 47 5f 50 52 49 4e 54 46 28 22 43 61 6c  EBUG_PRINTF("Cal
2ee40 6c 65 64 2e 22 29 3b 0a 0a 09 69 66 20 28 70 70  led.");...if (pp
2ee50 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 3d 20  FunctionList == 
2ee60 4e 55 4c 4c 29 20 7b 0a 09 09 43 41 43 4b 45 59  NULL) {...CACKEY
2ee70 5f 44 45 42 55 47 5f 50 52 49 4e 54 46 28 22 45  _DEBUG_PRINTF("E
2ee80 72 72 6f 72 2e 20 70 70 46 75 6e 63 74 69 6f 6e  rror. ppFunction
2ee90 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2e 22 29 3b  List is NULL.");
2eea0 0a 0a 09 09 72 65 74 75 72 6e 28 43 4b 52 5f 41  ....return(CKR_A
2eeb0 52 47 55 4d 45 4e 54 53 5f 42 41 44 29 3b 0a 09  RGUMENTS_BAD);..
2eec0 7d 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  }...pFunctionLis
2eed0 74 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  t = malloc(sizeo
2eee0 66 28 2a 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  f(*pFunctionList
2eef0 29 29 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ));...pFunctionL
2ef00 69 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 61 6a  ist->version.maj
2ef10 6f 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52  or = ((CACKEY_CR
2ef20 59 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43  YPTOKI_VERSION_C
2ef30 4f 44 45 29 20 3e 3e 20 31 36 29 20 26 20 30 78  ODE) >> 16) & 0x
2ef40 66 66 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ff;..pFunctionLi
2ef50 73 74 2d 3e 76 65 72 73 69 6f 6e 2e 6d 69 6e 6f  st->version.mino
2ef60 72 20 3d 20 28 28 43 41 43 4b 45 59 5f 43 52 59  r = ((CACKEY_CRY
2ef70 50 54 4f 4b 49 5f 56 45 52 53 49 4f 4e 5f 43 4f  PTOKI_VERSION_CO
2ef80 44 45 29 20 3e 3e 20 38 29 20 26 20 30 78 66 66  DE) >> 8) & 0xff
2ef90 3b 0a 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73  ;...pFunctionLis
2efa0 74 2d 3e 43 5f 49 6e 69 74 69 61 6c 69 7a 65 20  t->C_Initialize 
2efb0 3d 20 43 5f 49 6e 69 74 69 61 6c 69 7a 65 3b 0a  = C_Initialize;.
2efc0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2efd0 43 5f 46 69 6e 61 6c 69 7a 65 20 3d 20 43 5f 46  C_Finalize = C_F
2efe0 69 6e 61 6c 69 7a 65 3b 0a 09 70 46 75 6e 63 74  inalize;..pFunct
2eff0 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 49 6e  ionList->C_GetIn
2f000 66 6f 20 3d 20 43 5f 47 65 74 49 6e 66 6f 3b 0a  fo = C_GetInfo;.
2f010 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f020 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 20 3d 20  C_GetSlotList = 
2f030 43 5f 47 65 74 53 6c 6f 74 4c 69 73 74 3b 0a 09  C_GetSlotList;..
2f040 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f050 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 20 3d 20 43  _GetSlotInfo = C
2f060 5f 47 65 74 53 6c 6f 74 49 6e 66 6f 3b 0a 09 70  _GetSlotInfo;..p
2f070 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f080 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 20 3d 20 43  GetTokenInfo = C
2f090 5f 47 65 74 54 6f 6b 65 6e 49 6e 66 6f 3b 0a 09  _GetTokenInfo;..
2f0a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f0b0 5f 57 61 69 74 46 6f 72 53 6c 6f 74 45 76 65 6e  _WaitForSlotEven
2f0c0 74 20 3d 20 43 5f 57 61 69 74 46 6f 72 53 6c 6f  t = C_WaitForSlo
2f0d0 74 45 76 65 6e 74 3b 0a 09 70 46 75 6e 63 74 69  tEvent;..pFuncti
2f0e0 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 4d 65 63  onList->C_GetMec
2f0f0 68 61 6e 69 73 6d 4c 69 73 74 20 3d 20 43 5f 47  hanismList = C_G
2f100 65 74 4d 65 63 68 61 6e 69 73 6d 4c 69 73 74 3b  etMechanismList;
2f110 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f120 3e 43 5f 47 65 74 4d 65 63 68 61 6e 69 73 6d 49  >C_GetMechanismI
2f130 6e 66 6f 20 3d 20 43 5f 47 65 74 4d 65 63 68 61  nfo = C_GetMecha
2f140 6e 69 73 6d 49 6e 66 6f 3b 0a 09 70 46 75 6e 63  nismInfo;..pFunc
2f150 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 49 6e 69 74  tionList->C_Init
2f160 54 6f 6b 65 6e 20 3d 20 43 5f 49 6e 69 74 54 6f  Token = C_InitTo
2f170 6b 65 6e 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ken;..pFunctionL
2f180 69 73 74 2d 3e 43 5f 49 6e 69 74 50 49 4e 20 3d  ist->C_InitPIN =
2f190 20 43 5f 49 6e 69 74 50 49 4e 3b 0a 09 70 46 75   C_InitPIN;..pFu
2f1a0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
2f1b0 74 50 49 4e 20 3d 20 43 5f 53 65 74 50 49 4e 3b  tPIN = C_SetPIN;
2f1c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f1d0 3e 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 20 3d  >C_OpenSession =
2f1e0 20 43 5f 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a   C_OpenSession;.
2f1f0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f200 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 20 3d  C_CloseSession =
2f210 20 43 5f 43 6c 6f 73 65 53 65 73 73 69 6f 6e 3b   C_CloseSession;
2f220 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f230 3e 43 5f 43 6c 6f 73 65 41 6c 6c 53 65 73 73 69  >C_CloseAllSessi
2f240 6f 6e 73 20 3d 20 43 5f 43 6c 6f 73 65 41 6c 6c  ons = C_CloseAll
2f250 53 65 73 73 69 6f 6e 73 3b 0a 09 70 46 75 6e 63  Sessions;..pFunc
2f260 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65 74 53  tionList->C_GetS
2f270 65 73 73 69 6f 6e 49 6e 66 6f 20 3d 20 43 5f 47  essionInfo = C_G
2f280 65 74 53 65 73 73 69 6f 6e 49 6e 66 6f 3b 0a 09  etSessionInfo;..
2f290 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f2a0 5f 47 65 74 4f 70 65 72 61 74 69 6f 6e 53 74 61  _GetOperationSta
2f2b0 74 65 20 3d 20 43 5f 47 65 74 4f 70 65 72 61 74  te = C_GetOperat
2f2c0 69 6f 6e 53 74 61 74 65 3b 0a 09 70 46 75 6e 63  ionState;..pFunc
2f2d0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 74 4f  tionList->C_SetO
2f2e0 70 65 72 61 74 69 6f 6e 53 74 61 74 65 20 3d 20  perationState = 
2f2f0 43 5f 53 65 74 4f 70 65 72 61 74 69 6f 6e 53 74  C_SetOperationSt
2f300 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  ate;..pFunctionL
2f310 69 73 74 2d 3e 43 5f 4c 6f 67 69 6e 20 3d 20 43  ist->C_Login = C
2f320 5f 4c 6f 67 69 6e 3b 0a 09 70 46 75 6e 63 74 69  _Login;..pFuncti
2f330 6f 6e 4c 69 73 74 2d 3e 43 5f 4c 6f 67 6f 75 74  onList->C_Logout
2f340 20 3d 20 43 5f 4c 6f 67 6f 75 74 3b 0a 09 70 46   = C_Logout;..pF
2f350 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 43  unctionList->C_C
2f360 72 65 61 74 65 4f 62 6a 65 63 74 20 3d 20 43 5f  reateObject = C_
2f370 43 72 65 61 74 65 4f 62 6a 65 63 74 3b 0a 09 70  CreateObject;..p
2f380 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f390 43 6f 70 79 4f 62 6a 65 63 74 20 3d 20 43 5f 43  CopyObject = C_C
2f3a0 6f 70 79 4f 62 6a 65 63 74 3b 0a 09 70 46 75 6e  opyObject;..pFun
2f3b0 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 73  ctionList->C_Des
2f3c0 74 72 6f 79 4f 62 6a 65 63 74 20 3d 20 43 5f 44  troyObject = C_D
2f3d0 65 73 74 72 6f 79 4f 62 6a 65 63 74 3b 0a 09 70  estroyObject;..p
2f3e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f3f0 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 20 3d 20  GetObjectSize = 
2f400 43 5f 47 65 74 4f 62 6a 65 63 74 53 69 7a 65 3b  C_GetObjectSize;
2f410 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f420 3e 43 5f 47 65 74 41 74 74 72 69 62 75 74 65 56  >C_GetAttributeV
2f430 61 6c 75 65 20 3d 20 43 5f 47 65 74 41 74 74 72  alue = C_GetAttr
2f440 69 62 75 74 65 56 61 6c 75 65 3b 0a 09 70 46 75  ibuteValue;..pFu
2f450 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65  nctionList->C_Se
2f460 74 41 74 74 72 69 62 75 74 65 56 61 6c 75 65 20  tAttributeValue 
2f470 3d 20 43 5f 53 65 74 41 74 74 72 69 62 75 74 65  = C_SetAttribute
2f480 56 61 6c 75 65 3b 0a 09 70 46 75 6e 63 74 69 6f  Value;..pFunctio
2f490 6e 4c 69 73 74 2d 3e 43 5f 46 69 6e 64 4f 62 6a  nList->C_FindObj
2f4a0 65 63 74 73 49 6e 69 74 20 3d 20 43 5f 46 69 6e  ectsInit = C_Fin
2f4b0 64 4f 62 6a 65 63 74 73 49 6e 69 74 3b 0a 09 70  dObjectsInit;..p
2f4c0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f4d0 46 69 6e 64 4f 62 6a 65 63 74 73 20 3d 20 43 5f  FindObjects = C_
2f4e0 46 69 6e 64 4f 62 6a 65 63 74 73 3b 0a 09 70 46  FindObjects;..pF
2f4f0 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 46  unctionList->C_F
2f500 69 6e 64 4f 62 6a 65 63 74 73 46 69 6e 61 6c 20  indObjectsFinal 
2f510 3d 20 43 5f 46 69 6e 64 4f 62 6a 65 63 74 73 46  = C_FindObjectsF
2f520 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  inal;..pFunction
2f530 4c 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 49  List->C_EncryptI
2f540 6e 69 74 20 3d 20 43 5f 45 6e 63 72 79 70 74 49  nit = C_EncryptI
2f550 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c  nit;..pFunctionL
2f560 69 73 74 2d 3e 43 5f 45 6e 63 72 79 70 74 20 3d  ist->C_Encrypt =
2f570 20 43 5f 45 6e 63 72 79 70 74 3b 0a 09 70 46 75   C_Encrypt;..pFu
2f580 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 45 6e  nctionList->C_En
2f590 63 72 79 70 74 55 70 64 61 74 65 20 3d 20 43 5f  cryptUpdate = C_
2f5a0 45 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09  EncryptUpdate;..
2f5b0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f5c0 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 20 3d 20  _EncryptFinal = 
2f5d0 43 5f 45 6e 63 72 79 70 74 46 69 6e 61 6c 3b 0a  C_EncryptFinal;.
2f5e0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f5f0 43 5f 44 65 63 72 79 70 74 49 6e 69 74 20 3d 20  C_DecryptInit = 
2f600 43 5f 44 65 63 72 79 70 74 49 6e 69 74 3b 0a 09  C_DecryptInit;..
2f610 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f620 5f 44 65 63 72 79 70 74 20 3d 20 43 5f 44 65 63  _Decrypt = C_Dec
2f630 72 79 70 74 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  rypt;..pFunction
2f640 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70 74 55  List->C_DecryptU
2f650 70 64 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70  pdate = C_Decryp
2f660 74 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74  tUpdate;..pFunct
2f670 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79  ionList->C_Decry
2f680 70 74 46 69 6e 61 6c 20 3d 20 43 5f 44 65 63 72  ptFinal = C_Decr
2f690 79 70 74 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63  yptFinal;..pFunc
2f6a0 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65  tionList->C_Dige
2f6b0 73 74 49 6e 69 74 20 3d 20 43 5f 44 69 67 65 73  stInit = C_Diges
2f6c0 74 49 6e 69 74 3b 0a 09 70 46 75 6e 63 74 69 6f  tInit;..pFunctio
2f6d0 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74 20  nList->C_Digest 
2f6e0 3d 20 43 5f 44 69 67 65 73 74 3b 0a 09 70 46 75  = C_Digest;..pFu
2f6f0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69  nctionList->C_Di
2f700 67 65 73 74 55 70 64 61 74 65 20 3d 20 43 5f 44  gestUpdate = C_D
2f710 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46  igestUpdate;..pF
2f720 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 44  unctionList->C_D
2f730 69 67 65 73 74 4b 65 79 20 3d 20 43 5f 44 69 67  igestKey = C_Dig
2f740 65 73 74 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69  estKey;..pFuncti
2f750 6f 6e 4c 69 73 74 2d 3e 43 5f 44 69 67 65 73 74  onList->C_Digest
2f760 46 69 6e 61 6c 20 3d 20 43 5f 44 69 67 65 73 74  Final = C_Digest
2f770 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74 69 6f  Final;..pFunctio
2f780 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 49 6e 69  nList->C_SignIni
2f790 74 20 3d 20 43 5f 53 69 67 6e 49 6e 69 74 3b 0a  t = C_SignInit;.
2f7a0 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f7b0 43 5f 53 69 67 6e 20 3d 20 43 5f 53 69 67 6e 3b  C_Sign = C_Sign;
2f7c0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f7d0 3e 43 5f 53 69 67 6e 55 70 64 61 74 65 20 3d 20  >C_SignUpdate = 
2f7e0 43 5f 53 69 67 6e 55 70 64 61 74 65 3b 0a 09 70  C_SignUpdate;..p
2f7f0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f800 53 69 67 6e 46 69 6e 61 6c 20 3d 20 43 5f 53 69  SignFinal = C_Si
2f810 67 6e 46 69 6e 61 6c 3b 0a 09 70 46 75 6e 63 74  gnFinal;..pFunct
2f820 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 69 67 6e 52  ionList->C_SignR
2f830 65 63 6f 76 65 72 49 6e 69 74 20 3d 20 43 5f 53  ecoverInit = C_S
2f840 69 67 6e 52 65 63 6f 76 65 72 49 6e 69 74 3b 0a  ignRecoverInit;.
2f850 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e  .pFunctionList->
2f860 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 20 3d 20  C_SignRecover = 
2f870 43 5f 53 69 67 6e 52 65 63 6f 76 65 72 3b 0a 09  C_SignRecover;..
2f880 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f890 5f 56 65 72 69 66 79 49 6e 69 74 20 3d 20 43 5f  _VerifyInit = C_
2f8a0 56 65 72 69 66 79 49 6e 69 74 3b 0a 09 70 46 75  VerifyInit;..pFu
2f8b0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
2f8c0 72 69 66 79 20 3d 20 43 5f 56 65 72 69 66 79 3b  rify = C_Verify;
2f8d0 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f8e0 3e 43 5f 56 65 72 69 66 79 55 70 64 61 74 65 20  >C_VerifyUpdate 
2f8f0 3d 20 43 5f 56 65 72 69 66 79 55 70 64 61 74 65  = C_VerifyUpdate
2f900 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74  ;..pFunctionList
2f910 2d 3e 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 20  ->C_VerifyFinal 
2f920 3d 20 43 5f 56 65 72 69 66 79 46 69 6e 61 6c 3b  = C_VerifyFinal;
2f930 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d  ..pFunctionList-
2f940 3e 43 5f 56 65 72 69 66 79 52 65 63 6f 76 65 72  >C_VerifyRecover
2f950 49 6e 69 74 20 3d 20 43 5f 56 65 72 69 66 79 52  Init = C_VerifyR
2f960 65 63 6f 76 65 72 49 6e 69 74 3b 0a 09 70 46 75  ecoverInit;..pFu
2f970 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 56 65  nctionList->C_Ve
2f980 72 69 66 79 52 65 63 6f 76 65 72 20 3d 20 43 5f  rifyRecover = C_
2f990 56 65 72 69 66 79 52 65 63 6f 76 65 72 3b 0a 09  VerifyRecover;..
2f9a0 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2f9b0 5f 44 69 67 65 73 74 45 6e 63 72 79 70 74 55 70  _DigestEncryptUp
2f9c0 64 61 74 65 20 3d 20 43 5f 44 69 67 65 73 74 45  date = C_DigestE
2f9d0 6e 63 72 79 70 74 55 70 64 61 74 65 3b 0a 09 70  ncryptUpdate;..p
2f9e0 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f  FunctionList->C_
2f9f0 44 65 63 72 79 70 74 44 69 67 65 73 74 55 70 64  DecryptDigestUpd
2fa00 61 74 65 20 3d 20 43 5f 44 65 63 72 79 70 74 44  ate = C_DecryptD
2fa10 69 67 65 73 74 55 70 64 61 74 65 3b 0a 09 70 46  igestUpdate;..pF
2fa20 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53  unctionList->C_S
2fa30 69 67 6e 45 6e 63 72 79 70 74 55 70 64 61 74 65  ignEncryptUpdate
2fa40 20 3d 20 43 5f 53 69 67 6e 45 6e 63 72 79 70 74   = C_SignEncrypt
2fa50 55 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69  Update;..pFuncti
2fa60 6f 6e 4c 69 73 74 2d 3e 43 5f 44 65 63 72 79 70  onList->C_Decryp
2fa70 74 56 65 72 69 66 79 55 70 64 61 74 65 20 3d 20  tVerifyUpdate = 
2fa80 43 5f 44 65 63 72 79 70 74 56 65 72 69 66 79 55  C_DecryptVerifyU
2fa90 70 64 61 74 65 3b 0a 09 70 46 75 6e 63 74 69 6f  pdate;..pFunctio
2faa0 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74  nList->C_Generat
2fab0 65 4b 65 79 20 3d 20 43 5f 47 65 6e 65 72 61 74  eKey = C_Generat
2fac0 65 4b 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e  eKey;..pFunction
2fad0 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74 65  List->C_Generate
2fae0 4b 65 79 50 61 69 72 20 3d 20 43 5f 47 65 6e 65  KeyPair = C_Gene
2faf0 72 61 74 65 4b 65 79 50 61 69 72 3b 0a 09 70 46  rateKeyPair;..pF
2fb00 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 57  unctionList->C_W
2fb10 72 61 70 4b 65 79 20 3d 20 43 5f 57 72 61 70 4b  rapKey = C_WrapK
2fb20 65 79 3b 0a 09 70 46 75 6e 63 74 69 6f 6e 4c 69  ey;..pFunctionLi
2fb30 73 74 2d 3e 43 5f 55 6e 77 72 61 70 4b 65 79 20  st->C_UnwrapKey 
2fb40 3d 20 43 5f 55 6e 77 72 61 70 4b 65 79 3b 0a 09  = C_UnwrapKey;..
2fb50 70 46 75 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43  pFunctionList->C
2fb60 5f 44 65 72 69 76 65 4b 65 79 20 3d 20 43 5f 44  _DeriveKey = C_D
2fb70 65 72 69 76 65 4b 65 79 3b 0a 09 70 46 75 6e 63  eriveKey;..pFunc
2fb80 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 53 65 65 64  tionList->C_Seed
2fb90 52 61 6e 64 6f 6d 20 3d 20 43 5f 53 65 65 64 52  Random = C_SeedR
2fba0 61 6e 64 6f 6d 3b 0a 09 70 46 75 6e 63 74 69 6f  andom;..pFunctio
2fbb0 6e 4c 69 73 74 2d 3e 43 5f 47 65 6e 65 72 61 74  nList->C_Generat
2fbc0 65 52 61 6e 64 6f 6d 20 3d 20 43 5f 47 65 6e 65  eRandom = C_Gene
2fbd0 72 61 74 65 52 61 6e 64 6f 6d 3b 0a 09 70 46 75  rateRandom;..pFu
2fbe0 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2fbf0 74 46 75 6e 63 74 69 6f 6e 53 74 61 74 75 73 20  tFunctionStatus 
2fc00 3d 20 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 53  = C_GetFunctionS
2fc10 74 61 74 75 73 3b 0a 09 70 46 75 6e 63 74 69 6f  tatus;..pFunctio
2fc20 6e 4c 69 73 74 2d 3e 43 5f 43 61 6e 63 65 6c 46  nList->C_CancelF
2fc30 75 6e 63 74 69 6f 6e 20 3d 20 43 5f 43 61 6e 63  unction = C_Canc
2fc40 65 6c 46 75 6e 63 74 69 6f 6e 3b 0a 09 70 46 75  elFunction;..pFu
2fc50 6e 63 74 69 6f 6e 4c 69 73 74 2d 3e 43 5f 47 65  nctionList->C_Ge
2fc60 74 46 75 6e 63 74 69 6f 6e 4c 69 73 74 20 3d 20  tFunctionList = 
2fc70 43 5f 47 65 74 46 75 6e 63 74 69 6f 6e 4c 69 73  C_GetFunctionLis
2fc80 74 3b 0a 0a 09 2a 70 70 46 75 6e 63 74 69 6f 6e  t;...*ppFunction
2fc90 4c 69 73 74 20 3d 20 70 46 75 6e 63 74 69 6f 6e  List = pFunction
2fca0 4c 69 73 74 3b 0a 0a 09 43 41 43 4b 45 59 5f 44  List;...CACKEY_D
2fcb0 45 42 55 47 5f 50 52 49 4e 54 46 28 22 52 65 74  EBUG_PRINTF("Ret
2fcc0 75 72 6e 69 6e 67 20 43 4b 52 5f 4f 4b 20 28 25  urning CKR_OK (%
2fcd0 69 29 22 2c 20 43 4b 52 5f 4f 4b 29 3b 0a 0a 09  i)", CKR_OK);...
2fce0 72 65 74 75 72 6e 28 43 4b 52 5f 4f 4b 29 3b 0a  return(CKR_OK);.
2fcf0 7d 0a 0a                                         }..